我正在尝试为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++中,它非常简单——只需在所有外部向它声明)??
1条答案
按热度按时间qxsslcnc1#
不清楚你在做什么,但不管怎样:你宣布
static
计数器变量输入GraphSearch
类,它是一个hadoop作业类。hadoop作业在hadoop节点自己的jvm中运行。hadoop中的Map器在单独的jvm中运行,并且有自己的这个变量示例。这就是你的代码不能工作的原因。我不知道你的算法应该如何工作,所以我不建议任何更改。从hadoop教程开始,了解map reduce算法的思想。