【问题标题】:Improve Spark denormalization/partition performance提高 Spark 非规范化/分区性能
【发布时间】:2021-09-22 11:41:18
【问题描述】:

我有一个非规范化用例 - 一个 hive avro 事实表与 14 个较小的维度表连接并生成一个非规范化 parquet 输出表。输入事实表和输出表都以相同的方式分区(Category=TEST1,YearMonthId=202101)。而且我确实运行历史处理,这意味着一次处理和加载给定类别的几个月。

我正在使用 Spark 2.4.0/pyspark 数据帧,所有表连接的广播连接,动态分区插入,最后使用 colasce 来控制输出文件的数量。 (在最后阶段看到随机播放可能是因为动态分区插入)

想知道对管理分区可能进行的优化 - 比如说从输入到输出阶段保持分区一致,这样就不会涉及洗牌。想要利用输入和输出存储表由相同的列分区这一事实。

我也在考虑这个问题 - 通过确定分区并并行写入分区来使用静态分区写入 - 这有助于加快速度还是避免洗牌?

感谢任何能引导我走向正确方向的帮助。

【问题讨论】:

    标签: apache-spark pyspark hive apache-spark-sql


    【解决方案1】:

    我尝试了以下几个提高性能的选项(时间+避免小文件)。

    1. 在进行广播连接之前尝试在数据帧中使用重新分区(而不是合并),这最大限度地减少了 shuffle 并因此减少了 shuffle 溢出。 -- repartition(count, *PartitionColumnList, AnyOtherSaltingColumn) (如果repartition不均匀则添加盐分列)

    2. 确保基表已正确压缩。在某些情况下,这甚至可以消除对 #1 的需求,并减少任务数,从而减少由于任务调度而导致的开销。

    【讨论】:

      猜你喜欢
      • 2014-06-06
      • 2014-08-29
      • 2012-10-08
      • 2011-01-21
      • 1970-01-01
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      相关资源
      最近更新 更多