環(huán)境
- Ambari HDP版本3.0.1.0-187
- apache spark版本2.4 或3.0
- Linux CentOS 7.4
使用開源Spark提交任務(wù)到HDP版本Yarn上會(huì)遇到一些問題,如無法提交任務(wù),提交到Y(jié)ARN任務(wù)掛起,長(zhǎng)時(shí)間處于Accepted狀態(tài)等等。
問題1:在YARN上提交開源spark任務(wù)
如何在HDP平臺(tái)上提交運(yùn)行Apache Spark3 on YARN任務(wù)?
解決方案
按以下步驟進(jìn)行:
- 修改spark-env配置文件,添加如下內(nèi)容:
HADOOP_CONF_DIR=/usr/hdp/3.0.1.0-187/hadoop/conf
YARN_CONF_DIR=/usr/hdp/3.0.1.0-187/hadoop/conf
- 修改spark-defaults配置文件,添加如下內(nèi)容:
spark.driver.extraJavaOptions -Dhdp.version=3.0.1.0-187
spark.yanr.am.extraJavaOptions -Dhdp.version=3.0.1.0-187
可選修改(Hadoop的)mapred-site配置文件,將
{{hdp.version}}直接寫死成3.0.1.0-187或你自己ambari hdp的版本號(hào)。替換spark3安裝目錄下的jars中的
jersey-client,jersey-core為1.19版本?。?!否則提交任務(wù)時(shí)會(huì)拋出異常ClassNotFound :com/sun/jersey/api/client/config/ClientConfig …… Why?傳送門可以嘗試提交SparkPi到HDP YARN,進(jìn)入spark安裝目錄,執(zhí)行以下的命令:
./bin/run-example --master yarn SparkPi 10
問題2:spark任務(wù)提交后出錯(cuò)Yarn application ended
用開源Spark提交任務(wù)到Ambari大數(shù)據(jù)平臺(tái)的YARN(Hadoop)上時(shí),報(bào)錯(cuò)Yarn application ended如何解決?
注意,一些博客說的修改pmem和vmem參數(shù)為false并不能解決問題!
解決方案
- 進(jìn)入Yarn ResourceManager UI查看Yarn日志
- 定位到報(bào)錯(cuò)原因是因?yàn)锳M啟動(dòng)失敗造成的
- 繼續(xù)查看日志,發(fā)現(xiàn)是因?yàn)檫\(yùn)行container_launch.sh時(shí)返回的classpath包含
${hdp.version}字段 - 可以看到開源Spark無法識(shí)別
${hdp.version}字段,需要在SPARK_HOME/conf/spark-defaults.conf中添加相應(yīng)的extraJavaOptions
確保如問題1所述添加了如下兩行:
spark.driver.extraJavaOptions -Dhdp.version=${hdp.version}
spark.yarn.am.extraJavaOptions -Dhdp.version=${hdp.version}
注意:步驟4中的${hdp.version},需要賦值實(shí)際的hdp版本號(hào),如3.0.1.0-187
問題3:Spark任務(wù)掛起,處于Accepted狀態(tài),無法正常與YARN通信
一般在使用集群外客戶端時(shí)出現(xiàn)該問題,平臺(tái)使用集群外Spark客戶端時(shí),無法與YARN正常通信的原因有哪些?如何解決?
解決方案
常見的原因有以下幾點(diǎn),依次進(jìn)行如下的檢查
- 防火墻未關(guān)閉
- YARN隊(duì)列資源已耗盡,尤其注意查看AM資源是否夠用,默認(rèn)為20%的資源,在虛擬機(jī)上往往容易發(fā)生AM資源不足,無法啟動(dòng)driver的情況。
- 集群節(jié)點(diǎn)和客戶端節(jié)點(diǎn)未配置所有節(jié)點(diǎn)的IP映射
解決方法:
需要根據(jù)報(bào)錯(cuò)確定問題所在,然后執(zhí)行相應(yīng)的措施:
- 關(guān)閉防火墻,
systemctl stop firewalld - 釋放YARN隊(duì)列資源,等待資源釋放或增大Yarn可用的資源
- 調(diào)大AM資源比例,如40%
- 配置IP映射等,給集群內(nèi)的節(jié)點(diǎn)添加上客戶端的ip域名信息。
如查找YARN的相關(guān)日志發(fā)現(xiàn)了報(bào)錯(cuò):Failed to connect to driver at x.x.x.x,retrying.....,這就是ip映射有問題。
解決方法有兩種:
(1)集群外Client和集群內(nèi)每個(gè)NodeManager節(jié)點(diǎn)分別添加所有IP映射(/etc/hosts文件) ,確保集群內(nèi)節(jié)點(diǎn)持有集群外客戶端的域名映射。
(2) 客戶端提交任務(wù)時(shí),指定參數(shù)--conf spark.driver.host=$your_ip_address,ip直接寫客戶端的ip地址,不是寫客戶端域名。
方法2解決該問題是比較優(yōu)雅的,不需要去動(dòng)集群的配置!
問題4 防火墻未關(guān)閉導(dǎo)致的一些問題
在HDFS上生成數(shù)據(jù)并采用Spark on Yarn模式處理數(shù)據(jù)時(shí),若系統(tǒng)防火墻未關(guān)閉,可能會(huì)出現(xiàn)什么問題?
答案是:
- HDFS寫入數(shù)據(jù)時(shí)報(bào)錯(cuò):
NO Route to Host from xx.xx.xx.xx to xx.xx.xx.xxx failed on socket timeout exception - ResourceManager Web UI 無法訪問
- Spark的Executor只運(yùn)行在提交任務(wù)的節(jié)點(diǎn)上
- Spark運(yùn)行任務(wù)報(bào)錯(cuò):
Could not obtain block(可能由其他問題引起)
則以上問題首先要確保防火墻已關(guān)閉。
以上基本囊括了開源Spark在HDP環(huán)境提交任務(wù)的常見錯(cuò)誤與解決思路。如果還有新的錯(cuò)誤,歡迎留言討論。
點(diǎn):任務(wù)調(diào)度、Spark On YARN、Ambari、客戶端
線:Spark
面:大數(shù)據(jù)計(jì)算
萬丈高樓平地起,一磚一瓦皆根基。