作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们的任务是创建 map reduce 函数,该函数将为 google 网络图中的每个节点 n 输出,列出您可以在 3 跳中从节点 n 到达的节点。 (实际数据可以在这里找到:http://snap.stanford.edu/data/web-Google.html)
以下是列表中项目的示例:
1 2
1 3
2 4
3 4
3 5
4 1
4 5
4 6
5 6
public class AdjacentsListDriver extends Configured implements Tool {
@Override
public int run(String[] args) throws Exception {
Configuration conf = getConf();
Job job = Job.getInstance(conf);
job.setJobName("Test driver");
job.setJarByClass(AdjacentsListDriver.class);
String[] arg0 = new GenericOptionsParser(conf, args).getRemainingArgs();
if (arg0.length != 2) {
System.err.println("Usage: hadoop jar <my_jar> <input_dir> <output_dir>");
System.exit(1);
}
Path in = new Path(arg0[0]);
Path out = new Path(arg0[1]);
FileInputFormat.setInputPaths(job, in);
FileOutputFormat.setOutputPath(job, out);
job.setMapperClass(ListMapper.class);
job.setReducerClass(ListReducer.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.waitForCompletion(true);
return 0;
}
public static void main(String[] args) throws Exception {
int res = ToolRunner.run(new Configuration(), new AdjacentsListDriver(), args);
System.exit(res);
}
}
/**
* @author George
* Theoretically this takes a key(vertexID) and maps all nodes that are connected to it in one hop....
*
*/
public class ListMapper extends Mapper<LongWritable, Text, Text, Text> {
private Text vertexID = new Text();
//private LongWritable vertice= new LongWritable(0);
private Text vertice=new Text();
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer itr = new StringTokenizer(line,"\n");
StringTokenizer itrInside;
//vertice=new LongWritable(Long.valueOf(value.toString()).longValue());
while (itr.hasMoreTokens()) {
if(itr.countTokens() > 2){
}//ignore first line ??
else{
itrInside=new StringTokenizer(itr.toString());
vertexID.set(itr.nextToken());
while(itrInside.hasMoreTokens()){
vertice.set(itrInside.nextToken());
context.write(vertexID, value);
}
}
}
}
}
@override
public class ListReducer extends Reducer<Text, Text, Text, Text>{
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
String vertices="";
for (Text value : values) {
if(vertices=="")
vertices+=value.toString();
else
vertices=vertices+","+value.toString();
}
Text value=new Text();
value.set(vertices);
context.write(key, value);
}
}
最佳答案
由于这是您的(家庭作业)作业,因此我不会包括 Java/Hadoop 解决方案,但我会尝试使 MapReduce 的图形计算概念对您更清晰一些,以便您可以自己实现它。
对于每个顶点,您想要 的顶点正好 n 跳远。在查看最短路径算法时,您走在正确的路径上,但通过简单的广度优先搜索可以更轻松地解决该问题。
然而,当使用 MapReduce 处理图形时,您需要更深入地研究顶点之间的消息传递。图算法通常用多个作业表示,其中 map 和 reduce 阶段具有以下分配:
map input tuple (X, Y):
emit (X, Y)
reduce input (X, Y[]) :
emit (X, Y[])
HopMessage: Origin (VertexID) | HopCounter(Integer)
map input (VertexID key, either HopMessage or List<VertexID> adjacents):
if(iterationNumber == 1): // only in the first iteration to kick off
for neighbour in adjacents:
emit (neighbour, new HopMessage(key, 0))
emit (key, adjacents or HopMessage) // for joining in the reducer
1 2 // graph
2 1 // hop message
2 3 // graph
3 1 // hop message
3 4 // graph
4 1 // hop message
4 - // graph
reducer input(VertexID key, List<either HopMessage or List<VertexID> neighbours> values):
for hopMessage in values:
hopMessage.counter += 1
if (hopMessage.counter == 3)
emit to some external resource (HopMessage.origin, key)
else
for neighbour in neighbours of key:
emit (neighbour, hopMessage)
emit (key, neighbours)
public static class NthHopVertex extends Vertex<Text, NullWritable, HopMessage> {
@Override
public void compute(Iterable<HopMessage> messages) throws IOException {
if (getSuperstepCount() == 0L) {
HopMessage msg = new HopMessage();
msg.origin = getVertexID().toString();
msg.hopCounter = 0;
sendMessageToNeighbors(msg);
} else {
for (HopMessage message : messages) {
message.hopCounter += 1;
if (message.hopCounter == 3) {
getPeer().write(new Text(message.origin), getVertexID());
voteToHalt();
} else {
sendMessageToNeighbors(message);
}
}
}
}
}
1=[1, 5, 6]
2=[2, 3, 6]
3=[2, 3, 6]
4=[4, 5]
关于java - Hadoop Map Reduce For Google web graph,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20774253/
我是一名优秀的程序员,十分优秀!