背景介绍
在Hadoop的代码中,存在org.apache.hadoop.mapred和org.apache.hadoop.mapreduce两个包。mapred包下是老的API,在Hadoop0.20时被废弃了,引入了新包mapreduce,但是由于新的API迟迟没有完成,所以在Hadoop0.21中取消了mapred包的废弃状态。原来的设想中老包mapred在Hadoop0.22和1.0中将再次设成废弃状态,但时至今日也没有被废弃。
区别
本文将通过WordCount示例代码,介绍一下二者的区别。WordCount示例代码分别取自0.19和0.23.9版本的Hadoop源码。
0.19版WordCount示例
0.23.9版WordCount示例
区别 | 新API | 老API |
---|---|---|
包 | 新API位于org.apache.hadoop.mapreduce包内 | 老API位于org.apache.hadoop.mapred.包内 |
Mapper和Reducer类型 | 新API使用Mapper和Reducer抽象类 抽象类更容易扩展,Hadoop实现可以轻松向其抽象类中添加方法(用默认的实现)而不会对已有Hadoop应用造成影响 | 老API使用Mapper和Reduceer接口 |
使用对象 | 新API使用Configuration和一些Helper类完成作业配置; 新API使用Job完成作业控制; 新API使用Context完成用户代码与MapReduce系统的通信。 | 老API使用JobConf 完成作业配置,它是Configuration子类; ![[Hadoop]?mapred和mapreduce包的区别](/images/2013/7/0026uWfMzy78EeY1A9Ge0.png) 老API使用JobClient完成作业控制; 老API使用OutputCollector和Reporter完成用户代码与MapReduce系统的通信。 |
方法 | map() reduce() clearup() setup() run(); 所有方法可抛IOException或InterruptedException; Reduce()输入值为java.lang.Iterable;键值对输出通过Context对象的write方法实现; | map() reduce(); 所有方法可抛IOException; Reduce()输入值为java.lang.Iterator; 键值对输出通过OutputCollector对象的collect方法实现; |
输出文件 | part-m-nnnnn和part-r-nnnnn (nnnnn为从0开始的整数) | part-nnnnn |
注意事项
尽量使用新API。在mapred和mapreduce两个包下存在FileInputFormat、FileOutputFormat等名字一样的类,如果引入错误的话,程序会无法通过编译。
参考
Upgrading To The New Map Reduce API
Difference between Hadoop OLD API and NEW API