分享

谈谈org.apache.hadoop.mapreduce.Mapper和org.apache.hadoop.mapred.Mapper的区别...

pig2 发表于 2014-2-8 01:35:02 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 9321
本帖最后由 pig2 于 2014-2-8 01:39 编辑


有的同学去面试,碰到了这个问题。谈谈org.apache.hadoop.mapreduce.Mapper和org.apache.hadoop.mapred.Mapper的区别和用途。
其实就是mapred代表的是hadoop旧API,而mapreduce代表的是hadoop新的API。
下面是同学经历,可以参考
很多类在mapred和mapreduce中分别都有定义,下面是写的一段代码:

public  class MyJob extends Configured implements Tool
{

     public static class MapClass extends MapReduceBase implements Mapper<Text, Text, Text, Text>
     {//
         public void map(Text key, Text value, OutputCollector<Text, Text> output, Reporter reporter) throws IOException
         {
             output.collect(value, key);
         }

     }

     public static class Reduce extends MapReduceBase implements Reducer<Text, Text, Text, Text>
     {

         @Override
         public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter)     throws IOException
         {
             String csv = "";
             while (values.hasNext())
             {
                 csv += csv.length() > 0 ? "," : "";
                 csv += values.next().toString();               
             }
             output.collect(key, new Text(csv));
         }

     }

     @Override
     public int run(String[] args) throws Exception
     {
         Configuration conf = getConf();

         JobConf  job = new JobConf(conf, MyJob.class); //JobConf job = new JobConf(conf, MyJob.class);

         Path in = new Path(args[0]);
         Path out = new Path(args[1]);
         FileInputFormat.setInputPaths(job, in);
         FileOutputFormat.setOutputPath(job, out);

         job.setJobName("MyJob");
         job.setMapperClass(MapClass.class);
         job.setReducerClass(Reduce.class);

         job.setInputFormat(KeyValueTextInputFormat.class);
         job.setOutputFormat(TextOutputFormat.class);
         job.setOutputKeyClass(Text.class);
         job.setOutputValueClass(Text.class);
         job.set("key.value.separator.in.input.line", ",");

         JobClient.runJob(job);

         return 0;
     }


     public static void main(String[] args) throws Exception
     {
         // TODO Auto-generated method stub
         int res = ToolRunner.run(new Configuration(), new MyJob(), args);
         System.exit(res);
     }
}


主要看run方法:


上面代码中的Jobconf无可厚非,只有在mapred包中有定义,这个没问题。

但是FileInputFormat和FileOutputFormat在mapred和mapreduce中都有定义,刚开始对这些都没有概念,就引用了mapreduce中的FileInputFormat和FIleOutputFormat。

这样操作就带来了后面的问题

FileInputFormat.setInputPaths(job, in);
FileOutputFormat.setOutputPath(job, out);


这两条语句不能通过编译,为什么呢,因为FileInputFormat.setInputPaths和FileOutputFormat.setOutputPath的第一个参数都是Job,而不是JobConf,找了很多资料,后来,看到mapred包中也有这两个类的定义,于是火箭速度修改为mapred下的包,OK,顺利通过编译!

下面还有 job.setOutputFormat(TextOutputFormat.class);语句编译不同通过,提示参数需要扩展。。。的参数;于是也去mapred下面查找是否存在此类,正如期望,也存在此类,当即立段,修改为此包下的类,顺利编译通过,此时,颇有成就感!


可是现在发现,mapred包下和mapreduce包下同时都存在又相应的类,不知道是为什么,那么下面就有目标的请教搜索引擎啦,呵呵,比刚才有很大进步。

结果令很失望,就找到了一个符合理想的帖子。但是通过这个帖子,小菜知道了,mapred代表的是hadoop旧API,而mapreduce代表的是hadoop新的API。

OK,小菜在google输入框中输入“hadoop新旧API的区别”,结果很多。看了之后,又结合权威指南归结如下:

1.    首先第一条,也是小菜今天碰到这些问题的原因,新旧API不兼容。所以,以前用旧API写的hadoop程序,如果旧API不可用之后需要重写,也就是上面我的程序需要重写,如果旧API不能用的话,如果真不能用,这个有点儿小遗憾!

2.    新的API倾向于使用抽象类,而不是接口,使用抽象类更容易扩展。例如,我们可以向一个抽象类中添加一个方法(用默认的实现)而不用修改类之前的实现方法。因此,在新的API中,Mapper和Reducer是抽象类。

3.    新的API广泛使用context object(上下文对象),并允许用户代码与MapReduce系统进行通信。例如,在新的API中,MapContext基本上充当着JobConf的OutputCollector和Reporter的角色。

4.    新的API同时支持"推"和"拉"式的迭代。在这两个新老API中,键/值记录对被推mapper中,但除此之外,新的API允许把记录从map()方法中拉出,这也适用于reducer。分批处理记录是应用"拉"式的一个例子。

5.    新的API统一了配置。旧的API有一个特殊的JobConf对象用于作业配置,这是一个对于Hadoop通常的Configuration对象的扩展。在新的API中,这种区别没有了,所以作业配置通过Configuration来完成。作业控制的执行由Job类来负责,而不是JobClient,并且JobConf和JobClient在新的API中已经荡然无存。这就是上面提到的,为什么只有在mapred中才有Jobconf的原因。

6.   输出文件的命名也略有不同,map的输出命名为part-m-nnnnn,而reduce的输出命名为part-r-nnnnn,这里nnnnn指的是从0开始的部分编号。


这样了解了二者的区别就可以通过程序的引用包来判别新旧API编写的程序了。小菜建议最好用新的API编写hadoop程序,以防旧的API被抛弃!!!

小菜水平有限,如果哪位大牛看到文中的不足和错误,请指正,小菜会尽快更改文中错误,好让其他入门者不走我的弯路!




来自群组: Hadoop技术组

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条