Spark重新分区不均匀分布记录

Posted

技术标签:

【中文标题】Spark重新分区不均匀分布记录【英文标题】:Spark repartition does not distribute records evenly 【发布时间】:2017-07-30 14:25:21 【问题描述】:

我有一个 rdd,我按一个字段重新分区

   rdd = rdd.repartition( new Column("block_id"));

并将其保存到 hdfs。

我预计如果有 20 个不同的 block_id,重新分区将产生 20 个新分区,每个分区都包含不同的 block_id。 但实际上重新分区后有 19 个分区,每个分区正好有一个block_id,一个分区有两个block_id。 这意味着内核将具有两个block_id 的分区写入磁盘所需的时间是其他内核的两倍,因此总时间加倍。

【问题讨论】:

我很困惑,RDD 上的方法repartition 只需要Int,而不是Column 【参考方案1】:

Spark Dataset 使用哈希分区。不能保证不会有hash colisions 所以你不能指望:

如果有 20 个不同的 block_id,重新分区将产生 20 个新分区,每个分区都有不同的 block_id

您可以尝试增加分区的数量,但使用提供良好保证的数量是相当不切实际的。

使用 RDD,您可以设计自己的分区器How to Define Custom partitioner for Spark RDDs of equally sized partition where each partition has equal number of elements?

【讨论】:

以上是关于Spark重新分区不均匀分布记录的主要内容,如果未能解决你的问题,请参考以下文章

Spark高效的groupby操作-重新分区?

火花重新分配不均匀,仍然偏斜

Spark:按键重新分区输出

Spark2.4.3 中方法不存在错误导致重新分区失败

从Spark limit()函数重新分区数据帧

Spark DataFrame重新分区:未保留的分区数