我们有Spark 2.1.0独立的群集在一个带有8个内核和50GB内存(单个工作的单个节点)上运行。
我们在集群模式下运行Spark应用程序,并使用以下内存设置 -
--driver-memory = 7GB (default - 1core is used)
--worker-memory = 43GB (all remaining cores - 7 cores)
最近,我们观察到执行者经常被驾驶员/大师杀死和重新杀害。我在驱动程序上找到以下登录 -
17/12/14 03:29:39 WARN HeartbeatReceiver: Removing executor 2 with no recent heartbeats: 3658237 ms exceeds timeout 3600000 ms
17/12/14 03:29:39 ERROR TaskSchedulerImpl: Lost executor 2 on 10.150.143.81: Executor heartbeat timed out after 3658237 ms
17/12/14 03:29:39 WARN TaskSetManager: Lost task 23.0 in stage 316.0 (TID 9449, 10.150.143.81, executor 2): ExecutorLostFailure (executor 2 exited caused by one of the running tasks) Reason: Executor heartbeat timed out after 3658237 ms
17/12/14 03:29:39 WARN TaskSetManager: Lost task 9.0 in stage 318.0 (TID 9459, 10.150.143.81, executor 2): ExecutorLostFailure (executor 2 exited caused by one of the running tasks) Reason: Executor heartbeat timed out after 3658237 ms
17/12/14 03:29:39 WARN TaskSetManager: Lost task 8.0 in stage 318.0 (TID 9458, 10.150.143.81, executor 2): ExecutorLostFailure (executor 2 exited caused by one of the running tasks) Reason: Executor heartbeat timed out after 3658237 ms
17/12/14 03:29:39 WARN TaskSetManager: Lost task 5.0 in stage 318.0 (TID 9455, 10.150.143.81, executor 2): ExecutorLostFailure (executor 2 exited caused by one of the running tasks) Reason: Executor heartbeat timed out after 3658237 ms
17/12/14 03:29:39 WARN TaskSetManager: Lost task 7.0 in stage 318.0 (TID 9457, 10.150.143.81, executor 2): ExecutorLostFailure (executor 2 exited caused by one of the running tasks) Reason: Executor heartbeat timed out after 3658237 ms
应用程序不是很密集,而是有几个加入并将数据集写入目录。相同的代码在火花壳上运行而不会发生任何故障。
寻找群集调整或将减少执行者被杀死的任何配置设置。
首先,如果您的实例完全具有50GB的RAM,我建议不要将总共50GB的RAM分配给任何应用程序。系统应用程序的其余应用也需要一些RAM才能工作,并且应用程序未使用的RAM用于缓存文件并减少磁盘读取量。JVM本身在其外部也有一个很小的内存。
如果您的Spark作业使用了所有内存,则您的实例将不可避免地交换,如果交换,它将开始行为不正确。您可以轻松检查内存使用情况,并通过运行命令htop
查看服务器是否交换。您还应该确保交换量减少到0,以免交换,除非确实必须交换。
这就是我可以说的,如果您提供的信息,如果这无济于事,您应该考虑提供更多信息,例如Spark Job的完整参数。
执行程序可能存在内存问题。因此,您应该在spark-env.sh
文件中使用执行器内存配置您的核心。可以在路径~/spark/conf/spark-env.sh
上找到: - 由于您的内存是50 GB。
export SPARK_WORKER_CORES=8
export SPARK_WORKER_INSTANCES=5
export SPARK_WORKER_MEMORY=8G
export SPARK_EXECUTOR_INSTANCES=2
,如果您的数据不太大,无法处理,则可以在spark-default.conf
中设置驱动程序内存。还为此文件中的执行程序提供一些高架内存〜/spark/conf/conf/spark-default.conf` as: -
spark.executor.memoryOverhead 1G
spark.driver.memory 1G
带有火花壳,驱动程序也是执行人。看来驾驶员杀死了执行者,因为它在1小时内没有心跳。通常,心跳配置为10。
- 您是否修改了默认的心跳设置?
- 在执行者上检查GC。长时间的暂停是缺失心跳的原因。如果是这样,请改善执行人中每个核心的内存。这通常意味着增加记忆或减少核心。
- 您网络中的任何可能导致心跳下降的东西?
日志清楚地表明,驾驶员杀死了遗嘱执行人,因为它在1小时内没有心跳,并且遗嘱执行人在被杀时正在执行一些任务。