我想问一下 Hadoop 分区器,它是在 Mappers 中实现的吗?如何衡量使用默认哈希分区器的性能 - 是否有更好的分区器来减少数据倾斜?
谢谢
我想问一下 Hadoop 分区器,它是在 Mappers 中实现的吗?如何衡量使用默认哈希分区器的性能 - 是否有更好的分区器来减少数据倾斜?
谢谢
分区器不在 Mapper 中。
以下是每个 Mapper 中发生的过程 -
以下是每个 Reducer 中发生的过程
现在每个 Reducer 从每个 mapper 收集所有文件,它进入排序/合并阶段(排序已经在 mapper 端完成)合并所有 map 输出并保持排序顺序。
在归约阶段,针对排序输出中的每个键调用归约函数。
下面是代码,说明了键分区的实际过程。getpartition() 将根据其哈希码返回特定密钥必须发送到的分区号/reducer。每个键的哈希码必须是唯一的,并且在整个环境中,哈希码对于一个键应该是唯一且相同的。为此,hadoop 为其键实现了自己的哈希码,而不是使用 java 默认哈希码。
Partition keys by their hashCode().
public class HashPartitioner<K, V> extends Partitioner<K, V> {
public int getPartition(K key, V value,
int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
}
Partitioner 是介于 Mappers 和 Reducers 之间的关键组件。它在 Reducer 之间分发地图发出的数据。
Partitioner 在每个 Map Task JVM(java 进程)中运行。
默认分区HashPartitioner
器基于 Hash 函数工作,与其他分区器(如TotalOrderPartitioner
. 它在每个地图输出键上运行哈希函数,即:
Reduce_Number = (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
要检查 Hash Partitioner 的性能,请使用 Reduce 任务计数器并查看 reducer 之间的分布情况。
Hash Partitioner 是基本的分区器,不适合处理高偏度的数据。
为了解决数据倾斜问题,我们需要Partitioner.java
从 MapReduce API 编写自定义分区器类扩展类。
自定义分区器的示例就像RandomPartitioner
. 这是在 reducer 之间均匀分布倾斜数据的最佳方法之一。