問題
Spark應用名在使用yarn-cluster模式提交時不生效,在使用yarn-client模式提交時生效,如圖1所示,第一個應用是使用yarn-client模式提交的,正確顯示咱們代碼裏設置的應用名Spark Pi,第二個應用是使用yarn-cluster模式提交的,設置的應用名沒有生效。html
回答
致使這個問題的主要緣由是,yarn-client和yarn-cluster模式在提交任務時setAppName的執行順序不一樣致使,yarn-client中setAppName是在向yarn註冊Application以前讀取,yarn-cluser模式則是在向yarn註冊Application以後讀取,這就致使yarn-cluster模式設置的應用名不生效。apache
解決措施:
在spark-submit腳本提交任務時用--name設置應用名和sparkconf.setAppName(appname)裏面的應用名同樣。app
好比咱們代碼裏設置的應用名爲Spark Pi,用yarn-cluster模式提交應用時能夠這樣設置,在--name後面添加應用名,執行的命令以下:url
./spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --name SparkPi lib/spark-examples*.jar 10
0x00 背景
首先,能夠傳入spark運行環境參數有三個地方:命令行(spark-subimit),代碼(new SparkConf或SparkSession),client配置文件。
在spark提交任務時,代碼裏設置了appname,命令行和client配置文件都沒有設置。
使用yarn-client模式提交,appname是代碼裏設置的。
使用yarn-cluster模式提交,appname變爲執行類的全類名,例如com.aa.bb.Main。
0x01 緣由
在源碼裏找到,若是appname設置爲空,appname設置爲類名。spa
SparkSubmitArguments源碼:.net
但是明明在代碼裏設置了,爲何client模式能夠,cluster模式不能夠。
緣由是client和cluster模式啓動方式不同(前面已經作過度析),cluster模式不會讀取代碼裏配置,直接讀取命令行配置。client模式都會讀取,可是代碼裏優先級最高。命令行
命令行傳入的參數
再取客戶端配置文件
的參數。
因此cluster模式讀的是命令行配置。