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

163 阅读2分钟

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

shuffle概述

www.cnblogs.com/lintong-zf/…

所谓shuffle就是指把数据打乱重新组合。指数据从map task输出到reduce task输入的这段过程。

Mapreduce

  • map阶段:在单机上进行的针对一小块数据的计算
  • shuffle阶段:在map阶段的基础上,进行数据移动
  • reduce阶段:对移动后的数据进行处理,依然是在单机上处理一小份数据

为什么shuffle如此重要

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

shuffle算子

常见的触发shuffle的算子

  • repartition

    • coalesce、repartition

    重分区一般会shuffle,因为需要在整个集群中,对之前所有的分区的数据进行随机,均匀的打乱,然后把数据放入下游新的指定数量的分区内。

  • ByKey

    • groupByKey、reduceByKey、aggregateByKey、combineByKey、sortByKeysortBy

    byKey类的操作要对一个key,进行聚合操作,那么肯定要保证集群中,所有节点上的相同的key,移动到同一个节点上进行处理。

  • Join

    • cogroup、join

    两个rdd进行join,就必须将相同join key的数据,shuffle到同一个节点上,然后进行相同key的两个rdd数据的笛卡尔乘积。

shuffle过程

HashShuffle

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

SortShuffle

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

TungstenSortShuffle

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

push shuffle

shuffle过程存在哪些问题?

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

为了优化该问题,有很多公司都做了思路相近的优化,push shuffle