gpt4 book ai didi

hadoop - Shuffle write 大和 spark task 变得超慢时的优化

转载 作者:可可西里 更新时间:2023-11-01 14:56:02 25 4
gpt4 key购买 nike

有一个 SparkSQL 将连接 4 个大表(前 3 个表 5000 万,最后一个表 2 亿)并进行一些分组操作,消耗 60 天的数据。并且此 SQL 将需要 2 小时才能运行,在此期间,我检查到 Shuffle Write 正在急剧增加,可能会超过 200GB。

相比之下,当我将消耗日期范围从 60 天减少到 45 天时,运行只需要 6.3 分钟。我查看了 DAG 图,对于 45 天的数据,它在最后一次 sortMergeJoin 之后输出了 10 亿条数据。

谁能告诉我我可以从哪个方向优化这个场景?谢谢!

附言

可能的相关信息:

  • Spark.version=2.1.0
  • spark.executor.instances=20
  • spark.executor.memory=6g
  • spark.yarn.executor.memoryOverhead=5g

最佳答案

您需要对数据进行分区以正确并行化作业,确保 Spark UI 分区中的数据正确分布。

Spark 中连接的默认实现是随机哈希连接。混洗哈希连接通过使用与第一个相同的默认分区器对第二个数据集进行分区来确保每个分区上的数据将包含相同的键,以便来自两个数据集的具有相同哈希值的键位于同一分区中。虽然这种方法总是有效,但它可能比必要的更昂贵,因为它需要洗牌。如果出现以下情况,则可以避免洗牌:

  • 两个 RDD 都有一个已知的分区器。

  • 其中一个数据集小到可以放入内存,在这种情况下我们可以进行广播散列连接

最简单的优化是,如果其中一个数据集足够小以适合内存,则应该将其广播到每个计算节点。这种用例非常常见,因为数据始终需要与辅助数据(例如字典)结合。

大多数情况下,由于在网络上混洗了太多数据,连接速度很慢。通过 Broadcast join,较小的数据集被复制到所有工作节点,因此较大的 DataFrame 的原始并行性得以保持。

https://spark.apache.org/docs/latest/tuning.html

关于hadoop - Shuffle write 大和 spark task 变得超慢时的优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46652657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com