Spark在HDP Yarn的提交与正常通信
环境
- Ambari HDP版本3.0.1.0-187
- apache spark版本2.4 或3.0
- Linux CentOS 7.4
使用开源Spark提交任务到HDP版本Yarn上会遇到一些问题,如无法提交任务,提交到YARN任务挂起,长时间处于Accepted状态等等。
问题1:在YARN上提交开源spark任务
如何在HDP平台上提交运行Apache Spark3 on YARN任务?
解决方案
按以下步骤进行:
- 修改spark-env配置文件,添加如下内容:
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配置文件,添加如下内容:
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的版本号。 -
替换spark3安装目录下的jars中的
jersey-client
,jersey-core
为1.19版本!!!否则提交任务时会抛出异常ClassNotFound :com/sun/jersey/api/client/config/ClientConfig …… Why?传送门 -
可以尝试提交SparkPi到HDP YARN,进入spark安装目录,执行以下的命令:
./bin/run-example --master yarn SparkPi 10
问题2:spark任务提交后出错Yarn application ended
用开源Spark提交任务到Ambari大数据平台的YARN(Hadoop)上时,报错Yarn application ended
如何解决?
注意,一些博客说的修改pmem和vmem参数为false并不能解决问题!
解决方案
- 进入Yarn ResourceManager UI查看Yarn日志
- 定位到报错原因是因为AM启动失败造成的
- 继续查看日志,发现是因为运行container_launch.sh时返回的classpath包含
${hdp.version}
字段 - 可以看到开源Spark无法识别
${hdp.version}
字段,需要在SPARK_HOME/conf/spark-defaults.conf
中添加相应的extraJavaOptions
确保如问题1所述添加了如下两行:
spark.driver.extraJavaOptions -Dhdp.version=${hdp.version}
spark.yarn.am.extraJavaOptions -Dhdp.version=${hdp.version}
注意:步骤4中的${hdp.version}
,需要赋值实际的hdp版本号,如3.0.1.0-187
问题3:Spark任务挂起,处于Accepted状态,无法正常与YARN通信
一般在使用集群外客户端时出现该问题,平台使用集群外Spark客户端时,无法与YARN正常通信的原因有哪些?如何解决?
解决方案
常见的原因有以下几点,依次进行如下的检查
- 防火墙未关闭
- YARN队列资源已耗尽,尤其注意查看AM资源是否够用,默认为20%的资源,在虚拟机上往往容易发生AM资源不足,无法启动driver的情况。
- 集群节点和客户端节点未配置所有节点的IP映射
解决方法:
需要根据报错确定问题所在,然后执行相应的措施:
- 关闭防火墙,
systemctl stop firewalld
- 释放YARN队列资源,等待资源释放或增大Yarn可用的资源
- 调大AM资源比例,如40%
- 配置IP映射等,给集群内的节点添加上客户端的ip域名信息。
如查找YARN的相关日志发现了报错:Failed to connect to driver at x.x.x.x,retrying.....
,这就是ip映射有问题。
解决方法有两种:
(1)集群外Client和集群内每个NodeManager节点分别添加所有IP映射(/etc/hosts
文件) ,确保集群内节点持有集群外客户端的域名映射。
(2) 客户端提交任务时,指定参数--conf spark.driver.host=$your_ip_address
,ip直接写客户端的ip地址,不是写客户端域名。
方法2解决该问题是比较优雅的,不需要去动集群的配置!
问题4 防火墙未关闭导致的一些问题
在HDFS上生成数据并采用Spark on Yarn模式处理数据时,若系统防火墙未关闭,可能会出现什么问题?
答案是:
- HDFS写入数据时报错:
NO Route to Host from xx.xx.xx.xx to xx.xx.xx.xxx failed on socket timeout exception
- ResourceManager Web UI 无法访问
- Spark的Executor只运行在提交任务的节点上
- Spark运行任务报错:
Could not obtain block
(可能由其他问题引起)
则以上问题首先要确保防火墙已关闭。
以上基本囊括了开源Spark在HDP环境提交任务的常见错误与解决思路。如果还有新的错误,欢迎留言讨论。
点:任务调度、Spark On YARN、Ambari、客户端
线:Spark
面:大数据计算
万丈高楼平地起,一砖一瓦皆根基。