Hadoop Partitioner:了解介绍、语法、实现
已发表: 2020-05-14本 Hadoop Partitioner 教程的基本目标是为您提供 Hadoop 中使用的每个部分的逐点定义。 在这篇文章中,我们将介绍 Hadoop Partitioner 的含义、Hadoop 中对 Partitioner 的需求以及 Hadoop 分区的不良案例。
让我们了解一下 Hadoop Partitioner 是什么。
目录
Hadoop中的分区器是什么?
Partitioner 允许传播输出如何从 map 阶段到 reducer。
Partitioner 控制中间映射输出的关键段。 密钥或密钥的子集用于通过散列函数推断分区。
事实上,Hadoop 结构是一个基于散列的分区器。 Hadoop 中的这个散列函数有助于派生分区。
分区根据键值作用于映射器输出。 相同的键值进入每个映射器中的相同分区。 在这个过程之后,最终的分区被发送到一个reducer。

分区的类决定键和值对的去向。 分区阶段位于 map 和 reduce 阶段的中间。
让我们看看为什么需要 Hadoop Partitioner。
Hadoop 分区器的需求是什么?
获取输入数据集,并在 MapReduce 架构作业阶段生成键值对列表。 这些键值对是在映射阶段形成的。 这发生在输入数据被拆分时,然后由每个任务和映射处理,产生一个键值对列表。
但是,map out 分区发生在 reduce 阶段之前,基于键和值。 这样,所有具有相同值的键都被组合在一起,并且它们会进入同一个 reducer。 因此,即使映射输出在 reducer 上的分布也得到了保证。
Hadoop MapReduce 分区通过确保正确的 key 到正确的 reducer,允许在 reducer 上均匀分布 mapper 输出。
阅读:印度的 Hadoop 开发人员薪水
Hadoop中哈希分区器的语法
这是 Hadoop 中哈希分区器的默认语法。
public int getPartition(K key, V value
int numReduceTasks)
{
return(key.hashCode() & Integer.MAX_VALUE) % numRedudeTasks;
}
Hadoop分区器的实现
要查看在实际应用中使用 Hadoop Partitioner 的示例,让我们查看下表,其中包含建筑物中某个街区的居民数据。
平号 | 姓名 | 性别 | 家庭成员 | 电费单 | |
1101 | 马尼沙 | 女性 | 3 | 1500 | |
1102 | 迪帕克 | 男性 | 4 | 2000 | |
1103 | 桑杰 | 男性 | 3 | 1100 | |
1104 | 尼迪 | 女性 | 2 | 900 | |
1105 | 普拉泰克 | 男性 | 1 | 650 | |
1106 | 戈帕尔 | 男性 | 4 | 1800 | |
1107 | 萨米克沙 | 女性 | 2 | 1300 |
现在让我们编写一个程序,在不同的家庭成员组中按性别查找最高的电费 - 2 到 3 和 4 以下。

给定的数据将作为 input.txt 保存在“/home/Hadoop/HadoopPartitioner”目录中。
键遵循一种模式——特殊键+文件名+行号。 例如,
键 = 输入@1
为此,价值将是
价值 = 1101 \t Manisha \t 女性 \t 3 \t 1500
操作如下:
- 读取值
- 使用 split 函数分隔性别并将它们存储在字符串变量中
String[] str = value.toString().split(“\t”, -2);
字符串性别 = str[2];
- 现在将性别信息和记录数据值作为 ley 和 value 对发送到分区任务
context.write(新文本(性别),新文本(值));
- 对所有记录重复
作为输出,您将获得排序后的性别数据和数据值作为键值对。
这是分区程序任务的执行方式。
首先,分区器会将发送给它的键值对作为输入。 现在,它将数据分成不同的段。
输入
键 = 性别字段值
value = 该性别的记录值
以下是该过程将如何进行。
- 从键值对中读取家庭成员值
String[] str = value.toString().split(“\t”);
int age = Integer.parseInt(str[3]);
- 通过以下条件检查家庭成员的价值
- 家庭成员 2 至 3
- 家庭成员少于 4 人
如果(家庭成员<4)
{
返回0;
}
否则如果(家庭成员>=2 && 家庭成员<=3)
{
返回 1 % numReduceTasks;
}
别的
{
返回 2 % numReduceTasks;
}
输出
键值对的数据将被分割成三个给定的集合。
另请学习:您应该了解的最佳 Hadoop 工具
糟糕的分区和克服它
让我们假设您可以预测输入数据中的一个键将比任何其他键显示得更多。 因此,您可能需要将所有密钥(一个巨大的数字)发送到一个分区,然后通过它们的 hashCode() 将剩余的密钥分配给所有其他分区。
因此,现在您有两种向分区发送信息的机制:
- 首先,显示更多的密钥将被发送到一个分区
- 其次,所有剩余的键将根据它们的 hashCode() 发送到分区。
现在,假设您的 hashCode() 技术没有正确地将其他键分布在分区上。 因此,信息在分区和归约器中的传播并不相同。 这是因为每个分区都与一个 reducer 成正比。

因此,某些 reducer 会比其他 reducer 拥有更多的数据。 因此,由于手头的负载,剩余的 reducer 将不得不等待一个 reducer(一个带有用户定义键的)。
在这种情况下,您应该遵循一种可以在不同的 reducer 之间共享数据的方法。 通过我们的 Hadoop 终极教程了解有关 Hadoop 的更多信息。
结论
我们希望这份关于 Hadoop 分区器的指南对您有所帮助。 有关此主题的更多信息,请与 upGrad 的专家联系,我们将帮助您渡过难关。
如果您有兴趣了解有关大数据的更多信息,请查看我们的 PG 大数据软件开发专业文凭课程,该课程专为在职专业人士设计,提供 7 多个案例研究和项目,涵盖 14 种编程语言和工具,实用的动手操作研讨会,超过 400 小时的严格学习和顶级公司的就业帮助。
从世界顶级大学在线学习软件开发课程。 获得行政 PG 课程、高级证书课程或硕士课程,以加快您的职业生涯。
