初學Spark時,部署的是Standalone模式(集成了HA),寫的測試程序一般創建上下文時如下:
此處master設置爲管理節點的集羣地址(spark webui上顯示的地址) 。
之後將測試代碼打包成jar包,上傳到服務器,使用spark-submit提交作業。
提交命令:
spark-submit --master spark://s44:7077 --name MyWordCount --class com.yahuidemo.spark.scala.WordCountScala SparkDemo1-1.0-SNAPSHOT.jar hdfs://s44:8020/usr/hadoop/test.txt
打包部署參考 官方api:
http://spark.apache.org/docs/latest/submitting-applications.html
注意,此處我把master設置爲我集羣master的url,那麼可以隨意定義;class參數要帶包名,一直指定到要運行的類入口,後面緊跟所在的jar(我是直接在jar所在目錄下執行的spark-submit,配置過spark環境變量;試過在spark的bin目錄下執行,但jar包在別的地方,結果沒有成功~)jar包參數後 跟main需要的自定義參數,如果有多個,空格隔開即可。我這裏只需要一個參數,用來指定程序要加載的文件目錄。
提交後就等着打印結果就好。另外可以根據屏幕打印出來的提示查看日誌,還可以在webui上查看具體的執行過程。類似於這樣:
點超鏈接可以看詳細的。
前面是測試standalone模式,現在要講的是yarn模式下提交作業。
由於公司使用ambari來統一搭建管理hadoop、spark等集羣。ambari上添加servcie的方式搭建的spark集羣是spark-yarn模式。底層原理跟standalone是差不多的,由master來調度worker實現計算,只不過調度交給yarn來管理。
看網上有人這樣解釋:客戶端提交一個Application,在客戶端啓動一個Driver進程。Driver進程會向RS(ResourceManager)發送請求,啓動AM(ApplicationMaster)的資源。RS收到請求,隨機選擇一臺NM(NodeManager)啓動AM。這裏的NM相當於Standalone中的Worker節點。AM啓動後,會向RS請求一批container資源,用於啓動Executor.RS會找到一批NM返回給AM,用於啓動Executor。AM會向NM發送命令啓動Executor。Executor啓動後,會反向註冊給Driver,Driver發送task到Executor,執行情況和結果返回給Driver端。
官方也給出了spark-yarn的部署文檔:
http://spark.apache.org/docs/latest/running-on-yarn.html
ambari上搭建好集羣后,提交了一個example沒有問題:
spark-submit --master yarn --class org.apache.spark.examples.SparkPi spark-examples_2.11-2.3.0.2.6.5.0-292.jar
後來自己寫了個單詞統計的測試類,在使用yarn方式提交。
這裏需要將SparkConfig的master配置修改爲“yarn”。
依舊將作業打成jar包,上傳到服務器,提交作業。提交命令爲:
spark-submit --master yarn --class com.yahuidemo.spark.scala.WordCountScala SparkDemo1-1.0-SNAPSHOT.jar yarn /user/spark/test.txt
如圖:
注意 需要將master參數修改爲yarn,class參數、jar包 和自定義參數跟standalone模式下一樣傳遞。我傳了兩個參數,一個是指定masterurl 另一個是文件目錄。
執行結果
webui 觀察