我需要一些帮助来理解mapreduce流程,而不是理论上,而是参考普通的Java代码片段。我一直在阅读关于hadoop处理的教程,API,论坛和其他主题相关事宜; mapreduce。我对流动,hadoop的处理方法非常满意。我理解的问题与Java中的mapreduce编码有关。我已经阅读并尝试了一些已有的代码;即,wordcount等。我无法理解的是原始数据流入Mapper& Reducer类(严格按照Java代码而不是理论流程)。
我也尝试用代码表示它;也许我可以让自己更容易理解。让我们来说一下经典的wordcount程序;地图宣言&减少我发现的地方:
public static class Map extends MapReduceBase implements
Mapper<LongWritable, Text, Text, IntWritable>
public static class Reduce extends MapReduceBase implements
Reducer<Text, IntWritable, Text, IntWritable>
我对上述代码段的查询:
API定义表明它类似
org.apache.hadoop.mapreduce.Mapper(KEYIN,VALUEIN,KEYOUT,VALUEOUT)
如果我通过命令行将文件传递给我的程序,那么 论证全部内容如何?根据hadoop的理解 流程,我说前两个论点,即KEYIN&amp; VALUEIN将是 用过的。键将是单词,而值将在那里计数(无论地图阶段的输出是什么)。
例如,我尝试编写一个小代码,用逗号分隔的整数值找出小文本文件中的最大数字。首先,我无法决定在哪里进行处理;在mapper类或reducer类中?看看周围的众多代码,我以某种方式得出结论,处理应该在reducer类中,而我可以在mapper类中应用一些基本检查到我的输入。这个逻辑我只是自己承担,所以你可以在这上面玩得开心:) 有人可以告诉我这段代码中的错误吗?可能会帮助我清除我的理解吗?
我的代码:
public class mapTest {
public static class Map extends MapReduceBase implements
Mapper<Text, Text, Text, Reporter>{
@Override
public void map(Text text, Text value,
OutputCollector<Text, Reporter> output, Reporter arg0)
throws IOException {
// TODO Auto-generated method stub
String val = value.toString();
if(val.equals(null)){
System.out.println("NULL value found");
}
output.collect(value, arg0);
}
}
public static class Reduce extends MapReduceBase implements
Reducer<Text, Text, Text, Reporter>{
public void reduce(Text key, Iterator<Text> value,OutputCollector<Text, Reporter> output, Reporter arg0)
throws IOException {
// TODO Auto-generated method stub
Text max = value.next();
while(value.hasNext()){
Text current = value.next();
if(current.compareTo(max) > 0)
max = current;
}
output.collect(key, (Reporter) max);
}
}
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
JobConf conf = new JobConf();
conf.setMapperClass(Map.class);
conf.setReducerClass(Reduce.class);
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(Text.class);
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
JobClient.runJob(conf);
}
}
PS:参数类型,我只是随机提到虽然我不了解除Reporter类型之外的任何重要性。
在发布这个问题之前,我做了所有可能的研究。请帮我理解这个流程。我不想通过从其他地方拿起代码和做化妆品来弄乱一切。
提前致谢 -
阿迪尔
答案 0 :(得分:0)