繁体   English   中英

Spark Shuffle 内存开销问题

[英]Spark Shuffle Memory Overhead Issues

我在设计 Spark 作业(使用 Spark 2.3.x)时经常遇到一些问题。

简而言之:

  • job 本质上是一些昂贵的 shuffle 操作(对具有细粒度的大型数据帧的.groupby.join操作)。 然后将结果写入磁盘(镶木地板)
  • 大多数任务都很快成功
  • 很少有难以解决的任务,需要很长时间,有时会失败
  • 即使作业成功,少数长任务也占运行时间的大部分
  • Yarn 偶尔会杀死一些执行程序,因为它们超出了内存限制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 的键匹配的)不是很大。 (单个组键的聚合不能单独导致内存问题)

我已经尝试过的事情:

  • 增加执行器内存和内存开销 -> 降低失败率,增加运行时间,但也没有解决问题,我遇到了下一个限制。 也有硬件限制
  • 更改了我的 DataFrame 的分区 -> 没有可见效果
  • 增加了 shuffle 服务分区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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM