hadoop新旧API的区别

 

Hadoop的版本0.20.0包含有一个新的 Java MapReduce API,有时也称为"上下文对象"(context object),旨在使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开始的部分编号。

7.新的API 放在org.apache.hadoop.mapreduce 包(和子包)中。之前版本的API 依旧放在org.apache.hadoop.mapred中。

 
hadoop版本20以上时提交的作业,并不是说你用的20的系统,它就会run new mapper了。具体是用的oldAPI还是newAPI,得看提交任务的方式 
    具体的说就是设置mapper时要用的Job.setMapperClass(xxx.class),而不是JobConf.setMapperClass(xxx.class)。前者是用mapreduce.map.class属性来承载mapper类,后者是用mapred.mapper.class属性来承载mapper类。 
然后再看这段代码就知道了:
  1.   private void setUseNewAPI() throws IOException {
  2.     int numReduces = conf.getNumReduceTasks();
  3.     String oldMapperClass = "mapred.mapper.class";
  4.     String oldReduceClass = "mapred.reducer.class";
  5.     conf.setBooleanIfUnset("mapred.mapper.new-api",
  6.                  conf.get(oldMapperClass) == null);
如果没有用JobConf.setMapperClass(xxx.class)设置mapper类的话,mapred.mapper.class属性将是空,那conf.get(oldMapperClass) == null这句将为true,最后得到mapred.mapper.new-api = true。
 
 
 
 

 

 

 



 

posted @ 2013-01-06 10:21  有心人cwx  阅读(782)  评论(0编辑  收藏  举报