以下是我对inputsplit及其与映射器交互的理解…如果我说错了,请纠正我。
InputFormat生成inputsplit,并为每个inputsplit生成一个映射任务。对于数据位置,通常在数据阳极上选择一个映射槽,该槽物理上携带InputSplit所引用的块。假设这里没有数据复制。
如果在该块所在的datanode上没有可用的映射槽,将会发生什么情况?jobtracker是等待在这个数据阳极上获得一个空槽,然后在这个数据阳极上调度映射器,还是在其他任何有空闲映射槽的节点上调度映射,然后从第一个数据阳极流数据?
后者。您可以在作业中看到以下计数器:
Data-local map tasks=46
Rack-local map tasks=5
data -local map任务数是指在同一个datanode上运行的map任务个数,不需要通过网络传输数据。Rack-local map任务的数量是指在不同的datanode上运行了多少map任务并通过网络传输数据。
Rack-local map tasks
的个数只考虑机架本地节点的个数。如果你有一些任务使用了不同机架中某些节点的数据(意味着在同一机架中没有槽位),它将被Other local map tasks
反击。但是,这些任务需要跨机架传输数据。您可以在这里确认日期节点选择的逻辑。