MapReduce中shuffle阶段如何确定每个key分配到哪个reducer
MapReduce Shuffle阶段Key分配到Reducer的规则
Shuffle阶段的Key分区逻辑由Partitioner组件控制,默认采用哈希分区策略,具体规则如下:
- 核心计算逻辑为:
reducer索引 = (key.hashCode() & Integer.MAX_VALUE) % reducer总数量- 先调用Key的
hashCode()方法获取哈希值 - 和
Integer.MAX_VALUE做按位与运算,过滤掉负数哈希值,避免得到负的reducer索引 - 对配置的reducer总数量取模,得到最终对应的reducer索引
- 先调用Key的
- 该规则天然保证相同的key一定会被分配到同一个reducer处理,完全满足单词计数这类需要同key聚合的作业需求
- 如果你有特殊的分区需求(比如按key的前缀分组、解决数据倾斜),可以继承
Partitioner类重写getPartition方法,作业运行时指定自定义的Partitioner实现即可
对应示例的验证
你给出的案例里配置了3个reducer,模拟计算如下:
假设三个单词的哈希值计算后:
- word1的哈希值模3结果为0,对应分配到reducer1
- word2的哈希值模3结果为1,对应分配到reducer2
- word3的哈希值模3结果为2,对应分配到reducer3
刚好匹配你举例的分配场景。
注意:默认分区仅保证同key路由到同一reducer,不保证不同key的分布均匀,如果出现单key数据量过大的倾斜问题,需要自定义分区逻辑优化。
内容的提问来源于stack exchange,提问作者Itération 122442
相关产品推荐
相关产品推荐

