内容
1. Hadoop?Partitioner / MapReduce?Partitioner
在本章中,我们讨论什么是Hadoop分区器。 MapReduce中的分区控制中间映射器输出键的分区。通过散列函数,key(或key的一个子集)被用来派生分区。分区总数取决于reduce任务的数量。在这里,我们还将了解Hadoop分区器的需求,Hadoop分区器的默认设置。
2.?什么是Hadoop分区器?
在开始使用MapReduce分区器之前,让我们先了解一下Hadoop中的Hadoop映射器,Hadoop Reducer和combiner?
Intermediate map output的键的分区由分区器控制。通过散列函数,key(或key的一个子集)被用来派生分区。根据键值对每个映射器输出进行分区,并将具有相同键值的记录放入同一分区(每个映射器内),然后将每个分区发送到reducer。 Partitioner Class确定给定(键,值)对将要分配的分区。分区阶段发生在映射阶段之后和Reduce阶段之前。
3.?需要Hadoop MapReduce分区器吗?
现在我们来讨论一下Hadoop中Mapreduce分区器的需求?
MapReduce作业接受一个输入数据集并生成键值对的列表,该列表是输入数据分割的映射阶段结果,每个任务处理分割和每个映射,输出键值对列表。然后,mapper 的输出发送到Reducer?的输入。但是在reducer阶段之前,mapper输出的划分是在key的基础上进行的,并进行排序。
此分区指定将每个键的所有值都组合在一起,并确保单个键的所有值都到同一个reducer,从而允许通过reducer均匀分布mapper输出。 Hadoop MapReduce中的分区程序通过确定哪个reducer负责特定的key,将映射器输出重定向到reducer。
4.?默认的MapReduce分区器
Hadoop MapReduce中的默认Hadoop分区程序是Hash分区程序,它计算key的哈希值并根据此结果分配分区。
5. Hadoop中有多少个分区器?
在Hadoop中运行的分区程序总数等于reducer的数量,即Partitioner将根据JobConf.setNumReduceTasks()方法设置的reducer数来分割数据。因此,来自单个分区器的数据由一个reducer处理。分区程序仅在存在多个reducer时创建。
6.?Poor Partitioner
如果在数据输入中一个键出现比其他键更多。在这种情况下,我们使用两种机制将数据发送到分区。
出现更多的key将被发送到一个分区。
所有其他key将根据其hashCode()发送到分区。
但是如果hashCode()方法不能在分区范围内均匀地分配其他key数据,那么数据将不会均匀地发送给reducer。 对数据分区不好意味着一些reducer将拥有比其他更多的数据输入,即他们将比其他reducer有更多的工作要做。 所以,整个工作将等待别的reducer完成其超大的负载份额。
如何克服MapReduce中糟糕的分区?
为了克服Hadoop MapReduce中不好的分区器,我们可以创建自定义分区器,它允许在不同的reducer中统一共享工作负载。
7. Hadoop MapReduce – 结论
总而言之,Hadoop分区器允许通过reducer分配map输出。 在分区程序中,map输出的分区是根据键和排序进行的。