讲一下Spark的shuffle过程
首先Spark的shuffle是Spark分布式集群计算的核心。
Spark的shuffle可以从shuffle的阶段划分,shuffle数据存储,shuffle的数据拉取三个方面进行讲解。
首先shuffle的阶段分为shuffle的shuffle write阶段和shuffle read阶段。shuffle write的触发条件就是上游的Stage任务shuffle Map Task完成计算后,会哪找下游Stage的分区规则重新分区,shuffle的操作逻辑就每个shuffl map task将数据按目标分区写入本地磁盘,生成shuffle 中间文件。
shuffle read的出发条件就是下游的result Stage任务运行Result task任务启动的时候,需要从上游节点拉取属于自己分区的数据,拉取数据后,shuffle read可能哪找操作的指令进行reduceByKey,或者sortByKey等操作。
然后shuflle的中间文件结果的存储是通过shuffle manager管理,默认使用SortshuffleManaer,存储方式就是每个shuffle Map Task会生存一个文件,包含所有分区的数据,然后附带一个记录文件各个分区的偏移量,然后我们默认使用的SortShuffleManager会自动的对文件额索引文件进行合并处理,减少文件数量,降低磁盘的IO压力,从而提高shuffle效率。
然后第三个就是数据的拉取阶段,是通过readSuffle从各个节点去拉群。首先Driver中的MapOutputTraver记录所有ShuffelMapTak的任务,下游Task想Tractorcah查询目标数据位置,然后进行拉群,拉去后就会进行数据处理,一般都是在内存当中进行处理,如果内存不足,就会溢写出到磁盘当中。