提高 Spark denormalization/partition 性能

Improve Spark denormalization/partition performance

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

我正在使用 Spark 2.4.0/pyspark dataframe,为所有 table 连接广播连接,动态分区插入,最后使用 coalasce 来控制输出文件的数量。 (在最后阶段看到一个洗牌可能是因为动态分区插入)

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

我也在考虑这个 - 通过确定分区并并行写入分区来使用静态分区写入 - 这是否有助于加速或避免随机播放?

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

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

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

  2. 确保正确压缩了基表。在某些情况下,这甚至可能消除对#1 的需求,并减少任务数量,从而减少任务调度带来的开销。