每个 Map 任务或者 Reduce 任务都会有其唯一的标识,分别为 mapId 和 reduceId。每个 Reduce 任务的输入可能是多个 Map 任务的输出,Reduce 会到各个 Map 任务的所在节点上拉取 Block,这一过程叫做 Shufle。每个 Shuffle 过程都有唯一的表示 shuffleld.
MapOutputTracker 有两个子类: MapOutputTrackerMaster(for driver) 和 MapOutputTrackerWorker (for executors) 因为它们使用了不同的 HashMap 来存储元数据。

在 MapOutputTracker 初始化中,可以看到针对当前实例是 Driver 还是 Executor,创建其方式有所不同。

  1. 如果当前应用程序是 Driver,则创建 MapOutputTrackerMaster,然后创建 MapOutputTrackerMasterEndpoint 并且注册到 Dispatcher 中,注册名为 MapOutputTracker
  2. 如果当前应用程序是 Executor,则创建 MapOutputTrackerWorker,并从远端 Driver 实刚的 NettyRpcEnv 的 Dispatcher 中查找 MapOutputTrackerMasterEndpoint 的引用。