使用Hadoop寻找用户的好友列表
1.问题描述
假定有一个社会网络A,每一个顶点表示一位用户,每一条边表示连接的两位用户是好友。A=(V,G),其中V是用户的集合,G是边的集合,即好友的集合。用文件分别保存V和G的数据,示例如下。例如G文件中,“a,b”表示用户a和用户b是好友。
#V文件:
a
b
c
…
#G文件:
a,b
a,c
b,e
b,k
…
找出每一位用户的好友,输出好友列表,每一行代表一个用户和他的好友列表。例如:
a: b,c,e,g,k
b: a,e,k
c: a,d,g
……
2.思路
MapReduce执行时会把文件切分为不同的分片,每个分片输入到不同的Map任务上。这里Map的输入采用的是Hadoop默认的<key, value>,即文件的行号作为key,文件的一样作为value。比如G文件的第一行内容为“a,b”,那么Map此时的输入是<1, “a,b”>。Map端要做的事就是将得到的value(比如“a,b”)拆分为两个字符串“a”和“b”,然后输出两个键值对(<a,b>和<b,a>)。Reduce端正式处理数据时因为数据在前面经过了Map端和Reduce端的Shuffle过程处理,此时键值对都是有序的,要处理的数据就是<key, value-list>的形式。因为value-list里面可能有相同的字符串,可以在重写的reduce( )函数中定义一个TreeSet集合,然后遍历value-list里面的元素将得到的元素放入TreeSet集合中,得到的集合是有序并且无重复元素的。然后可以遍历TreeSet里面的元素使用字符串拼接作为输出的value,key不变,将<key, value>写入到最终文件中。
3.带注解的MapReduce程序
import java.io.IOException;
import java.util.Set;
import java.util.TreeSet;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class Friends {
//Map处理逻辑具体代码
public static