gpt4 book ai didi

Hadoop分区器

转载 作者:可可西里 更新时间:2023-11-01 14:21:09 26 4
gpt4 key购买 nike

我想问一下Hadoop partitioner,它是在Mappers中实现的吗?。如何衡量使用默认哈希分区器的性能 - 是否有更好的分区器来减少数据倾斜?

谢谢

最佳答案

Partitioner 不在 Mapper 中。

下面是每个Mapper中发生的过程-

  • 每个映射任务将其输出写入循环缓冲存储器(而不是磁盘)。当缓冲区达到阈值时,后台线程开始将内容溢出到磁盘。 [缓冲区大小由 mapreduce.task.io.sort.mb 属性控制,默认为 100 MB,溢出由 mapreduce.io.sort.spill.percent 属性控制,默认为 0.08 或 80%]。在溢出到磁盘之前数据被分区对应于它们将被发送到的 reducer 在每个分区内按键执行内存排序
  • 对每个排序的结果运行组合器函数(减少数据写入和传输,这需要专门完成)
  • 压缩(可选)[mapred.compress.map.output=true; mapred.map.output.compression.codec=编解码器名称]
  • 写入磁盘和输出文件的分区通过 HTTP 提供给 reducer。

以下是每个 Reducer 中发生的过程

  • 现在每个 Reducer 从每个映射器收集所有文件,它进入排序/合并阶段(排序已经在映射器端完成)合并所有映射输出并保持排序顺序。

    <
  • 在 reduce 阶段,为排序输出中的每个键调用 reduce 函数。

enter image description here

下面是代码,说明了键分区的实际过程。 getpartition() 将根据其哈希码返回特定 key 必须发送到的分区号/reducer。哈希码对于每个键都必须是唯一的,并且在整个景观中哈希码对于一个键应该是唯一且相同的。为此,hadoop 为其 key 实现了自己的哈希码,而不是使用 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;
}

}

关于Hadoop分区器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27595195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com