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

150 阅读2分钟

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

Shuffle概述

什么是shuffle?

在最初的大数据计算工具MR任务中的map与reduce间需要进行Shuffle,Shuffle就是对数据进行重组,由于分布式计算的特性和要求,在实现细节上更加繁琐和复杂。数据shuffle表示了不同分区数据交换的过程,不同的shuffle策略性能差异较大。目前在各个引擎中shuffle都是优化的重点,在spark框架中,shuffle是支撑spark进行大规模复杂数据处理的基石。

为什么shuffle如此重要

  • M·R次网控连接
  • 大量的数据移动
  • 数据丢失风险
  • 可能存在大量的排序操作
  • 大量的数据序列化、反序列化接作
  • 数据压缩

Shuffle算子

分类

  1. repartition:重新选择分区
  2. Bykey:通过键分类
  3. join:聚合
  4. distinct:归类

Spark中对shuffle的抽象

  • 宽依赖:父RDD的每个分片至多被子RDD中的一个分片所依赖
  • 窄依赖:父RDD的分片可能被子RDD中的多个分片所依赖

Shuffle过程

spark中的shuffle的发展过程

  • Spark 0.8及以前 Hash Based Shuffle

  • Spark 0.8.1为Hash Based Shuffle引入File Consolidation机制

  • Spark 0.9引入ExternalAppendOnlyMap

  • Spark 1.1引入Sort Based Shuffle,但默认仍为Hash Based Shuffle

  • Spark 1.2默认的Shuffle方式改为Sort Based Shuffle

  • Spark 1.4引入Tungsten-Sort Based Shuffle

  • Spark 1.6 Tungsten-Sort Based Shuffle并入Sort Based Shuffle

  • Spark 2.0 Hash Based Shuffle退出历史舞台

HashShuffle

  • 优点:不需要排序
  • 缺点:打开,创建的文件过多

SortShuffle

  • 优点:打开的文件少、支持map-side combine
  • 缺点:需要排序

TungstenSortShuffle

  • 优点:更快的排序效率,更高的内存利用效率
  • 缺点:不支持map-side combine

3.2 Register Shuffle

  • 由action算子触发DAG Scheduler进行shuffle register

  • Shuffle Register会根据不同的条件决定注册不同的ShuffleHandle

  • 三种ShuffleHandle对应了三种不同的ShuffleWriter的实现

    • BypassMergeSortShuffleWriter:HashShuffle
    • UnsafeShuffleWriter:TunstonShuffle
    • SortSHuffleWriter:SortShuffle

Push Shuffle

shuffle过程存在问题

  • 数据存储在本地磁盘,没有备份
  • IO 并发:大量 RPC 请求(M*R)
  • IO 吞吐:随机读、写放大(3X)
  • GC 频繁,影响 NodeManager

Magnet实现原理

主要流程

image.png

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