如何访问在 mapreduce 中扩展 reducer 的静态内部 class 中的静态变量?

How to access the static variable in the static inner class which extends reducer in mapreduce?

下面是我程序的main方法的代码:

public class Path {
public static void main(String[] args) throws Exception {
    ArrayList<String> input = new ArrayList<String> ();
    input.add(args[0]);
    String output0="/output/path2";

    Route r1 =new Route(input,output0,2);
    r1.main(args);
    input.add(output0);
    String output1="/output/path3";

    Route r2 =new Route(input,output1,3);
    r2.main(args);
}}

Class 路由包含一个静态内部 class 扩展映射器和一个静态内部 class 扩展缩减器。 这是 class 路线定义的一部分,它与我的问题有关:

public class Route {
public static int len;
public static String output;
public static ArrayList<String> input = new ArrayList<String> ();

public static class RouteMapper extends Mapper<Object, Text, Text, Text> {
    public void map(Object key,Text value,Context context) throws IOException,InterruptedException {
       //do map
    }
}

public static class RouteReducer extends Reducer<Text, Text, Text, Text> {
    public void reduce(Text key, Iterable<Text> values, Context context) throws IOException,InterruptedException{
       //do reduce
    }
}

public Route(ArrayList<String> in,String out,int l){
    len = l;
    output = out;
    Iterator itr = in.iterator();
    while(itr.hasNext()){
        input.add(itr.next().toString());
    }
}

public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    //some configs of mapreduce
}}

正如您在我的main方法中看到的,静态变量len的值应该是两个map/reduce短语中的2和3。但是,当我尝试在 reduce 短语中将 len 的值写入上下文时,我得到的值为零,这是变量 len 的默认值。
因此,我无法获得我希望的正确结果。我很困惑为什么内部静态 class RouteReducer 无法访问外部 class Route.

的静态变量

Hadoop 是分布式系统。映射器和缩减器实现的编译 classes 被复制到它们在自己的 JVM 中工作的其他节点。因此,main class 和每个任务都会看到相同变量的不同实例。您需要手动将数据从 main class 传递到您的任务。

可以通过 class 将轻量级数据传递给 map 和 reduce 任务 Configuration:

// in main
public static final String CONF_LEN = "conf.len";
...
conf.setInt(CONF_LEN, 3);

// in mapper
@Override
protected void setup(Mapper<Object, Text, Text, Text>.Context context) throws IOException, InterruptedException {
  super.setup(context);
  this.len = context.getConfiguration().getInt(CONF_LEN, -1);
}

大数据可以通过distributed cache传输。