從入門到入土 大數據學習(4) 最簡單windows下idea運行調試spark程序

從入門到入土 大數據學習(4)windows下idea運行spark程序

環境搭建windows環境搭建之後,不可避免的需要在windows上進行開發,但是這種跨平臺的開發本身就給開發者帶來一定的難度。如果條件允許(指電腦內存足夠大,且今後開發服務器上也會有LINUX圖形化界面的情況),個人還是建議使用圖形化界面,在windows上開發,筆者真的搗鼓了很久。

網上常見的windows上連接spark開發是使用idea本身自帶遠程,打開5005端口進行調試,還是比較複雜的,有興趣的可以百度。

這裏介紹一種自己搗鼓的方法,前提要求:

  1. 主機和虛擬機已經能互相訪問(筆者使用了NAT,將主機映射到一個ip)
  2. spark環境已經完成搭建,且能正常運行

導入類庫

因爲windows上沒有相關類庫,所以要導入相關類庫,筆者將之前下載在linux上還未解壓的hadoop、spark壓縮包都複製到了主機上,並且解壓。

  1. 打開idea,File-Project Structure
    在這裏插入圖片描述
  2. 選擇libraries,並選擇加號,JAVA
    在這裏插入圖片描述
  3. 選擇相關類庫
    其中hadoop的庫,在hadoop解壓目錄下share-hadoop下的所有文件夾和share-hadoop-common-lib

    spark的類庫在spark目錄下jars目錄下
    只要選擇以上的目錄添加即可。

設置輸出級別

在此後的實驗裏面會看到一大堆INFO,從而找不到輸出,這不是我們希望的,所以將spark/conf目錄下log4j.properties.template複製到src-main-scala-temp-resources目錄下,並更名爲log4j.properties,打開修改第19行

log4j.rootCategory=INFO, console

log4j.rootCategory=WARN, console

本地運行

很令人驚奇,spark居然能在windows上運行,不過想想也正常,spark開發語言是scala,裏面調用了大量的java庫 運行在jvm上,想來也有很好的跨平臺性。

到這一步已經能夠在windows上進行單機調試了,不涉及虛擬機裏面的集羣,筆者在src-main-scala-temp下建立了hello.scala

package temp
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf

object hello {
    def main(args:Array[String]): Unit ={
        val conf = new SparkConf().setAppName("app")
          .setMaster("local")
        val sc = new SparkContext(conf)
        sc.parallelize(Array(1,2,3,4)).foreach(println)
    }

}

其中setMaster可以設置爲local[N],N爲線程數,默認爲1

那麼本地的spark單機就已經能運行了

如果只做到這一步,這樣可以在windows上先調試好再打包成jar放到虛擬機裏面運行。適合單機測試。

集羣運行

本質上還是使用jar進行打包上傳,所以要先設置導出jar的設置
打開File-Project Structure,選擇Artifacts,加號jar,
From modules with dependencies……
選擇項目,選擇主類,選擇copy to the output directory and link via manifest

在這裏插入圖片描述確認後 界面上會出現在這裏插入圖片描述
經過測試,還需要再列表中找到你導出的jar包
在這裏插入圖片描述點開後還會有一個別的東西,我這裏是叫httpd,移除。如果不移除,輸出的jar包裏面會有一個Tomcat,憑空佔好幾十M,所以這裏選擇移除,我的圖上已經移除了,所以看不到。

在調整你需要的路徑,就可以保存了。

這樣每一次編譯都會更新你輸出目錄下的jar包。

之後輸入代碼

package temp
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf

object hello {
    def main(args:Array[String]): Unit ={
        val conf = new SparkConf().setAppName("app")
          .setMaster("spark://master:7077")
          .set("spark.driver.host","192.168.222.3")
          .setJars(Array("out/artifacts/spark_jar/spark.jar"))

        val sc = new SparkContext(conf)
        sc.parallelize(Array(1,2,3,4)).foreach(println)
    }

}

此處 setMaster變爲spark集羣的地址,一般默認都是7077,具體要看之前的配置。

spark.driver.host是主機名的意思,如果不設置,會默認使用主機的主機名,但是主機的主機名一般是沒有配置在集羣之中的,所以直接用主機映射的ip地址。不設置會報無法連接到XXX,找不到主機名

setJars 設置運行的jar地址,也就是剛剛導出jar包的地址。

如果不設置,在某些運算上沒有問題,如果只用到了一個服務器,運行起來沒有問題,如果涉及並行,使用多個服務器,就會出現找不到class的錯誤,原因是,不設置,除了提交的節點,其他節點都找不到這個包,也就是沒有分發到各個節點,從而導致報錯。

設置之後
運行該程序後,會看到沒有輸出,打開spark的web界面,筆者配置的是http://master:8079,進入之後可以看到很多任務
在這裏插入圖片描述點擊最新的任務,可以看到集羣狀態 和輸入輸出
在這裏插入圖片描述依次點擊stdout,會在其中一個裏面看到想要的輸出
在這裏插入圖片描述

至此,已經可以在windows的idea上進行spark編程調試

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章