【发布时间】:2015-10-22 02:25:17
【问题描述】:
我有一个 Spark 作业,它在本地运行良好,数据较少,但是当我在 YARN 上安排它执行时,我不断收到以下错误,慢慢地,所有执行程序都从 UI 中删除,我的作业失败
15/07/30 10:18:13 ERROR cluster.YarnScheduler: Lost executor 8 on myhost1.com: remote Rpc client disassociated
15/07/30 10:18:13 ERROR cluster.YarnScheduler: Lost executor 6 on myhost2.com: remote Rpc client disassociated
我使用以下命令在 yarn-client 模式下调度 Spark 作业
./spark-submit --class com.xyz.MySpark --conf "spark.executor.extraJavaOptions=-XX:MaxPermSize=512M" --driver-java-options -XX:MaxPermSize=512m --driver-memory 3g --master yarn-client --executor-memory 2G --executor-cores 8 --num-executors 12 /home/myuser/myspark-1.0.jar
这里有什么问题?我是 Spark 的新手。
【问题讨论】:
-
尝试增加执行器内存。执行器失败的常见原因之一是内存不足。当执行程序消耗更多内存时,分配的纱线会杀死它。您提供的日志不提供有关失败原因的任何线索。使用“yarn logs -applicationId
”查看执行器日志。 -
我只在我们运行长时间运行的 spark 作业时看到这一点。如果是内存问题,它最初应该会失败。
-
你想好如何解决这个问题了吗?我观察到同样的一个,没有日志确认执行程序内存不足。我只看到驱动程序杀死了执行程序,并且该执行程序得到了 SIGTERM 信号,之后我的应用程序经历了无数次阶段重试,这些重试总是失败,因为单个任务失败并出现 FetchFailedException:执行程序未注册。由于某种原因,这种类型的任务失败甚至没有在不同的主机上重试,整个阶段都被重试。
-
使用分治法让你的 Spark 工作做更少的事情在我的例子中我将我的一个 Spark 工作分成五个不同的工作。确保你洗牌较少的数据,如按加入分组等。确保你不缓存太多数据使用过滤器,然后在需要时使用 MEM_DISK_SER 进行缓存。如果您不缓存太多,请尝试将 spar.storage.fraction 从 0.6 减少到更少。使用 Kryo 尝试使用 tungsten Spark 1.5.1 默认启用它
-
@shekhar yarn nodemanager 日志并不总是揭示 KILLING 的原因。