一、概述

由于 Spark 是分布式部署,每个Task最终都运行在不同的机器节点上。map 任务的输出结果直接存储到map任务所在机
器的存储体系中,reduce 任务有可能不在同一机器上运行,所以需要远程下载map任务的中间输出。
NettyBlockTransferService提供了可以被其他节点的客户端访问的 Shuffle服务。

二、架构设计

三、初始化

BlockManager 在初始化的时候调用NettyBlockTransferService的init!)方法进行初始化,NettyBlockTransferService 只
有在被初始化后才提供服务

  1. 创建 NettyBlockRpcServer。 NettyBlockRpcServer继承了RpcHandler,服务端对客户端的Block读写请求的处理都
    交给了RpcHandler的实现类,NettyBlockRpcServer 处理 Block块的 RPC 请求。
  2. 准备客户端引导程序TransportClientBootstrap和服务端引导程序TransportServer-Bootstrap。
  3. 创建TransportContext。
  4. 创建传输客户端工厂 TransportClientFactory。
  5. 创建 TransportServer。
  6. 获取当前应用的 ID

四、传输客户端

如果没有部署外部的 Shuffle 服务,即 spark.shuffle.service.enabled 属性为 false 时,NettyBlockTransferService 不但通过
OneForOneStreamManager与 NettyBlockRpcServer 对外提供 Block 上传与下载的服务,也将作为默认的 Shuffle 客户端。NettyBlockTransferService 作为 Shuffle 客户端,具有发起上传和下载请求并接收服务端响应的能力