Hadoop编程笔记(二):Hadoop新旧编程API的区别
2012-12-06 16:51
489 查看
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编译器就会在编译期报错了,这样可以确保正确。
转载请注明出处:/article/6469208.html
新的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编译器就会在编译期报错了,这样可以确保正确。
转载请注明出处:/article/6469208.html
相关文章推荐
- Hadoop学习笔记二(新旧版本API的区别)
- [hadoop源码阅读][3]-新旧api区别
- hadoop新旧API的区别
- [hadoop源码阅读][3]-新旧api区别
- Hadoop新旧API区别2<转>
- Hadoop新旧API的区别和联系
- jdbc.api数据库编程实作教材 笔记3
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简单介绍
- VC编程练习之API笔记(二)
- VC编程练习之API笔记(三)
- Hadoop MapReduce编程 API入门系列之计数器(二十七)
- Hadoop HDFS编程 API入门系列之路径过滤上传多个文件到HDFS(二)
- Hadoop HDFS编程 API入门系列之RPC版本1(八)
- Hadoop API编程——FileSystem操作
- unix环境高级编程(阅读笔记)------signal函数与sigaction的区别
- hadoop编程入门学习笔记-2 通过示例程序理解hadoop
- Java开发学习笔记之五:Servlet编程API
- Hadoop学习笔记(7) ——高级编程
- Linux程序设计学习笔记----网络通信编程API及其示例应用
- Hadoop学习笔记(十六)---HBase JAVA API