Hadoop 的版本0.20包含一个新的java MapReduce API,我们也称他为上下文对象(context object)。新的API在类型虽然不兼容先前的API,但是更容易扩展。
新增的API和旧的API之间的不同点:
1、 新的API倾向于使用抽象类,而不是接口,是为了更容易扩展。
例如:可以不需要修改类的实现而在抽象类中添加一个方法。在新的API中,mapper和reducer现在都是抽象类;
2、 新的API放在org.apache.hadoop.mapreduce包(和子包)中。老版本的API依然在org.apache.hadoop.mapred中。
3、 新的API充分使用上下文对象,使用户代码能与MapReduce系统通信。
例如,MapContext基本具备了JobConf、OutputCollector和Reporter的功能。
4、 新的API同时支持“推(push)”和“拉(pull)”式的迭代。这两类API,均可以将
键/值对记录推给mapper,但除此之外,新的API也允许把记录从map()方式中拉出。对reducer来说是一样的。“拉”式处理数据的好处是可以实现数据的批量处理,而非逐条记录的处理。
5、 新增的API实现了配置的统一。旧的API通过一个特殊的JobConf对象配置作业,该对象是Hadoop配置对象的一个扩展(用于配置守护进程)。在新的API中,我们丢弃这种区分,所有的配置都是通过Configuration来完成。
6、 新API中作业控制有Job类实现,而非JobClient类,新API中删除了JobClient类。
7、 输出文件的命名文件不同,map的输出文件名为part-m-nnnnn,而reduce的输出为part-r-nnnnn(其中nnnnn表示分块序号,为整数,且从0开始算)。
旧MapReduce代码:
import java.io.IOException; import org.apache.hadoop.fs.Path; public class WordCountApp { ClassNotFoundException { final JobConf job = new JobConf(WordCountApp.class); job.setMapperClass(MyMapper.class); //告诉job执行作业时的输入路径 //指明输出的k3类型 //让作业运行,直到运行结束,程序退出 Text, IntWritable>{ @Override final String[] splited = value.toString().split(” “); IntWritable>{ //key3与key2相同 }
|
新MapReduce代码:
package mapreduce;
import java.io.IOException; import org.apache.hadoop.conf.Configuration; public class WordCountApp { ClassNotFoundException { job.setMapperClass(MyMapper.class); job.setPartitionerClass(MyPartitoner.class); //告诉job执行作业时的输入路径 //指明输出的k3类型 //让作业运行,直到运行结束,程序退出 @Override } /** java.io.IOException ,InterruptedException { final String[] splited = value.toString().split(” “); throws java.io.IOException ,InterruptedException { //key3与key2相同 context.write(key3, value3); |
代码上的区别,新map,reduce方法不用继承MapReduceBase类,传入的参数由原来的4个变成现在的3个。去掉
OutputCollector<Text, IntWritable> output, Reporter reporter
由一个新的类 Context封装了上述信息。
新的Job类对象,由Configuration创建的,也封装了JobClient的方法。