我在某个网站上发现了以下问题,但我不确定正确答案。
MapReduce程序中的哪个Hadoop服务会产生一个新的Mapper?
JobTracker
会生成一个新Mapper
来处理单个文件中的所有记录。- 该
TaskTracker
会生成一个新的Mapper
来处理每个键值对。 TaskTracker
会生成一个新Mapper
,用于处理单个输入拆分中的所有记录。JobTracker
称TaskTracker
的configure ()
方法,然后是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 个映射器。
映射器任务进程单个输入拆分(不是文件或块或某些记录)