Hadoop编程笔记(二):Hadoop新旧编程API的区别

Hadoop Release 0.20.0的API包括了一个全新的API:Context,有时候也称为上下文对象,此对象的设计使得在未来进行扩展更加容易。 后续的hadoop版本--如1.x--已经完成了大部分的API 更新。新的API类型上不兼容以前的API,所以以前的应用程序需要重写才能使新的API发挥其作用 。

新的API和旧的API之间有下面几个明显的区别:

1. 新的API倾向于使用抽象类,而不是接口,因为这更容易扩展。例如,你可以添加一个方法(附带默认的实现)到一个抽象类而不需修改类之前的实现方法。在新的API中,Mapper和Reducer是抽象类。有关更多抽象类与接口的区别请参见这里

2. 新的API是在org.apache.hadoop.mapreduce包(及其子包)中的。之前版本的API则是放在org.apache.hadoop.mapred中的。

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

4. 两个版本的API 键值对记录都会传递给mapper和reducer进行处理,但额外的,新API允许mapper和reducer通过重写run()方法的方式更多的控制其执行过程。例如,记录可以成批的被处理;执行过程可以在所有记录被处理完之前被中断。在旧API中,或许通过一个MapRunnable接口的实现可以为map任务达成同样的目的, 但对于reduce任务却是不行的。

5. 在新API中作业是通过Job类来控制的,而不是旧API中的JobClient(在新API中已经不存在了)。

6. 新的API统一了配置。旧的API有一个特殊的JobConf对象用于作业配置,这是对于Hadoop的通常的Configuration对象的扩展。在新的API中,这种区别没有了,所以作业配置通过Configuration来完成,有时可能需要Job上的一些帮助方法(helper method)。

7. 输出文件的命名稍微有了差别:旧API中map和reduce的输出文件都是以part-nnnnn的方式来命名的,而在新API中map的输出文件是通过part-m-nnnnn, reduce的输出文件是通过part-r-nnnnn的方式来命名的(从零开始计数)。

8. 新API要求用户重写的方法应抛出InteruptedException异常,这意味着你可以编写自己的代码来处理这种异常,从而使框架如果需要的话能够更优雅的结束长时间运行的操作。

9. 在新API中,reduce()函数接收到的值类型是java.lang.Interable, 而不是java.lang.Iterator(旧API中使用这个),这个改变使得使用java的for-each循环能更加容易地遍历输入值: for(VALUE value : values) {......}

注意:

当把你的Mapper和Reducer类转换到新API中时,别忘了把相应的map()、reduce()方法中的参数也改过来。只改变你的实现类继承自Mapper或Reducer类(旧API中两者是继承自MapReduceBase)是不行的(虽然并不会报编译时错误或警告,因为Mapper或Reducer类分别提供了与MapReduceBase类名字相同的map()和reduce()函数,这会是一个很隐蔽的bug),这样的话你在map()或reduce()方法中的代码并不会执行,因为框架找不到新API中的map()和reduce()函数(参数不匹配)。
给你的map()或reduce()函数加上@Override注解,java编译器就会在编译期报错了,这样可以确保正确。

转载请注明出处:http://www.cnblogs.com/beanmoon/archive/2012/12/06/2804905.html

posted @ 2012-12-06 16:51  beanmoon  阅读(2384)  评论(1编辑  收藏  举报