我构建了一个具有 17-20 个连接的 Spark SQL 查询。我的驱动表大小约为 40GiB,其他 2-3 个表的数据为 1-2 TB,其他表的数据约为 3-4GiB。我用 16 个节点的 8xLarge 集群(32 个核心,128GiB 内存)尝试了这项工作,但没有成功。我尝试使用 16xLarge 集群的 16 个节点(64 个核心,256GiB 内存)来完成这项工作。我深入研究这个问题,发现有 2 个分区(倾斜分区)包含大量数据。有人可以帮助我如何识别查询中的倾斜部分以及如何删除或拆分这些倾斜分区。我还尝试了所有 AQE 选项。
使用这样的查询,您可以测量每个分区字段的记录数。假设您有年、月和日的分区 (y,m,d):
SELECT
y,m,d
,count(*) records
FROM
TABLENAME
GROUP BY
y,m,d
注意我只按分区字段进行查询和分组。这确保了快速的性能。记录计数是表元数据的一部分,因此可以非常快速地计算。
给定一个具有过大(倾斜,就相对大小而言)分区的表,您可以使用上面的查询来识别问题分区,然后您可以决定如何平衡数据(这很大程度上取决于数据的类型和如果可能的话,添加另一个分区或将现有数据(来自大分区)重新分布到其他分区是否有意义)。