Spark:如何在所有分区中均匀分配我的记录

时间:2015-11-17 23:19:55

标签: apache-spark

我有一个带30条记录的RDD(键/值对:键是时间戳,值是JPEG字节数组)
我正在运行30个遗嘱执行人。我想将此RDD重新分区为30个分区,以便每个分区获得一条记录并分配给一个执行程序。

当我使用rdd.repartition(30)时,它会在30个分区中重新分区我的rdd,但是有些分区获得2条记录,有些分区获得1条记录,有些分区没有获得任何记录。

Spark中是否有任何方法可以将记录均匀地分发到所有分区。

2 个答案:

答案 0 :(得分:1)

可以使用

Salting 技术,该技术包括添加新的“假”密钥并与当前密钥一起使用,以更好地分配数据。

here is link for salting

答案 1 :(得分:0)

您可以使用partitionBy命令强制执行新分区并提供多个分区。默认情况下,分区程序是基于散列的,但您可以切换到基于范围的分区以获得更好的分发。如果你真的想强制重新分区,可以使用随机数生成器作为分区函数(在PySpark中)。

my_rdd.partitionBy(pCount, partitionFunc = lambda x: np.random.randint(pCount))
但是,这会经常导致效率低下(节点之间传输大量数据),但如果您的进程受计算限制,则可能有意义。