用户可以通过自定义ShuffleManager接口,并通过指定的配置属性进行设置,也可以通过该配置属性指定Spark已经支持的ShuffleManager具体实现子类。
在SparkEnv源代码中可以看到设置的配置属性,以及当前在Spark的ShuffleManager可插拔框架中已经提供的ShuffleManager具体实现,代码如下。
从上面的代码中可以看出,ShuffleManager是Spark Shuffle系统提供的一个可插拔式接口,可以通过"spark.shuffle.manager"配置属性来设置自定义的ShuffleManager。
在Driver和每个Executor的SparkEnv实例化过程中,都会创建一个ShuffleManager,用于管理块数据,提供集群块数据的读写,包括数据的本地读写和读取远程结点的块数据。
Shuffle系统的框架可以以ShuffleManager作为入口进行解析。在ShuffleManager中指定了整个Shuffle框架所使用的各个组件,包括如何注册到ShuffleManager以获取一个用于数据读写的处理句柄ShuffleHandle,通过ShuffleHandle获取特定的数据读写接口:ShuffleWriter与ShuffleReader,以及如何去获取块数据信息的解析接口ShuffleBlockResolver。下面通过源代码分别对这几个比较重要的组件进行解析。
1.ShuffleManager源代码解析
由于ShuffleManager是Spark Shuffle系统提供的一个可插拔式接口,已经提供的具体实现子类或自定义具体实现子类时,都需要重写ShuffleManager类的抽象接口,下面首先分析ShuffleManager的源代码,代码如下。
2.ShuffleHandle源代码解析
ShuffleHandle比较简单,用于记录Task与Shuffle相关的一些元数据,同时也可以作为不同具体Shuffle实现机制的一种标志信息,控制不同具体实现子类的选择等。如下所示。(www.xing528.com)
3.ShuffleWriter源代码解析
继承ShuffleWriter的每个具体子类会实现write接口,给出任务在输出时的记录具体写的方法。如下列代码所示。
4.ShuffleReader源代码解析
继承ShuffleReader的每个具体子类会实现read接口,计算时负责从上一阶段Stage的输出数据中读取记录。如下列代码所示。
5.ShuffleBlockResolver源代码解析
ShuffleBlockResolver的源代码如下所示。
继承ShuffleBlockResolver的每个具体子类会实现getBlockData接口,给出具体的获取块数据的方法。
目前在ShuffleBlockResolver的各个具体子类中,除了给出获取数据的接口之外,通常会提供如何解析块数据信息的接口,即提供了写数据块时的物理块与逻辑块之间映射关系的解析方法。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。