即mapred和mapreduce包的区别后,本文再次从源码角度分析新老API(mapred.mapper.new-api/ mapred.reducer.new-api)的设置与区别。 mapred.mapper.new-api /mapred.reducer.new-api这两个参数很少显式去设置,默认为false,即使用mapred包下的老API。 不过MapReduce框架也会去自动识别应该使用老API还是新API。作业提交有两种方式,异步方式用submit,同步方式用waitForCompletion。不过org.apache.hadoop.mapreduce.Job.waitForCompletion(boolean)里调用了org.apache.hadoop.mapreduce.Job.submit()方法,submit方法又调用了org.apache.hadoop.mapreduce.Job.setUseNewAPI()方法。setUseNewAPI方法里面对新老API做了判断:
- 是否设置了mapred.mapper.class属性,则mapred.mapper.new-api为true,否则为false。说白了就是用org.apache.hadoop.mapreduce.Job.setMapperClass(Class)还是org.apache.hadoop.mapred.JobConf.setMapperClass(Class)设置的Mapper,前者设置的是mapreduce.job.map.class属性,后者设置的是mapred.mapper.class属性。
- 如果mapreduce.job.reduces属性值不为0,则看是否设置了mapred.reducer.class属性,则mapred.reducer.new-api为true,否则为false。说白了就是用org.apache.hadoop.mapreduce.Job.setReducerClass(Class)还是org.apache.hadoop.mapred.JobConf.setReducerClass(Class)设置的Mapper,前者设置的是mapreduce.job.reducer.class属性,后者设置的是mapred.reducer.class属性。
new-api相关区别
使用new-api | 不使用new-api |
---|---|
不允许设置下列属性:
| 不允许设置下列属性:
|
使用下列类或接口的实现:
| 使用下列类或接口的实现:
|
使用方法:
| 使用方法:
|