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

57 阅读2分钟

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

Shuffle概述

MapReduce——map阶段、shuffle阶段、reduce阶段。

shuffle算子

常见算子

repartition、bykey、join、distinct

宽依赖、窄依赖

窄依赖:父RDD的每个分片至多被RDD中的一个分片所依赖

宽依赖:父RDD的每个分片被RDD中的多个分片所依赖

image.png

Shuffle Dependency

Shuffle Dependency

  • 创建会产生shuffle的RDD时,RDD会创建Shuffle Dependency来描述Shuffle相关的信息
  • 构造函数
    • A single key-value pair RDD, i.e. RDD[Product2[K, V]],
    • Partitioner (available as partitioner property),根据key创建对应的文件
    • Serializer,
    • Optional key ordering (of Scala’s scala.math.Ordering type),
    • Optional Aggregator,
    • mapSideCombine flag which is disabled (i.e. false) by default.

Aggregator

Aggregator

  • 在map侧合并部分record的函数
  • 接口
    • createCombiner:只有一个value的时候初始化的方法
    • mergeValue:合并一个value到Aggregator中
    • mergeCombiners:合并两个Aggregator

Shuffle过程

Shuffle变迁过程

  • HashShuffle
    • 优点:不需要排序
    • 缺点:打开,创建的文件过多
  • SortShuffle
    • 优点:打开的文件少、支持map-side combine
    • 缺点:需要排序
  • TungstenSortShuffle
    • 优点:更快的排序效率,更高的内存利用效率
    • 缺点:不支持map-side combine

Shuffle Handle的创建

Register Shuffle根据不同条件创建不同的shuffle handle

image.png

Writer实现

  • BypassMergeShuffleWriter image.png
  • UnsafeShuffleWriter image.png
  • SortSHuffleWriter image.png

Reader

image.png

External Shuffle Service

为了解决Executor为了服务数据的fetch请求导致无法退出问题,我们在每个节点上部署一个External Shuffle Service,这样产生数据的Executor在不需要继续处理任务时,可以随意退出。

Push Shuffle

Magnet

image.png

image.png\

主要为边写边push的模式,在原有的shuffle基础上尝试push聚合数据,但并不强制完成,读取时优先读取push聚合的结果,对于没有来得及完成聚合或者聚合失败的情况,则fallback到原模式。

  • Cloud Shuffle Service架构

    • Zookeeper WorkerList [服务发现]
    • CSS Worker [Partitions / Disk | Hdfs]
    • Spark Driver [集成启动 CSS Master]
    • CSS Master [Shuffle 规划 / 统计]
    • CSS ShuffleClient [Write / Read]
    • Spark Executor [Mapper + Reducer]
  • Cloud Shuffle Service 读写流程

  • Cloud Shuffle Service 支持AQE

    • 在聚合文件时主动将文件切分为若干块,当触发AQE时,按照已经切分好的文件块进行拆分。