从 0.20.0 版本开始,Hadoop 同时提供了新旧两套 MapReduce API。新 API 在旧 API 基础上进行了封装,使得其在扩展性和易用性方面更好。新旧版 MapReduce API 的主要区 别如下。
(1)存放位置
旧版 API 放在 org.apache.hadoop.mapred 包中,而新版 API 则放在 org.apache.hadoop. mapreduce 包及其子包中。
(2)接口变为抽象类
接口通常作为一种严格的“协议约束”。它只有方法声明而没有方法实现,且要求所有实 现类(不包括抽象类)必须实现接口中的每一个方法。接口的最大优点是允许一个类实现多 个接口,进而实现类似 C++ 中的“多重继承”。抽象类则是一种较宽松的“约束协议”,它可 为某些方法提供默认实现。而继承类则可选择是否重新实现这些方法。正是因为这一点,抽 象类在类衍化方面更有优势,也就是说,抽象类具有良好的向后兼容性,当需要为抽象类添 加新的方法时,只要新添加的方法提供了默认实现,用户之前的代码就不必修改了。
考虑到抽象类在API衍化方面的优势,新API在InputFormat、OutputFormat、Mapper、Reducer和Partitioner由接口变成抽象类。
(3)上下文封装
新版 API 将变量和函数封装成各种上下文(Context)类,使得 API 具有更好的易用性 和扩展性。首先,函数参数列表经封装后变短,使得函数更容易使用 ;其次,当需要修改 或添加某些变量或函数时,只需修改封装后的上下文类即可,用户代码无须修改,这样保 证了向后兼容性,具有良好的扩展性。
上图展示了新版API中树形的Context 类继承关系。这些Context 各自封装了一种实体的基本信息及对应的操作(setter和getter 函数),如JobContext、TaskAttemptContext 分 别封装了Job和Task的基本信息,TaskInputOutputContext 封装了Task的各种输入输出操作,MapContext 和ReduceContext分别封装了Mapper和Reducer对外的公共接口。
除了以上三点不同之外,新旧API 在很多其他细节方面也存在小的差别。由于新版和旧版API 在类层次结构、编程接口名称及对应的参数列表等方面存在较大差别,所以两种 API 不能兼容。但考虑到应用程序的向后兼容性,短时间内不会将旧API从MapReduce 中去掉。即使在完全采用新 API 的0.21.0/0.22.X 版本系列中,也仅仅将旧 API 标注为过期(deprecated),用户仍然可以使用。
本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5058689.html,如需转载请自行联系原作者