任务跟踪器为每个输入拆分或每个键值对生成一个新的映射器



我在某个网站上发现了以下问题,但我不确定正确答案。

MapReduce程序中的哪个Hadoop服务会产生一个新的Mapper?

  1. JobTracker会生成一个新Mapper来处理单个文件中的所有记录。
  2. TaskTracker会生成一个新的Mapper来处理每个键值对。
  3. TaskTracker会生成一个新Mapper,用于处理单个输入拆分中的所有记录。
  4. JobTrackerTaskTrackerconfigure ()方法,然后是map ()方法,最后是close ()方法。

网站说答案是选项 2 ,但我与答案 3 混淆。

mapper的java文档一样,我发现了以下事情:

Hadoop Map-Reduce框架为作业InputFormat生成的每个InputSplit生成一个映射任务。 Mapper实现都可以通过 theJobContext.getConfiguration() 访问作业的配置。
框架首先调用setup(org.apache.hadoop.mapreduce.Mapper.Context),然后对InputSplit中的每个键/值对调用map(Object, Object, Context)。最后cleanup(Context)被召唤了。 与给定输出键关联的所有中间值随后由框架分组,并传递给Reducer以确定最终输出。用户可以通过指定两个关键RawComparator类来控制排序和分组。

它是

2

映射任务是 JVM

映射器只是一个java类或一个对象

作业调度程序为每个拆分创建一个映射任务:(MapReduce1 page 191 Hadoop The Definitive Guide 3rd)。

应用程序主版为每个拆分创建一个映射任务对象:(同一本书的MapReduce2第199页)。

无论哪种情况,它都不是任务跟踪生成映射任务。

TaskTrack 生成 Mapper 类来处理每个键/值对。

答案是选项 3。任务跟踪器生成映射器实例在其中执行的 JVM。映射器始终处理整个输入拆分。

从Definitve指南中挑选出来,选项3是正确的答案。以下是书中所说的

YarnChild在专用的JVM中运行,原因与任务跟踪器生成的原因相同。MapReduce 1中任务的新JVM:

答案应该是 2

查看映射器类代码:

 public class MaxTemperatureMapper
     extends Mapper<LongWritable, Text, Text, IntWritable> {

这意味着 Mapper 类/对象每次都会采用一个键/值对,当这个 k/v 对被处理时,类/对象完成,它就完成了。下一个 k/v 对将由另一个映射器(一个新的类/对象)处理。

这里有两个术语需要考虑。

    映射器
  • ,如任务跟踪器在单独的地图任务中生成的映射器JVM 来处理输入拆分。(全部)。对于 文本输入格式 ,这将是输入文件中的特定行数。
  • 为拆分中的每个记录(键值对)调用的 Map 方法。地图绘制者(...) .对于 TextInputFormat,每个映射方法(调用)将处理输入拆分中的一行。
在这种情况下,答案

3 似乎是最准确的答案。

参考 :- 权威指南第 3 版

InputSplits 作为一个整体被馈送到映射任务。

拆分反过来包含键值对。

文件 ->

按此顺序拆分 -> 分区

正确答案是选项 3

2.任务跟踪器会生成一个新的映射器来处理每个键值对。

3.任务跟踪器会生成一个新的映射器,以处理单个输入拆分中的所有记录。

对我来说,为每个键值对生成一个新的映射器是没有意义的 - 想想 64MB 块大小包含 1000 条记录(键值对)。我不认为框架在这里创建 1000 个映射器。

映射器任务进程单个输入拆分(不是文件或块或某些记录)

最新更新