更新时间:2022-09-30 GMT+08:00

Repartition时有部分Partition没数据

问题

在repartition操作时,分块数“spark.sql.shuffle.partitions”设置为4500,repartition用到的key列中有超过4000个的不同key值。期望不同key对应的数据能分到不同的partition,实际上却只有2000个partition里有数据,不同key对应的数据也被分到相同的partition里。

回答

这是正常现象。

数据分到哪个partition是通过对key的hashcode取模得到的,不同的hashcode取模后的结果有可能是一样的,那样数据就会被分到相同的partition里面,因此出现有些partition没有数据而有些partition里面有多个key对应的数据。

通过调整“spark.sql.shuffle.partitions”参数值可以调整取模时的基数,改善数据分块不均匀的情况,多次验证发现配置为质数或者奇数效果比较好。

在Driver端的“spark-defaults.conf”配置文件中调整如下参数。

表1 参数说明

参数

描述

默认值

spark.sql.shuffle.partitions

shuffle操作时,shuffle数据的分块数。

200