我想问一下Hadoop分区器,它是在Mappers中实现的吗?如何衡量使用默认哈希分区器的性能 - 是否有更好的分区器来减少数据偏差?
Thanks
分区器不在映射器内。
以下是每个映射器中发生的过程 -
- 每个映射任务将其输出写入循环缓冲存储器(而不是磁盘)。
当缓冲区达到阈值时,后台线程开始将内容溢出到磁盘。 [缓冲区大小由mapreduce.task.io.sort.mb属性控制,默认为100MB,溢出由mapreduce.io.sort.spill.percent属性控制,默认为0.08或80%]。在溢出到磁盘之前
数据根据它们将被发送到的减速器进行分区
在每个分区内按键执行内存排序
- 对每种排序的结果运行组合器函数(减少写入和传输的数据,这需要专门完成)
- 压缩(可选)[mapred.compress.map.output=true; mapred.map.output.compression.codec=编解码器名称]
- 写入磁盘和输出文件的分区可通过 HTTP 供减速器使用。
下面是每个Reducer中发生的过程
下面是代码,说明了键分区的实际过程。 getpartition() 将返回特定键必须根据其哈希码发送到的分区号/化简器。每个键的哈希码必须是唯一的,并且在整个环境中,键的哈希码应该是唯一且相同的。为此,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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)