从上面用颜色标注的地方我们可以看到,新版和旧版在实现上还是有很大的改动的:
1, Map类不再采用继承MapReduceBase基类并实现Mapper接口的方式,而是直接继承一个新的Mapper<Object, Text, Text, IntWritable>类就可以。
2, 新的Mapper类中也有一个map方法,只不过和旧版中的map方法的参数不同,但是他们的功能是相同的。Hadoop框架会对于每个输入的键值对执行一次map方法。
3, Reduce类不再采用继承MapReduceBase基类并实现 Reducer接口的方式,而是直接继承一个新的Reducer<Text,IntWritable,Text,IntWritable>类就可以。
4, 新的Reduce类中也有一个reduce方法,只不过和旧版中的reduce方法的参数不同,但是他们的功能是相同的。hadoop框架会对于框架为成组的输入数据中的每个<key, (list of values)>对调用一次reduce方法。
5, 新版废弃了JobConf类,直接使用JobConf的父类Configuration来进行一些配置的管理。
6, 新版直接使用类Job来描述一个job相关的各种信息。
7, 通过Job类的方法,设置一个Job在运行过程中所需的所有相关参数
8, 直接通过Job类的方法来执行Job。 这里waitForCompletion函数会一直等待job结束才会返回,还有另外一个方法:commit,commit会在提交job之后立刻返回。
通过上面的对比,我们可以看到,在新版的实现当中,可以说发生了非常大的变化。旧版中的很多类,现在已经都被标识为Deprecated。
本质上来说,hadoop框架的运行方式并没有发生大的变化,我们在hadoop基础上开发程序的逻辑也并没有发生大的变化,只是接口方面有所不同。在新版中,引入了Context,这使得以后hadoop会更容易扩展。Configuration和Job的使用,也使编程的逻辑更为直观。如果大家去看hadoop的具体实现,可以看到很多新引入的类,都在包org.apache.hadoop.mapreduce下,如果大家有兴趣,可以自己去看看这些新的类。