(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任务,实现思想也是一样的。具体实现代码如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。