MapReduce 新旧API对比

hadoop从0.20.0版本开始,Hadoop同时提供了新旧两套MapReduce API。新API在旧API基础上进行了封装,使得其在扩展性和易用性方面更好。新旧版MapReduce API的主要区别如下。

(1)存放位置

新API:org.apache.hadoop.mapreduce包

旧API:org.apache.hadoop.mapred包

(2)接口变为抽象类

接口通常作为一种严格的“协议约束”。它只有方法声明而没有方法实现,且要求所有实现类(不包括抽象类)必须实现接口中的每一个方法。接口的最大优点是允许一个类实现多个接口,进而实现类似C++中的“多重继承”。抽象类则是一种较宽松的“约束协议”,它可为某些方法提供默认实现。而继承类则可选择是否重新实现这些方法。正是因为这一点,抽象类在类衍化方面更有优势,也就是说,抽象类具有良好的向后兼容性,当需要为抽象类添加新的方法时,只要新添加的方法提供了默认实现,用户之前的代码就不必修改了。

考虑到抽象类在API衍化方面的优势,新API将InputFormat、OutputFormat、Mapper、Reducer和Partitioner由接口变为抽象类。

(3)上下文封装

新版API将变量和函数封装成各种上下文(Context)类,使得API具有更好的易用性和扩展性。首先,函数参数列表经封装后变短,使得函数更容易使用;其次,当需要修改或添加某些变量或函数时,只需修改封装后的上下文类即可,用户代码无须修改,这样保证了向后兼容性,具有良好的扩展性。

差异

1. 新API在接口上定义抽象类,利于扩展,可以在抽象类增加带有默认实现的方法,无需破坏类中旧的实现

2. 新API大量使用了context object,用户代码可以与MR系统通信。context其实是封装了旧API的JobConf,OutputController和Repoter

3. 新API允许重写Mapper和Reducer的run()方法控制执行流,旧API中Mapper有MapRunnable的手段,但Reducer没有

4. 新API使用Job类控制作业,旧API使用JobClient,这个类已经被新API删除

5. 新API通过vanilla对象Configuration作业配置,并使用Job类的辅助类方法,旧API使用JobConf

6. 新API输出文件名map为part-m-nnnnnn,reduce为part-r-nnnnnn,旧API统一都是part-nnnnnn

7. 新API用户重写异常是java.lang.InterruptedException,用户可以自己写代码处理终端

8. 新API中,reduce()方法用 java.lang.Iterable 传递值,而旧API是 java.util.Iterator 传递值

参考:

https://www.cnblogs.com/oraclestudy/articles/5688976.html

https://blog.csdn.net/weixin_42129080/article/details/80780189

猜你喜欢

转载自blog.csdn.net/CPP_MAYIBO/article/details/86769909