如何访问在 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传输。
下面是我程序的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传输。