Reflection Hadoop如何决定在MapTask类中运行哪个mapper,OldMapper还是NewMapper?

Reflection Hadoop如何决定在MapTask类中运行哪个mapper,OldMapper还是NewMapper?,reflection,hadoop,mapreduce,Reflection,Hadoop,Mapreduce,我无法理解runOldMapper(…)和runNewMapper(…)类中的runOldMapper(…)方法之间的区别。Hadoop根据JobConf中的参数“useNewApi”来决定;但是,在框架中何时何地设置了此参数?我认为所有作业的默认值都是FALSE。我们可以通过调用JobConf.setUseNewMapper(布尔标志)将该值设置为TRUE,该函数设置“mapred.mapper.new api”,但我们应该在何时以及为什么决定设置此参数?假设此行为是由mapred.mappe

我无法理解
runOldMapper(…)
runNewMapper(…)
类中的
runOldMapper(…)
方法之间的区别。Hadoop根据
JobConf
中的
参数“useNewApi”
来决定;但是,在框架中何时何地设置了此参数?我认为所有作业的默认值都是FALSE。我们可以通过调用
JobConf.setUseNewMapper(布尔标志)
将该值设置为TRUE,该函数设置
“mapred.mapper.new api”
,但我们应该在何时以及为什么决定设置此参数?

假设此行为是由
mapred.mapper.new api
配置触发的,这是正确的

根据您使用的是新作业配置还是旧作业配置/客户端,在源代码中查找:

  • org.apache.hadoop.mapreduce.Job.submit()
    方法,该方法调用
    setUseNewAPI()
    private方法。这将根据是否设置了旧的映射器/还原器类属性来配置
    新api
    属性
  • org.apache.hadoop.mapred.JobConf
    -如您在问题中所述,如果您使用新的API映射器实现,开发人员需要调用
    setUseNewMapper(true)
    方法(默认情况下为false,映射器类实现mapred.mapper接口;如果映射器扩展了mapreduce.mapper类,则为true)

tahnks供您参考Chris。但是mapred.Mapper和mapreduce.Mapper类之间有什么区别?它们是出于不同的原因吗?它们或多或少具有可比性-mapred包被称为“旧”API,mapreduce是“新”API(新API感觉更干净)。两者都有自己的输入和输出格式(旧api使用OutputCollector和Reporter对象,而新api使用Context)。我想这取决于您使用的hadoop版本,但如果您刚开始使用,我当然会建议您使用新api(mapreduce)。我使用hadoop 1.0.3(我开始使用时的稳定版本)在JVM之间提供一些MPI通信api(地图任务)。还有一个问题,Chris。当任务跟踪器启动一个新的Jvm来运行子映射/减少时,它会为子级提供TaskUmbilica接口作为RPC服务。我在任务跟踪器上有另一个接口,名为Example Interface。我可以将其绑定到任务跟踪器上用于RPC通信的同一端口吗?即,我可以绑定两个任务Umbilica吗l和Example接口到Task Tracker上的同一个端口,或者我必须将它们绑定到两个不同的端口?-Example接口的目的是为子进程提供一些MPI函数。我不确定-您必须查看源代码并在TaskTracker和其他相关类中进行修改