0

我们在具有 8 个内核和 50GB 内存(单工作者)的单个节点上运行 spark 2.1.0 独立集群。

我们使用以下内存设置在集群模式下运行 spark 应用程序 -

--driver-memory = 7GB (default - 1core is used)
--worker-memory = 43GB (all remaining cores - 7 cores)

最近,我们观察到 executor 经常被 driver/master 杀死并重新启动。我发现下面的驱动程序日志 -

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

应用程序不是那么占用内存,有几个连接并将数据集写入目录。相同的代码在 spark-shell 上运行,没有任何故障。

寻找集群调整或任何可以减少执行者被杀死的配置设置。

4

3 回答 3

1

首先,如果您的实例正好有 50Gb 的 RAM,我建议永远不要为任何应用程序分配总共 50Gb 的 RAM。其余的系统应用程序也需要一些 RAM 才能工作,应用程序未使用的 RAM 被系统用于缓存文件并减少磁盘读取量。JVM 本身在它之外也有少量的内存开销。

如果您的 spark 作业使用了所有内存,那么您的实例将不可避免地交换,如果它交换,它将开始出现错误行为。您可以通过运行命令轻松检查您的内存使用情况并查看您的服务器是否正在交换htop。您还应该确保交换性减少到 0,这样它就不会交换,除非它真的必须这样做。

鉴于您提供的信息,我只能说这些,如果这没有帮助,您应该考虑提供更多信息,例如您的火花作业的完整确切参数。

于 2018-05-25T08:17:36.697 回答
0

使用 spark-shell,驱动程序也是执行者。看起来司机杀死了执行者,因为它在 1 小时内没有收到心跳。通常心跳配置为 10 秒。

  1. 您是否修改了默认的心跳设置?
  2. 检查执行器上的 GC。长时间的 GC 暂停是导致心跳丢失的常见原因。如果是这样,请改进执行程序中每个内核的内存。这通常意味着增加内存或减少内核。
  3. 您的网络中有什么可能导致心跳下降吗?

日志清楚地显示驱动程序杀死了执行程序,因为它在 1 小时内没有收到心跳,并且执行程序在被杀死时正在运行一些任务。

于 2018-05-25T07:01:24.233 回答
0

执行程序可能存在内存问题。因此,您应该在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/spark-default.conf` 为:-

spark.executor.memoryOverhead 1G
spark.driver.memory  1G
于 2017-12-14T16:40:00.803 回答