首页 理论教育 多个Mapreduce过程的编程实例

多个Mapreduce过程的编程实例

时间:2023-06-26 理论教育 版权反馈
【摘要】:因此,需要基于上述reduce的结果,再次进行map-reduce的过程。由上述分析可知,实现过程得分成两个MapReduce来实现。两个MapReduce任务之间存在依赖关系,所谓依赖就是一个MapReduce Job的处理结果是另外的MapReduce的输入,以此类推,完成几个mapreduce程序,得到最后的结果,该实例包括两个mapreduce作业,即两个map和两个reduce函数,第一个job处理后的输出是第二个job的输入,然后交由第二个job来做出最后的结果。多个mapreduce任务,实现思想也是一样的。

多个Mapreduce过程的编程实例

(1)任务要求。

已知每个用户名及每个用户的好友,求所以用户之间的共同好友集合。比如用户A和用户B之间有共同好友:C,E,那么求得结果是:A-B C E。

(2)数据说明。

输入数据示例:

A:B,C,D,F,E,O

B:A,C,E,K

C:F,A,D,I

D:A,E,F,L

E:B,C,D,M,L

F:A,B,C,D,E,O,M

G:A,C,D,E,F

H:A,C,D,E,O

I:A,O

J:B,O

K:A,C,D

L:D,E,F

M:E,F,G

O:A,H,I,J,K

其中,数据的格式以“:”分割成两部分,前面是用户,后面是该用户的好友。

以A:B,C,D,F,E,O为例:B,C,D,E,F,O是用户A的好友。

输出数据示例:

A-B E C

A-C D F

A-D E F

A-E B C D

A-F C E O D B

A-G E F C D

A-H C D E O

A-I O

A-J O B

A-K C D

A-L F D E

A-M F E

B-C A

B-D A E

B-E C

B-F C A E

B-G E C A

B-H E C A

B-I A

B-K A C

B-L E

B-M E

B-O A K

C-D A F

C-E D

C-F A D

C-G A D F

C-H D A

C-I A

C-K A D

C-L D F

C-M F

C-O I A

D-E L

D-F A E

D-G E A F

D-H A E

D-I A

D-K A

D-L E F

D-M F E

D-O A

E-F D M C B

E-G C D

E-H C D

E-J B

E-K C D

E-L D

F-G D C A E

F-H A D O E C

F-I O A

F-J B O

F-K D C A

F-L E D

F-M E

F-O A

G-H D C E A

G-I A

G-K D A C

G-L D F E

G-M E F

G-O A

H-I O A

H-J O

H-K A C D(www.xing528.com)

H-L D E

H-M E

H-O A

I-J O

I-K A

I-O A

K-L D

K-O A

L-M E F

以上的数据表示右边的value值就是左边的两个用户的共同好友。

(3)实现思想。

首先,把原始数据:A:B,C,D,F,E,O,通过map()方法拆开为:

A B

A C

A D

A F

其次,通过reduce()方法,把拆开的数据组合为:

A F-I-O-K-G-D-C-H-B

B E-J-F-A

C B-E-K-A-H-G-F

D H-C-G-F-E-A-K-L

E A-B-L-G-M-F-D-H

F C-M-L-A-D-G

G M

H O

I O-C

J O

K O-B

L D-E

M E-F

O A-H-I-J-F-

这种格式的数据表明:key是value中的任意两个用户的共同好友。

例如:AF-I-O-K-G-D-C-H-B-

表示A是F和I的共同好友,A是F和O的共同好友,A是F和K的共同好友,……

上述map-reduce的结果,显然不是最终结果。因此,需要基于上述reduce的结果,再次进行map-reduce的过程。首先利用map()方法,得到下面结果:

F-O A

F-I A

F-K A

F-D A

F-C A

F-H A

I-O A

I-K A

I-G A

I-D A

I-C A

……

最后,再利用reduce()方法得到最终结果:

A-B E C

A-C D F

A-D E F

A-E B C D

A-F C E O D B

A-G E F C D

A-H C D E O

A-I O

A-J O B

A-K C D

A-L F D E

A-M F E

B-C A

B-D A E

B-E C

B-F C A E

B-G E C A

……

(4)具体实现。

由上述分析可知,实现过程得分成两个MapReduce来实现。两个MapReduce任务之间存在依赖关系,所谓依赖就是一个MapReduce Job的处理结果是另外的MapReduce的输入,以此类推,完成几个mapreduce程序,得到最后的结果,该实例包括两个mapreduce作业,即两个map和两个reduce函数,第一个job处理后的输出是第二个job的输入,然后交由第二个job来做出最后的结果。因此需要对工程中输入输出文件进行配置。

1)工程配置。

①工程上右键run进行配置,先配置第一个栏目main里面的Project(项目名)和Main Class(主类名),如图4-13所示。

图4-13 Run Configurations...

②接下来配置arguments,如图4-14所示。

图4-14 配置输入输出文件路径

③点击Apply,然后Run,运行成功之后,刷新DFS,会出现几个文件,如下图所示,分别为输入的原始数据文件,第一个mapreduce任务后输出的文件output和第二个mapreduce任务之后输出的文件output1,如图4-15所示。

图4-15 Project Exploer视图

2)实现代码。

这里只有两个mapreduce任务,主要的思想就是先写好每一个mapreduce任务的主体部分,也就是map和reduce函数,然后分别配置每一个mapreduce任务job,此时将job任务加入控制容器,每一个都要加,再就是使用addDependingJob()添加依赖关系,再用一个总的控制器控制每一个任务。最后利用一个线程启动总任务。多个mapreduce任务,实现思想也是一样的。具体实现代码如下:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈