Spark 2.2在内存或工作人员更多的情况下失败,内存很少且工作人员很少的情况下成功

时间:2018-06-20 15:36:29

标签: scala apache-spark memory yarn

我们在YARN集群中运行的Scala中编写了Spark 2.2作业,该作业执行以下操作:

  1. 将数千个小型压缩实木复合地板文件(每个〜15kb)读取到两个数据帧中
  2. 将数据框加入一列
  3. 在所有列上折叠以清除一些数据
  4. 删除重复项
  5. 将结果数据帧写入实木复合地板

以下配置通过java.lang.OutOfMemory java堆空间失败:

  • -conf spark.yarn.am.memory = 4g
  • -conf spark.executor.memory = 20g
  • -conf spark.yarn.executor.memoryOverhead = 1g
  • -conf spark.dynamicAllocation.enabled = true
  • -conf spark.shuffle.service.enabled = true
  • -conf spark.dynamicAllocation.maxExecutors = 5
  • -conf spark.executor.cores = 4
  • -conf spark.network.timeout = 2000

但是,如果我们完全删除 spark.executor.memory ,此工作将可靠地工作。这会给每个执行者1克ram。

如果我们执行以下任一操作,则此作业也会失败:

  • 增加执行者
  • 增加默认的并行性或spark.sql.shuffle.partitions

有人可以帮助我理解为什么由于内存不足而导致更多的内存和更多的执行程序导致作业失败吗?

1 个答案:

答案 0 :(得分:0)

手动设置这些参数将禁用dynamic allocation。建议您不要尝试,因为它是建议初学者使用的。在您在PROD设置中微调群集大小之前,它对于实验也很有用。

在Spark上添加更多的内存/执行程序似乎是一个好主意,但在您的情况下,这可能会导致额外的改组和/或降低HDFS I / O吞吐量。该article稍有过时并针对Cloudera用户,它说明了如何通过调整执行程序的大小来调整并行性。