【发布时间】:2018-11-29 19:30:27
【问题描述】:
我们有一个使用 Scala 编写的 Spark 2.2 作业,在 YARN 集群中运行,它执行以下操作:
- 将数千个小型压缩 parquet 文件(每个约 15kb)读取到两个数据帧中
- 将数据框加入一列
- Foldleft 覆盖所有列以清理一些数据
- 删除重复项
- 将结果数据框写入镶木地板
以下配置通过 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,这项工作可以可靠地工作。这给了每个执行者 1g 的 ram。
如果我们执行以下任何操作,此作业也会失败:
- 增加执行者
- 增加默认并行度或 spark.sql.shuffle.partitions
谁能帮我理解为什么更多的内存和更多的执行程序会由于 OutOfMemory 导致作业失败?
【问题讨论】:
标签: scala apache-spark memory hadoop-yarn