Spark代碼中設置appName在client模式和cluster模式中不同問題

問題

Spark應用名在使用yarn-cluster模式提交時不生效,在使用yarn-client模式提交時生效,如圖1所示,第一個應用是使用yarn-client模式提交的,正確顯示咱們代碼裏設置的應用名Spark Pi,第二個應用是使用yarn-cluster模式提交的,設置的應用名沒有生效。html

圖1 提交應用

回答

致使這個問題的主要緣由是,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模式都會讀取,可是代碼裏優先級最高。命令行

在給apname賦值的時候,會先取命令行傳入的參數再取客戶端配置文件的參數。
因此cluster模式讀的是命令行配置。
相關文章
相關標籤/搜索