默认情况下,Hadoop 使用默认的Hash 分区器 - 单击此处,类似于
public class HashPartitioner<K2, V2> implements Partitioner<K2, V2> {
public void configure(JobConf job) {}
/** Use {@link Object#hashCode()} to partition. */
public int getPartition(K2 key, V2 value,
int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
}
key.hashCode() & Integer.MAX_VALUE) % numReduceTasks 将返回一个介于 0 到 numReduceTasks 之间的数字,在您的情况下,范围为 0 到 5,因为 numRuduceTask=6
该行本身就存在问题 - 两个这样的语句可能会返回相同的数字。并且,因此两个不同的键可以进入同一个减速器。例如-
("go".hashCode() & Integer.MAX_VALUE) % 6
将返回您 4 并且,
("hello".hashCode() & Integer.MAX_VALUE) % 6
也会返回给你 4。
所以,我在这里建议的是,如果你想确保你的所有 6 个键都被 6 个不同的 reducer 处理,你需要创建自己的分区器来获得你想要的。
如果您有任何困惑,请查看此链接以创建自定义分区器,并使用 Job 类指定您的自定义分区器,如下所示。
job.setPartitioner(<YourPartionerHere.class>);
希望这可以帮助。