以下是我对InputSplits的理解以及他们与地图制作者的互动......如果我错了,请纠正我...
InputFormat生成InputSplits,并为每个inputsplit生成一个map任务。 对于数据局部性,通常在datanode上选择一个映射槽,该datanode物理上承载InputSplit引用的块。想象一下,这里没有数据复制。
如果块所在的datanode上没有可用的映射插槽,会出现什么情况? jobtracker是否会等待在此datanode上获得一个空插槽,然后在此datanode上安排映射器,或者它是否会在任何其他节点上安排映射,其中有一个映射插槽可用,然后从第一个datanode流式传输数据?
答案 0 :(得分:1)
后者。您可以在工作中看到以下计数器:
Data-local map tasks=46
Rack-local map tasks=5
数据本地映射任务的数量意味着在同一数据节点上运行的映射任务数量,而不通过网络传输数据。 Rack-local map任务的数量意味着在不同的datanode上运行了多少个map任务,并通过网络传输数据。
Rack-local map tasks
的数量仅考虑机架本地的节点。如果您有一些任务使用不同机架中某些节点的数据(意味着同一机架中没有插槽),则Other local map tasks
将对其进行反击。但是,此类任务需要跨机架传输数据。您可以确认日期节点选择here的逻辑。