Spark作業提交方式一般有兩種,一種是使用spark-submit腳本進行提交作業,另一種方式是使用rest api方式,但是有時候由於集羣的安全原因可能無法使用rest api方式進行提交作業,但是由於業務需要的話我們可以直接調用SparkSubmit.main方法進行api方式提交作業。(當然也可以使用ProcessBuilder執行shell腳本提交)。除了通常兩種情況,Spark其實還提供了API提交作業的方法。
1 調用SparkSubmit提交作業:
爲了使用SparkSubmit#main方法方式提交作業,因此重點就是需要構造參數,我們可以根據spark-submit腳本源碼進行構造參數,翻閱spark-submit源碼不難發現最終調用的是spark-class腳本提交作業,spark-class腳本中最核心的代碼如下:
exec "${CMD[@]}"
因此只要我們弄清楚 "${CMD[@]}"參數是什麼就可以解決問題,最好的方法就是在spark-class腳本中添加echo 打印出來看看。打印結果如下:
/usr/local/jdk1.8.0_161/bin/java -cp /home/daxin/bigdata/spark/conf/:/home/daxin/bigdata/spark/jars/*:/home/daxin/bigdata/hadoop/etc/hadoop/:/home/daxin/bigdata/hadoop/etc/hadoop/ -Xmx1g org.apache.spark.deploy.SparkSubmit --master yarn --class com.daxin.remote.debug.App wc.jar
由於我們提交的作業是使用yarn調度,因此需要傳入hadoop相關配置。如果使用yarn調度卻沒有傳入hadoop配置文件的話此時會提示操作不到ResourceMangaer,即信息如下:
0.0.0.0/0.0.0.0:8032. Already tried 7 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1 SECONDS)
正常spark腳本提交作業時候hadoop等相關配置文件是通過classpath傳入的,因此我們在classpath傳入即可。
2:使用SPARK API提交作業。
參考文檔:https://spark.apache.org/docs/latest/rdd-programming-guide.html#launching-spark-jobs-from-java--scala,內容比較簡單就不描述了。