我的Apache Spark集群正在运行一个给我很多执行程序超时的应用程序:
10:23:30,761 ERROR ~ Lost executor 5 on slave2.cluster: Executor heartbeat timed out after 177005 ms
10:23:30,806 ERROR ~ Lost executor 1 on slave4.cluster: Executor heartbeat timed out after 176991 ms
10:23:30,812 ERROR ~ Lost executor 4 on slave6.cluster: Executor heartbeat timed out after 176981 ms
10:23:30,816 ERROR ~ Lost executor 6 on slave3.cluster: Executor heartbeat timed out after 176984 ms
10:23:30,820 ERROR ~ Lost executor 0 on slave5.cluster: Executor heartbeat timed out after 177004 ms
10:23:30,835 ERROR ~ Lost executor 3 on slave7.cluster: Executor heartbeat timed out after 176982 ms
但是,在我的配置中,我可以确认我成功增加了执行程序心跳间隔:
当我访问标记为EXITED
的执行者日志时(即:当驱动程序无法获得心跳时驱动程序将其删除),执行人员似乎因为没有收到而自杀来自司机的任何任务:
16/05/16 10:11:26 ERROR TransportChannelHandler: Connection to /10.0.0.4:35328 has been quiet for 120000 ms while there are outstanding requests. Assuming connection is dead; please adjust spark.network.timeout if this is wrong.
16/05/16 10:11:26 ERROR CoarseGrainedExecutorBackend: Cannot register with driver: spark://CoarseGrainedScheduler@10.0.0.4:35328
如何关闭心跳和/或阻止执行程序超时?
答案 0 :(得分:35)
由YARN杀死的心跳和遗嘱执行人员几乎总是由于OOM而死。您应该检查各个执行程序上的日志(查找文本"超出物理内存和#34;)。如果您有许多执行程序并且发现手动检查所有日志很麻烦,我建议在运行时在Spark UI中监视您的作业。一旦任务失败,它将在UI中报告原因,因此很容易看到。请注意,由于缺少已经被杀死的执行程序,某些任务将报告失败,因此请确保查看每个失败任务的原因。
另请注意,只需在代码中的适当位置重新分区数据,即可快速解决大多数OOM问题(再次查看Spark UI以获取有关可能需要调用repartition
的位置的提示)。否则,您可能需要扩展计算机以满足内存需求。
答案 1 :(得分:23)
答案很简单。在我的spark-defaults.conf
中,我将spark.network.timeout
设置为更高的值。心跳间隔与问题有些无关(虽然调整很方便)。
使用spark-submit
时,我也可以按如下方式设置超时:
$SPARK_HOME/bin/spark-submit --conf spark.network.timeout 10000000 --class myclass.neuralnet.TrainNetSpark --master spark://master.cluster:7077 --driver-memory 30G --executor-memory 14G --num-executors 7 --executor-cores 8 --conf spark.driver.maxResultSize=4g --conf spark.executor.heartbeatInterval=10000000 path/to/my.jar
答案 2 :(得分:0)
如果您正在使用pyspark,则更改spark上下文的配置将解决此问题。您可以将其设置如下(注意,所有提到的时间均以毫秒为单位),heartbeatInterval(默认值为10000)应小于超时值(默认为120000)
conf = SparkConf().setAppName("applicaiton") \
.set("spark.executor.heartbeatInterval", "200000") \
.set("spark.network.timeout", "300000")
sc = SparkContext.getOrCreate(conf)
sqlcontext = SQLContext(sc)
希望这可以解决您的问题。如果您遇到其他错误,请访问文档here