Map器函数中的静态变量值未更改

roejwanj  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(319)

我正在尝试为bfs图形算法编写迭代mapreduce,以便指定何时停止迭代,我正在尝试使用计数器
代码是

public class GraphSearch extends Configured implements Tool {

static int counter=0;

public static class MapClass extends MapReduceBase implements
Mapper<LongWritable, Text, IntWritable, Text> {

    public void map(LongWritable key, Text value, OutputCollector<IntWritable, Text> output,
            Reporter reporter) throws IOException {

        Node node = new Node(value.toString()) ;

        if (node.getColor() == Node.Color.GRAY) {
            if(node.getDistance()==Integer.MAX_VALUE)
                node.setDistance(0);

            for (int v : node.getEdges()) {

                Node vnode = new Node(v);

                    vnode.setDistance(node.getDistance() + 1);
                    vnode.setColor(Node.Color.GRAY);
                    output.collect(new IntWritable(vnode.getId()), vnode.getLine());

            }

            node.setColor(Node.Color.BLACK);
            setCounter(1);

        }

        output.collect(new IntWritable(node.getId()), node.getLine());

    }

    static void setCounter(int i) {
        if(i==1)
        counter=counter+1;
        else
        counter=0;

    }

其思想是当计数器保持为0时,意味着遍历所有节点(所有节点都变为黑色)并完成bfs

private boolean checkForConvergence(int iteration_number){
    if(counter!=0&&iteration_number!=0){
        return true;
    }
     return false
   }

但是setcounter没有显示计数器值的任何更改。怎么办?在java中有没有其他的全局变量的方法(比如在c++中,它非常简单——只需在所有外部向它声明)??

qxsslcnc

qxsslcnc1#

不清楚你在做什么,但不管怎样:你宣布 static 计数器变量输入 GraphSearch 类,它是一个hadoop作业类。hadoop作业在hadoop节点自己的jvm中运行。hadoop中的Map器在单独的jvm中运行,并且有自己的这个变量示例。这就是你的代码不能工作的原因。
我不知道你的算法应该如何工作,所以我不建议任何更改。从hadoop教程开始,了解map reduce算法的思想。

相关问题