您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java Web怎么提交任務到Spark Standalone集群并監控”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java Web怎么提交任務到Spark Standalone集群并監控”吧!
1. 環境
軟件 版本 備注
IDEA 14.1.5
JDK 1.8
Spark 1.6.0 工程maven引用
Spark cdh6.7.3-spark1.6.0 實際集群5.7.3-1.cdh6.7.3.p0.5
Hadoop 2.6.4 工程Maven引用
Hadoop 2.6.0-cdh6.7.3 實際集群參數
Maven 3.3
2. 工程下載路徑
工程在GitHub上地址為: javaweb_spark_standalone_monitor
3. Spark任務提交流程
之前做過相關的工作,知道可以通過下面的方式來提交任務到Spark Standalone集群:
String[] arg0=new String[]{
"--master","spark://server2.tipdm.com:6066",
"--deploy-mode","cluster",
"--name",appName,
"--class",className,
"--executor-memory","2G",
"--total-executor-cores","10",
"--executor-cores","2",
path,
"/user/root/a.txt",
"/tmp/"+System.currentTimeMillis()
};
SparkSubmit.main(arg0);
1. 這里要注意的是,這里使用的模式是cluster,而非client,也就是說driver程序也是運行在集群中的,而非提交的客戶端,也就是我Win10本地。
2. 如果需要使用client提交,那么需要注意本地資源是否足夠;同時因為這里使用的是cluster,所以需要確保集群資源同時可以運行一個driver以及executor(即,最少需要同時運行兩個Container)
3. 其中的path,也就是打的jar包需要放到集群各個slave節點中的對應位置。比如lz集群中有node1,node2,node3 ,那么就需要把wc.jar放到這三個節點上,比如放到/tmp/wc.jar ,那么path的設置就要設置為file:/opt/wc.jar ,如果直接使用/opt/wc.jar 那么在進行參數解析的時候會被解析成file:/c:/opt/wc.jar (因為lz使用的是win10運行Tomcat),從而報jar包文件找不到的錯誤!
進入SparkSubmit.main源碼,可以看到如下代碼:
def main(args: Array[String]): Unit = {
val appArgs = new SparkSubmitArguments(args)
if (appArgs.verbose) {
// scalastyle:off println
printStream.println(appArgs)
// scalastyle:on println
}
appArgs.action match {
case SparkSubmitAction.SUBMIT => submit(appArgs)
case SparkSubmitAction.KILL => kill(appArgs)
case SparkSubmitAction.REQUEST_STATUS => requestStatus(appArgs)
}
}
代碼里面是通過submit來提交任務的,順著這條線往下,則最終是通過
mainMethod.invoke 是通過反射來調用的,通過debug可以得到,這里反射調用的其實是:RestSubmissionClient 的main函數提交任務的。
所以這里可以模仿RestSubmissionClient來提交任務。程序如下:
public static String submit(String appResource,String mainClass,String ...args){
SparkConf sparkConf = new SparkConf();
// 下面的是參考任務實時提交的Debug信息編寫的
sparkConf.setMaster(MASTER);
sparkConf.setAppName(APPNAME+" "+ System.currentTimeMillis());
sparkConf.set("spark.executor.cores","2");
sparkConf.set("spark.submit.deployMode","cluster");
sparkConf.set("spark.jars",appResource);
sparkConf.set("spark.executor.memory","2G");
sparkConf.set("spark.cores.max","2");
sparkConf.set("spark.driver.supervise","false");
Map<String,String> env = filterSystemEnvironment(System.getenv());
CreateSubmissionResponse response = null;
try {
response = (CreateSubmissionResponse)
RestSubmissionClient.run(appResource, mainClass, args, sparkConf, toScalaMap(env));
}catch (Exception e){
e.printStackTrace();
return null;
}
return response.submissionId();
}
如果不加其中的
sparkConf.set
…
則程序運行會有問題,第一個錯誤就是:
java.lang.IllegalArgumentException: Invalid environment variable name: “=::”
這個錯誤是因為模式設置不對(沒有設置cluster模式),所以在進行參數匹配的時候異常。可以看到的參數如下圖所示:
這里面對應的參數,其實就是SparkSubmit提交任務所對應的值了。
4. 問題及問題解決
問題提出:
1. 最近一段時間,在想運行Spark的任務的時候為什么要提交到YARN上,而且通過實踐發現,提交到YARN上程序運行比Spark Standalone運行要慢的多,所以是否能直接提交任務到Spark Standalone集群呢?
2. 提交任務到Spark Standalone集群后,如何獲得任務的id,方便后面的監控呢?
3. 獲得任務id后,怎么監控?
針對這三個問題,解答如下:
1. 第一個問題,應該是見仁見智的問題了,使用SparkONYARN的方式可以統一生態圈什么的;
2. 在上面的代碼中已經可以提交任務,并且獲取任務ID了。不過需要注意的是,通過:
response = (CreateSubmissionResponse)
RestSubmissionClient.run(appResource, mainClass, args, sparkConf, toScalaMap(env));
獲取的response需要轉型為CreateSubmissionResponse,才能獲得submittedId,但是要訪問CreateSubmissionResponse,那么需要在某些包下面才行,所以lz的SparkEngine類才會定義在org.apache.spark.deploy.rest包中。
第三:
監控,監控就更簡單了,可以參考:
private def requestStatus(args: SparkSubmitArguments): Unit = {
new RestSubmissionClient(args.master)
.requestSubmissionStatus(args.submissionToRequestStatusFor)
}
感謝各位的閱讀,以上就是“Java Web怎么提交任務到Spark Standalone集群并監控”的內容了,經過本文的學習后,相信大家對Java Web怎么提交任務到Spark Standalone集群并監控這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。