天天看點

Spark2.3(四十):如何使用java通過yarn api排程spark app,并根據appId監控任務,關閉任務,擷取任務日志

調研過OOZIE和AZKABA,這種都是隻是使用spark-submit.sh來送出任務,任務送出上去之後擷取不到ApplicationId,更無法跟蹤spark application的任務狀态,無法kill application,更無法擷取application的日志資訊。是以,為了實作一個spark的排程平台是以有了以下調研及測試結論。

調研目前流行的SPARK任務排程:Oozie和Azkaban。

Spark2.3(四十):如何使用java通過yarn api排程spark app,并根據appId監控任務,關閉任務,擷取任務日志

但是這兩個平台不能滿足以下功能(這些功能是希望有的):

1) 無法滿足即安全(使用shell送出任務,操作使用者權限控制)又可以Spark狀态監控(跟蹤SPARK application的任務狀态);

2) 無法滿足監控叢集運作狀态;

3) 無法滿足對每個任務設定監控政策。比如:任務假死狀态判定。

一個合格的spark排程平台要具有的基本功能:可以submit,kill,監控,擷取日志,跟蹤曆史記錄。

本篇文章主要講解如何使用YarnClient API實作,借助于YarnClient來實作監控任務,殺死任務,擷取日志,使用org.apache.spark.deploy.yarn.Client送出spark任務并傳回spark任務的applicationId。

備注:之前研究過使用SparkLauncher類進行排程,該方案也是一種不錯的方案,如果讀者你喜歡也可以嘗試使用SparkLauncher,它一樣可以送出後傳回spark任務的applicationid(送出後無狀态,需要等待applicaitonId不為空為止)。

1)由于我們是使用java 代碼(需要釋出到web項目中,而不是shell調用[不可以再shell中設定環境變量])去調用,是以我們需要centos系統環境變量中包含以下變量:

如果你對spark-env.sh檔案比較熟悉的話,你會發現上邊這些變量來自于該檔案,那麼,我們嗯隻需要把spark-env.sh引入到/ect/profile就可以。

spark-env.sh

Spark2.3(四十):如何使用java通過yarn api排程spark app,并根據appId監控任務,關閉任務,擷取任務日志
Spark2.3(四十):如何使用java通過yarn api排程spark app,并根據appId監控任務,關閉任務,擷取任務日志

View Code

接下來在/ect/profile檔案最後一樣追加 

,儲存,然後source /etc/profile使其生效。

2)需要修改yarn上傳資源檔案存儲位置,否則會出現錯誤找不到資源檔案(檔案之是以找不到,是因為那些資源檔案spark_lib.zip,spark_conf.zip,*.jar被上傳到本地的/curent_user[root、zhangsan、lisi]/.sparkStaging/{appId}/*.jar下,在其他executor|container上找不到),必須修改yarn資源檔案上傳到hdfs目錄下:

第一步:送出任務代碼中設定SparkConf變量:

第二步:手動建立hdfs目錄 /user/.sparkStaging,給配置設定權限:

第三步:導入pom.xml依賴包

參數類YarnSubmitConditions:

Spark2.3(四十):如何使用java通過yarn api排程spark app,并根據appId監控任務,關閉任務,擷取任務日志
Spark2.3(四十):如何使用java通過yarn api排程spark app,并根據appId監控任務,關閉任務,擷取任務日志

送出函數:

測試函數

測試函數執行腳本:

執行日志:

Spark2.3(四十):如何使用java通過yarn api排程spark app,并根據appId監控任務,關閉任務,擷取任務日志
Spark2.3(四十):如何使用java通過yarn api排程spark app,并根據appId監控任務,關閉任務,擷取任務日志

目前調試通之後,測試通過yarn的cluster方式,client模式下任務送出到yarn上去無響應。

 任務狀态封裝類

Spark2.3(四十):如何使用java通過yarn api排程spark app,并根據appId監控任務,關閉任務,擷取任務日志
Spark2.3(四十):如何使用java通過yarn api排程spark app,并根據appId監控任務,關閉任務,擷取任務日志

基礎才是程式設計人員應該深入研究的問題,比如:

1)List/Set/Map内部組成原理|差別

2)mysql索引存儲結構&如何調優/b-tree特點、計算複雜度及影響複雜度的因素。。。

3)JVM運作組成與原理及調優

4)Java類加載器運作原理

5)Java中GC過程原理|使用的回收算法原理

6)Redis中hash一緻性實作及與hash其他差別

7)Java多線程、線程池開發、管理Lock與Synchroined差別

8)Spring IOC/AOP 原理;加載過程的。。。

繼續閱讀