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

114 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第4天,笔记内容围绕「大数据 Shuffle原理与实践」课程展开,主要介绍Shuffle概述、Shuffle算子和Shuffle过程。

1.Shuffle概述

1.1 MapReduce概述

  • 2004年谷歌发布了《MapReduce:Simplified Data Processing on LargeClusters》论文
  • 在开源实现的MapReduce中,存在Map、Shuffle、Reduce三个阶段。

1.2 Shuffle阶段

  • Shuffle阶段,在map阶段的基础上,进行数据移动,为后续的reduce阶段做准备.

1.3 Reduce过程

  • Reduce阶段,对移动后的数据进行处理,依然是在单机上处理一小份数据.

1.4为什么shuffle 对性能非常重要

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

Shuffle描述着数据从map task输出到reduce task输入的这段过程。shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过shuffle这个环节,shuffle的性能高低直接影响了整个程序的性能和吞吐量。因为在分布式情况下,reduce task需要跨节点去拉取其它节点上的map task结果。这一过程将会产生网络资源消耗和内存,磁盘IO的消耗。通常shuffle分为两部分:Map阶段的数据准备和Reduce阶段的数据拷贝处理。一般将在map端的Shuffle称之为Shuffle Write,在Reduce端的Shuffle称之为Shuffle Read.

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

Shuffle算子

2.1 Shuffle算子分类

Spark中会产生shuffle的算子大概可以分为4类

image.png

2.2 Spark中对shuffle的抽象–宽依赖、窄依赖

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

3.Shuffle过程

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退出历史舞台

3.1 Hash Shuffle

  • 写数据
    每个partition会映射到一个独立的文件

image.png

  • 写数据优化
    每个partition会映射到一个文件片段

image.png

3.2 Sort shuffle

  • 写数据 每个task生成一个包含所有partiton数据的文件

image.png

3.3 Shuffle-读数据

每个reduce task分别获取所有map task生成的属于自己的片段 image.png