在 Hadoop 的 MapReduce 过程中,每个 MapTask 处理完数据后,如果存在自定义的 Combiner 类,会先进行一次本地的 Reduce 操作,然后把数据发送到 Partitioner,由 Partitioner 来决定每条记录应该送往哪个 Reduce 节点,默认使用的是 **HashPartitioner**,其核心代码如下:
publicclassHashPartitioner<K, V>extendsPartitioner<K, V> { /** Use {@link Object#hashCode()} to partition. */publicintgetPartition(Kkey, Vvalue, intnumReduceTasks) { return (key.hashCode() &Integer.MAX_VALUE) %numReduceTasks; } }
**`getPartition()`函数的作用:**
(1)获取 key 的哈希值
(2)默认的分发规则为:根据 **key 的 hashcode%reducetask 数**来分发
(3)这样做的目的是可以把`<key,value>`对**均匀地分发**到各个对应编号的 ReduceTask 节点上,达到 ReduceTask 节点的负载均衡。