首页 > 编程语言 > 详细

基于Mapreduce的并行Dijkstra算法执行过程分析

时间:2020-06-12 23:46:15      阅读:65      评论:0      收藏:0      [点我收藏+]

1.图文件

技术分享图片

 2.执行流程

源代码:https://github.com/masterzjp/dijkstraMapreduce

技术分享图片

3.mapper

技术分享图片
package com.hadoop.dijkstra;
import java.io.IOException;
import java.util.Arrays;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reporter;
public class DijkstraMapper extends MapReduceBase implements Mapper<LongWritable, Text, LongWritable, Text> {
    private static final int MINIMUM_NODE_TOKENS = 3;
    
    public void map(LongWritable key, Text value, OutputCollector<LongWritable, Text> output, Reporter reporter) throws IOException {
        
        String[] tokens = value.toString().split("\t");
        
        System.out.println("tokens input map " + Arrays.toString(tokens));
        
        if(tokens.length >= MINIMUM_NODE_TOKENS){
            String[] adjacentNodeDetails = tokens[2].split(" ");
            String[][] neighborsNode = new String[adjacentNodeDetails.length][2];

            for (int index = 0; index < adjacentNodeDetails.length; index++)
            {
                neighborsNode[index] = adjacentNodeDetails[index].substring(1, adjacentNodeDetails[index].length() - 1).split(",");
            }
            int sourceNodeWeight = Integer.parseInt(tokens[1]);
            //recorriendo los nodos vecinos
            for (int index = 0; index < adjacentNodeDetails.length; index++)
            {
              int weight = sourceNodeWeight + Integer.parseInt(neighborsNode[index][1]); //Nueva distancia desde el origen hacia los nodos vecinos
              
              output.collect(new LongWritable(Integer.parseInt(neighborsNode[index][0])), new Text("dist"+ "\t" + weight));
              System.out.println("vecinos map key: " + neighborsNode[index][0]);
              System.out.println("vecinos map value: " + new Text("dist " + weight));
            }
       }
        
        output.collect(new LongWritable(Integer.parseInt(tokens[0])), new Text("dist"+ "\t" + tokens[1]));
        
        if(tokens.length >= MINIMUM_NODE_TOKENS){
            output.collect(new LongWritable(Integer.parseInt(tokens[0])), new Text("Vertices"+ "\t" + tokens[2]));
            System.out.println("map value vertices: " + new Text("Vertices "+ tokens[2]));
        }
        
        //print salida 
        System.out.println("map value dist: " + new Text("dist "+ tokens[1]) );
        
        
    }

}
View Code

4.reducer

技术分享图片
package com.hadoop.dijkstra;
import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;
public class DijkstraReducer extends MapReduceBase implements Reducer<LongWritable, Text, LongWritable, Text> {

    public void reduce(LongWritable key, Iterator<Text> values,
            OutputCollector<LongWritable, Text> output, Reporter reporter) throws IOException {

        int min = Integer.MAX_VALUE;
        String vertices = "";
        
        //print valores de entrada
        System.out.println("input reduce key " + key);
         
        while (values.hasNext())
        {
            String[] tokens = values.next().toString().split("\t");
            System.out.println("tokens reduce " + Arrays.toString(tokens));
            
            if(tokens[0].equals("Vertices")){
                vertices = tokens[1];
            }
            else if(tokens[0].equals("dist")){
                min = Math.min(Integer.parseInt(tokens[1]), min);
            }
        }
        output.collect(key, new Text(min + "\t" + vertices));
        System.out.println("vertices reduce " + vertices);
    }

}
View Code

基于Mapreduce的并行Dijkstra算法执行过程分析

原文:https://www.cnblogs.com/jingpeng77/p/13110905.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!