從入門到入土 大數據學習(4)windows下idea運行spark程序
繼環境搭建和windows環境搭建之後,不可避免的需要在windows上進行開發,但是這種跨平臺的開發本身就給開發者帶來一定的難度。如果條件允許(指電腦內存足夠大,且今後開發服務器上也會有LINUX圖形化界面的情況),個人還是建議使用圖形化界面,在windows上開發,筆者真的搗鼓了很久。
網上常見的windows上連接spark開發是使用idea本身自帶遠程,打開5005端口進行調試,還是比較複雜的,有興趣的可以百度。
這裏介紹一種自己搗鼓的方法,前提要求:
- 主機和虛擬機已經能互相訪問(筆者使用了NAT,將主機映射到一個ip)
- spark環境已經完成搭建,且能正常運行
導入類庫
因爲windows上沒有相關類庫,所以要導入相關類庫,筆者將之前下載在linux上還未解壓的hadoop、spark壓縮包都複製到了主機上,並且解壓。
- 打開idea,File-Project Structure
- 選擇libraries,並選擇加號,JAVA
- 選擇相關類庫
其中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,會在其中一個裏面看到想要的輸出