目标
我想从一个输入文件和一个数组中获得多个输出文件,如picture所述。
我的想法
我考虑过一个名为" check
"的静态属性。对于父类Program
。
public class Program
{
//Attribute check
private static String check = null;
public static class ProgramMapper extends Reducer<Object, Text, Text, Text>{
// mapping
}
public static class ProgramReducer extends Reducer<Object, Text, Text, TextArray>{
// reducing
}
public static void main(String[] args){
// main program
}
// ...
在main
方法中,我会将check
分配给&#34; a&#34;,&#34; b&#34;,&#34; c&#34;在循环中:
public static void main(String[] args) throws Exception{
// Array of checkpoints
String[] arr = {"a", "c", "f"};
// Loop for assigning check
for(int j = 0; j<arr.length ; j++){
check = arr[j];
// job configuration
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
Job job = new Job(conf, "Program");
//...
for (int i = 0; i < otherArgs.length - 1; ++i){
FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
}
/* here I define multiple outputs */
FileOutputFormat.setOutputPath(job,new Path(otherArgs[otherArgs.length - 1]+j));
job.waitForCompletion(true);
if (j == arr.length -1){
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
reducer
将检查密钥是否等于检查
public static class ProgramReducer extends Reducer<Object, Text, Text, TextArray>{
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
ArrayList<Text> result = new ArrayList<Text>();
String key1 = key.toString();
// check if the key is equal to check
if ( key1.equals(check) ){
result.add(new Text("o"));
}else{
result.add(new Text("x"));
}
// other reducing code
}
}
问题
check
永远不会分配给&#34; a&#34;,&#34; b&#34;,&#34; c&#34;,所以我有3个输出文件都未经检查。
我怎么能解决这个问题?
答案 0 :(得分:1)
您的main
方法正在客户端上运行,但mappers和reducer正在Hadoop节点上运行。要将参数传递给mapreduce作业,您可以使用Configuration
对象。
在main
方法设定值中:
conf.set("check", check);
在减少中得到它:
check = context.getConfiguration().get("check");
在处理数据之前,您只能使用方法Reducer.setup
设置此值。