Apache spark 如何防止Spark执行器在使用Thread客户端模式时丢失?

Apache spark 如何防止Spark执行器在使用Thread客户端模式时丢失?,apache-spark,yarn,Apache Spark,Yarn,我有一个Spark作业,它在本地运行良好,数据较少,但是当我将它安排在Thread上执行时,我不断地得到以下错误,慢慢地所有执行器都从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 execut

我有一个Spark作业,它在本地运行良好,数据较少,但是当我将它安排在Thread上执行时,我不断地得到以下错误,慢慢地所有执行器都从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
我使用以下命令在客户机模式下调度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的新手。

我也有类似的问题。无论我们给他们分配了多少内存,我都有很多遗嘱执行人丢失了

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

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


看起来我们并没有为纱线本身留下足够的记忆,容器也因此被杀死。设置之后,我们出现了不同的内存不足错误,但不是相同的丢失执行器问题。

我也面临着相同的问题。对于我来说,删除日志和释放更多hdfs空间是有效的。

您可以按照AWS的帖子计算内存开销(以及其他要优化的spark配置):

尝试增加executor内存。执行器失败的一个常见原因是内存不足。当执行器消耗更多内存时,分配的线程会杀死它。您提供的日志不提供故障原因的线索。使用“纱线日志-应用程序ID”检查执行器日志。我只在运行长时间运行的spark作业时才看到这一点。如果是内存问题,一开始就应该失败。你知道如何解决这个问题了吗?我观察到同样的一个,没有确认执行器内存不足的日志。我只看到驱动程序杀死了executor,而executor得到了SIGTERM信号,在此之后,我的应用程序经历了无数次阶段重试,这些重试总是失败,因为单个任务失败,FetchFailedException:executor未注册。出于某种原因,这种类型的任务失败甚至不会在不同的主机上重试,整个阶段都会重试。使用“分而治之”使您的spark作业做的事情更少在我的情况下,我将我的一个spark作业分为五个不同的作业。确保洗牌较少的数据,如分组加入等。确保不缓存太多数据使用筛选器,然后在需要时使用内存磁盘服务器进行缓存。如果缓存不多,请尝试将spar.storage.fraction从0.6减少到更少。使用Kryo尝试使用由其启用的钨火花1.5.1default@shekharThread nodemanager日志并不总是显示终止的原因。您是说
--conf spark.thread.executor.memoryOverhead=600
将开销内存设置为600 MB?600 MB对于您的应用程序足够吗?我有一个简单的应用程序。我不得不将开销内存设置为3000,以避免outOfMemory异常。@PanChao是的,应该有一个相等的内存,谢谢你指出。设置纱线开销内存修复了一个问题,即执行器将在不给出任何错误的情况下死亡。它是设置纱线本身可以访问多少内存,而不是您的应用程序可以使用多少内存。如果您看到内存不足错误,可能需要根据错误发生的位置增加
spark.driver.memory
spark.executor.memory
。你试过了吗?这也适用于
mesos
。我也有同样的问题。相反,它是
--conf spark.mesos.executor.memoryOverhead=600
如何在Scala REPL中设置
spark.warn.executor.memoryOverhead
?在spark版本2.3.1中,配置现在是“spark.executor.memoryOverhead”,而不是“spark.warn.executor.memoryOverhead”。@whalberg即使我也有同样的问题,但我在日志中没有看到任何记忆问题。节点关闭的原因可能是什么?错误