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

90 阅读1分钟

这是我参与【第四届青训营】笔记创造活动的第六天。 经典shuffle过程:

  • map阶段
  • shuffle阶段
  • reduce阶段
  • 为什么shuffle如此重要
    • 数据shuffle表示了不同分区数据交换的过程,不同的shuffle策略性能差异较大。目前在各个引擎中shuffle都是优化的重点,在spark框架中,shuffle是支撑spark进行大规模复杂数据处理的基石。

shuffle算子

  • 常见的触发shuffle的算子

    • repartition

      • coalesce、repartition
    • ByKey

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

      • cogroup、join

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),
    • Serializer,
    • Optional key ordering (of Scala’s scala.math.Ordering type),
    • Optional Aggregator,
    • mapSideCombine flag which is disabled (i.e. false) by default.
  • Partitioner

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

    • 接口

      • numberPartitions
      • getPartition
  • Aggregator

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

    • 接口

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

Push Shuffle

  • shuffle过程存在哪些问题?

    • 数据存储在本地磁盘,没有备份
    • IO 并发:大量 RPC 请求(M*R)
    • IO 吞吐:随机读、写放大(3X)
    • GC 频繁,影响 NodeManager
  • 为了优化该问题,有很多公司都做了思路相近的优化,push shuffle

Magnet主要流程

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