大数据 Shuffle 原理与实践 | 青训营笔记

52 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第五天

一、本堂课重点内容:

  • shuffle概述、shuffle的基本过程
  • spark中的shuffle算子及其基本特性
  • spark中的shuffle过程

二、详细知识点介绍:

shuffle算子及其基本特性

常见的触发shuffle的算子

算子会产生shuffle是因为数据要产生移动

  • repartition(改变分区)

    • coalesce、repartition
  • ByKey(聚合kv对)

    • groupByKey、reduceByKey、aggregateByKey、combineByKey、sortByKeysortBy
  • Join

    • cogroup、join
  • distinct

算子内部的依赖关系

创建会产生shuffle的RDD时,RDD会创建Shuffle Dependency来描述Shuffle相关的信息

image.png

Shuffle Dependency构造时重要的两个对象

Shuffle Dependency是spark中对shuffle的一个抽象,这个对象的构造函数中包含若干变量 ,Partitioner和Aggregator是最重要的两个对象。

  • Partitioner(抽象类),经典实现:HashPartitioner

    • 用来将record映射到具体的partition的方法

    • 接口

      • numberPartitions
      • getPartition
  • Aggregator

    • 在map侧合并部分record的函数

    • 接口

      • createCombiner:只有一个value的时候初始化的方法
      • mergeValue:合并一个value到Aggregator中
      • mergeCombiners:合并两个Aggregator

spark中的shuffle过程

  • Register Shuffle

    • 由action算子触发DAG Scheduler进行shuffle register
    • Shuffle Register会根据不同的条件决定注册不同的ShuffleHandle

image.png

  • BypassMergeSortShuffleWriter:HashShuffle不需要map()端聚合和排序。

根据partitiId将record依次输出到不同的buffer中,填满后spill到磁盘的分区文件中。

缺点:资源消耗过高,每个分区都需要一个buffer且同时需要建立多个分区文件来spill,适合分区数较小的情况。

  • UnsafeShuffleWriter:TunstonShuffle 不需要map()端聚合但需要排序。 建立一个Array将<K,V>record转化为<(PID,K),V>,根据partitionId+Key进行排序,最后将record写入一个文件中,通过建立索引来标示每个分区。

Array大小可控且可以扩容和spill到磁盘的功能。

  • SortSHuffleWriter:SortShuffle需要map()端聚合,需要or不需要按照Key排序 建立一个类似HashMao+Array的数据结构(PartitionedAppendOnlyMap) HashMap中的Key是“partitionId+Key”,value是经过相同combine的聚合结果。

三、引用参考&推荐书目