[英]Spark Shuffle Memory Overhead Issues
我在设计 Spark 作业(使用 Spark 2.3.x)时经常遇到一些问题。
简而言之:
.groupby
或.join
操作)。 然后将结果写入磁盘(镶木地板)yarn.YarnAllocator: Container killed by YARN for exceeding memory limits. 18.0 GB of 18 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
由于超出内存限制yarn.YarnAllocator: Container killed by YARN for exceeding memory limits. 18.0 GB of 18 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
yarn.YarnAllocator: Container killed by YARN for exceeding memory limits. 18.0 GB of 18 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
org.apache.spark.SparkException: Job aborted due to stage failure: Task 175 in stage 92.0 failed 4 times
我想知道单个任务怎么会有这么高的内存消耗。 根据我对 Spark 工作原理的理解,应该可以使任务足够小,以便它们适合内存。 此外,很少有任务占据了大部分运行时间,这也是次优并行化的标志。 分组单元内的数据(组 -> 所有与 groupBy 或 join 的键匹配的)不是很大。 (单个组键的聚合不能单独导致内存问题)
我已经尝试过的事情:
spark.sql.shuffle.partitions
-> 降低了失败率,但也增加了运行时间任何提高性能和稳定性的想法?
编辑:
一些进一步的调查显示,我们确实有非常倾斜的数据集。 似乎一些非常大的行的映射操作对于火花执行器处理来说非常大。
我增加了随机分区数。 我大量增加了执行程序内存。 我更改了 spark 错误日志中推荐的配置设置。 现在作业运行时没有警告/错误,但运行时间严重增加。
--executor-memory 32g
--driver-memory 16g
--conf spark.executor.memoryOverhead=8g
--conf spark.driver.maxResultSize=4g
--conf spark.sql.shuffle.partitions=3000
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.