【问题标题】:How to prevent Spark Executors from getting Lost when using YARN client mode?使用 YARN 客户端模式时如何防止 Spark Executors 丢失?
【发布时间】: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 的原因。

标签: apache-spark hadoop-yarn


【解决方案1】:

我有一个非常相似的问题。无论我们分配给他们多少内存,我都会丢失许多执行程序。

如果您使用 yarn 的解决方案是设置 --conf spark.yarn.executor.memoryOverhead=600,或者如果您的集群使用 mesos,您可以尝试 --conf spark.mesos.executor.memoryOverhead=600

在 spark 2.3.1+ 中,配置选项现在是 --conf spark.yarn.executor.memoryOverhead=600

似乎我们没有为 YARN 本身留下足够的内存,并且容器因此而被杀死。设置后,我们遇到了不同的内存不足错误,但不是相同的丢失执行器问题。

【讨论】:

  • 您的意思是--conf spark.yarn.executor.memoryOverhead=600 将开销内存设置为 600 MB? 600 MB 足够您的应用程序使用吗?我有一个简单的应用程序。我不得不将开销内存设置为 3000 以避免 outOfMemory 异常。
  • @PanChao 是的,那里应该有一个等号,谢谢指出。设置纱线开销内存修复了执行器会死而没有任何错误的问题。它设置纱线本身可以访问多少内存,而不是您的应用程序可以使用多少内存。如果您看到内存不足错误,您可能需要增加spark.driver.memoryspark.executor.memory,具体取决于错误发生的位置。你试过吗?
  • 这也适用于mesos。我有同样的问题。相反,它是--conf spark.mesos.executor.memoryOverhead=600
  • 如何在 Scala REPL 中设置spark.yarn.executor.memoryOverhead
  • 在 Spark 2.3.1 版中,配置现在是“spark.executor.memoryOverhead”而不是“spark.yarn.executor.memoryOverhead”。
【解决方案2】:

当我遇到同样的问题时,删除日志并释放更多 hdfs 空间有效。

【讨论】:

  • @whaleberg 即使我有同样的问题,但我没有在日志中看到任何内存问题。节点宕机的原因可能是什么?错误
【解决方案3】:

您可以按照这篇 AWS 帖子计算内存开销(以及要调整的其他 spark 配置):best-practices-for-successfully-managing-memory-for-apache-spark-applications-on-amazon-emr

【讨论】:

    猜你喜欢
    • 2020-01-06
    • 2021-07-06
    • 2014-11-04
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多