MapReduce分区程序实现
为了方便起见,让我们假设我们有一个名为Employee的小表,其中包含以下数据。我们将使用此样本数据作为输入数据集来演示分区程序的工作方式。
Id |
Name |
Age |
Gender |
Salary |
1201 |
gopal |
45 |
Male |
50,000 |
1202 |
manisha |
40 |
Female |
50,000 |
1203 |
khalil |
34 |
Male |
30,000 |
1204 |
prasanth |
30 |
Male |
30,000 |
1205 |
kiran |
20 |
Male |
40,000 |
1206 |
laxmi |
25 |
Female |
35,000 |
1207 |
bhavya |
20 |
Female |
15,000 |
1208 |
reshma |
19 |
Female |
15,000 |
1209 |
kranthi |
22 |
Male |
22,000 |
1210 |
Satish |
24 |
Male |
25,000 |
1211 |
Krishna |
25 |
Male |
25,000 |
1212 |
Arshad |
28 |
Male |
20,000 |
1213 |
lavanya |
18 |
Female |
8,000 |
我们必须编写一个应用程序来处理输入数据集,以找到不同年龄段(例如,低于20岁,21至30岁,高于30岁)中按性别划分的薪水最高的员工。
输入数据
以上数据另存为input.txt在“/home/hadoop/hadoopPartitioner”目录中,并作为输入提供。
根据给定的输入,以下是该程序的算法说明。
Map任务
当我们将文本数据保存在文本文件中时,map任务接受键值对作为输入。此地图任务的输入如下-
- 输入- 键将是一种模式,例如“任何特殊键+文件名+行号”(示例:key = @input1),值将是该行中的数据(示例:value = 1201\tgopal\t45\t男性\t50000)。
- 方法- 此映射任务的操作如下-
- 从字符串中的参数列表中读取作为输入值的值(记录数据)。
- 使用split函数,将性别分开并存储在字符串变量中。
- 将性别信息和记录数据值作为输出键值对从映射任务发送到分区任务。
- 对文本文件中的所有记录重复上述所有步骤。
- 输出-您将获得性别数据和记录数据值作为键值对。
分区任务
分区器任务接受来自映射(Map)任务的键-值对作为其输入。分区意味着将数据划分为多个段。根据给定的分区条件条件,可以将输入的键值对数据根据年龄条件分为三部分。
- 输入 - 键值对集合中的整个数据。键 = 记录中的性别字段值。值= 该性别的整个记录数据值。
- 方法-分区逻辑的过程如下运行。
- 从输入键值对中读取年龄字段值。
在以下条件下检查年龄值。
- 年龄小于或等于20
- 年龄大于20岁且小于或等于30岁。
- 年龄大于30岁。
- 输出-键值对的整个数据被分为三个键值对集合。Reducer在每个集合上单独工作。
Reducer任务
分区程序任务的数量等于简化(Reducer)程序任务的数量。在这里,我们有三个分区程序任务,因此有三个要执行的Reducer任务。
- 输入-Reducer将使用不同的键值对集合执行三次。键=记录中的性别字段值。值=该性别的整个记录数据。
- 方法-以下逻辑将应用于每个集合。
- 读取每个记录的薪金字段值。
- 用max变量检查薪水。如果str[4]是最高工资,则将str [4]分配给max,否则跳过该步骤。
- 对每个key集合重复步骤1和2(Male 和 Female是key集合)。执行完这三个步骤后,您将从“Female”钥匙集合中找到一个最高薪水,从“Male”钥匙集合中找到一个最高薪水。
- 输出-最后,您将在三个不同年龄组的集合中获得一组键值对数据。它分别包含每个年龄组中男性收入的最高薪水和女性收入的最高薪水。
执行Map,Partitioner和Reduce任务后,键-值对数据的三个集合存储在三个不同的文件中作为输出。
所有这三个任务都被视为MapReduce作业。这些作业的以下要求和规格应在“配置”中指定-
- 工作名称
- 键和值的输入和输出格式
- Map,Reduce和Partitioner任务的各个类
范例程序
以下程序显示了如何在MapReduce程序中为给定条件实现分区程序。
将以上代码另存为“ /home/hadoop/hadoopPartitioner”中的PartitionerExample.java。该程序的编译和执行如下。
编译与执行
让我们假设我们位于Hadoop用户的主目录中(例如/home/hadoop)。
请按照下面给出的步骤来编译和执行上述程序。
让我们假设下载的文件夹是“/home/hadoop/hadoopPartitioner”
步骤2-以下命令用于编译程序PartitionerExample.java并为该程序创建一个jar。
步骤3 - 使用以下命令在HDFS中创建输入目录。
步骤4-使用以下命令将名为input.txt的输入文件复制到HDFS的输入目录中。
步骤5-使用以下命令来验证输入目录中的文件。
步骤6-使用以下命令通过从输入目录获取输入文件来运行最高薪水应用程序。
等待一段时间,直到文件被执行。执行后,输出包含许多输入拆分,Mapper任务和Reducer任务。
步骤7-使用以下命令来验证输出文件夹中的结果文件。
您将在三个文件中找到输出,因为您在程序中使用了三个分区程序和三个Reducer。
步骤8-使用以下命令查看Part-00000文件中的输出。该文件由HDFS生成。
part-00000 输出
使用以下命令查看Part-00001文件中的输出。
在part-00001中输出
使用以下命令查看Part-00002文件中的输出。
在part-00002中输出