运行映射器的节点处理如何知道它必须将一些键值输出发送到节点 A(运行减速器)和一些到节点 B(运行另一个减速器)?JobTracker 是否在某个地方维护了减速器节点列表?如果是,它如何选择一个节点来运行reducer?
问问题
129 次
2 回答
5
AMapper
并不真正知道将数据发送到哪里,它专注于两件事:
- 将数据写入磁盘。最初,地图输出缓冲在内存中,一旦达到某个阈值,它就会被刷新到磁盘。但就在进入磁盘之前,数据通过获取输出密钥的哈希值进行分区,该输出密钥对应于
Reducer
将发送到的输出密钥。 - 一旦地图任务完成,它会通知父任务跟踪器说它已经完成,然后它会通知作业跟踪器本身。因此作业跟踪器具有地图输出和任务跟踪器之间的完整映射。
从那里开始,当 aReducer
开始时,它将不断向作业跟踪器询问与其分区对应的地图输出,直到它全部检索到它们为止。每当映射输出可用时,reduce 任务将开始复制它,并在复制时逐渐合并。
如果这仍然不清楚,我建议您查看有关 Hadoop 的参考书,其中有一整章描述了这部分,这里是从中提取的一个模式,可以帮助您可视化 shuffle 步骤中发生的情况:
于 2013-06-01T07:39:58.263 回答
1
映射器不会将数据发送到减速器,而是减速器从成功的映射任务运行的任务跟踪器中提取数据。
Job Tracker 在将 reducer 任务分配给 task tracker 时,知道成功的 map 任务在哪里运行,并且可以编译一个 task tracker 列表和要 pull 的 map 尝试任务结果。
于 2013-06-01T07:39:16.677 回答