为什么 MRJob 对我的密钥进行排序?

Why is MRJob sorting my keys?

我是 运行 一个相当大的 MRJob 作业(1,755,638 个键),键正在按排序顺序写入 reducer。即使我指定 Hadoop 应该使用散列分区程序,也会发生这种情况:

class SubClass(MRJob):

    PARTITIONER = "org.apache.hadoop.mapred.lib.HashPartitioner"

...

我不明白为什么要对键进行排序,而我并没有要求对它们进行排序。

当您没有明确指定任何分区程序时,默认使用 HashPartitioner

MR 对 key/value 对进行键排序,这样它可以确保给定键的所有值都一起传递给 reducer。事实上,传递给 reduce() 方法的 Iterable 只是读取排序后的列表,直到它找到一个新键,然后它停止迭代。这就是键总是按顺序出现的原因。

键默认不排序,但如果数据集较小,HashPartitioner 会给出外观排序键。当我将数据集的大小从 50M 增加到 10G 时,键停止排序。