Spark on yarn遇到的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark on yarn遇到的问题相关的知识,希望对你有一定的参考价值。
参考技术A spark on yarn提交任务时一直显示ACCEPTED,过一个小时后就会出现任务失败,但在提交时shell终端显示的日志并没有报错,logs文件夹中也没有日志产生。注:spark on yarn是不需要启动spark集群的,只需要在提交任务的机器配置spark就可以了,因为任务是由hadoop来执行的,spark只负责任务的提交。
参考网址
遇到此种情况
看running application是否是该application,如果不是的话,使用 yarn application -kill "applicationID" 把之前的application kill掉。
检查ResourceManager日志,位于[HADOOP_HOME]/logs/yarn-ubuntu-resourcemanager-master.log中,若发现nodemanager并未分配到资源
参考网址
修改每台NodeManager上的yarn-site.xml:
修改
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle,spark_shuffle</value>
</property>
增加
<property>
<name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
<value>org.apache.spark.network.yarn.YarnShuffleService</value>
</property>
<property>
<name>spark.shuffle.service.port</name>
<value>7337</value>
</property>
将$SPARK_HOME/lib/spark-1.6.0-yarn-shuffle.jar拷贝到每台NodeManager的$HADOOP_HOME/share/hadoop/yarn/lib/下。
重启所有NodeManagers。
观察All Application的yarn界面发现有一个slave提示“unhealthy”状态。NodeHealthReport报告如下:
1/1 local-dirs are bad: /tmp/hadoop-hduser/nm-local-dir; 1/1 log-dirs are bad: /usr/local/hadoop/logs/userlogs
测试过程中YARN Node变成Unhealthy了,后来定位到硬盘空间不够。通过查找大于100M的文件时发现有N多个spark-assembly-1.6.0-SNAPSHOT-hadoop2.6.0-cdh5.3.1.jar包,大小为170多M,
每提交一个application到yarn上执行,就会上传一个assembly包,application个数一多,磁盘就占用了N多空间。
解决方案:
引起local-dirs are bad的最常见原因是由于节点上的磁盘使用率超出了max-disk-utilization-per-disk-percentage(默认值90.0%)。
清理不健康节点上的磁盘空间或者降低参数设置的阈值:
直接在yarn-site.xml下添加如下:
<property> <name>yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage</name> <value>98.5</value> </property>
因为当没有磁盘空间,或因为权限问题,会导致作业失败,所以不要禁用磁盘检查。更详细的信息可以参考 https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/NodeManager.html#Disk_Checker
yarn-default.xml
内存不足等原因导致dataNode丢失超过设置的丢失百分比,系统自动进入安全模式
解决办法:
在master执行如下命令:
步骤 1 执行命令退出安全模式:hadoop dfsadmin -safemode leave
步骤 2 执行健康检查,删除损坏掉的block。 hdfs fsck / -delete
注意: 这种方式会出现数据丢失,损坏的block会被删掉
spark on yarn运行产生jar包冲突问题
1.1 问题描述
Spark Streaming程序解析protobuf序列化的数据时,--jars 来添加依赖的protobuf-java-3.0.0.jar包,使用local模式程序正常,使用yarn模式时会报找不到方法的错误,如下所示:
1.2 解决方法
分析local模式能运行,yarn模式不能运行的原因是,用户提交的protobuf-java-3.0.0.jar与SPARK_HOME/lib下的protobuf-java-2.5.0.jar冲突了,默认会优先加载SPARK_HOME/lib下的jar,而不是你程序的jar,所以会发生“ NoSuchMethodError”。
解决方法:提交参数添加 --conf spark.executor.extraClassPath=$user_jars
如下图所示,注意protobuf-java-3.0.0.jar包要分发到所有节点
此类问题相关参数总结:
属性名称 | 默认值 | 含义 |
---|---|---|
spark.driver.extraClassPath | (none) | 附加到driver的classpath的额外的classpath实体。这个设置存在的主要目的是Spark与旧版本的向后兼容问题。用户一般不用设置这个选项 |
spark.executor.extraClassPath | (none) | 附加到executors的classpath的额外的classpath实体。这个设置存在的主要目的是Spark与旧版本的向后兼容问题。用户一般不用设置这个选项 |
spark.driver.userClassPathFirst | false | 实验性)当在driver中加载类时,是否用户添加的jar比Spark自己的jar, 优先级高。这个属性可以降低Spark依赖和用户依赖的冲突。它现在还是一个实验性的特征。 |
spark.executor.userClassPathFirst | false | 实验性)当在executor中加载类时,是否用户添加的jar比Spark自己的jar优先级高。这个属性可以降低Spark依赖和用户依赖的冲突。它现在还是一个实验性的特征。 |
以上是关于Spark on yarn遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章