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

123 阅读2分钟

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

一、Shuffle概述

1.1 MapReduce 概述

  • 2004年谷歌发布了《MapReduce:Simplified Data Processing on Large Clusters》论文
  • 在开源实现的MapReduce中,存在Map、Shuffle、Reduce三个阶段。
  • map阶段,是在单机上进行的针对一小块数据的计算过程
  • shuffle阶段,在map阶段的基础上,进行数据移动,为后续的reduce阶段做准备
  • Reduce阶段,对移动后的数据进行处理,依然是在单机上处理一小份数据

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

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

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

二、Shuffle算子

  • Shuffle算子分类

image.png

  • Shuffle算子应用

image.png

  • Spark中对shuffle的抽象-宽依赖、窄依赖

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

宽依赖:父RDD中的分片可能被子RDD中的多个分片所依赖

  • 算子内部的依赖关系

image.png

  • shuffle dependency构造

image.png

  • shuffle dependency构造-partitioner

image.png

  • shuffle dependency构造-aggregator

image.png

三、 shuffle优化使用的技术栈:Netty Zero Copy

  • 可堆外内存,避免JVM堆内存到堆外内存的数据拷贝。

  • CompositeByteBuf 、Unpooled.wrappedBuffer. ByteBuf.slice ,可以合并、包装、切分数组,避 免发生内存拷贝。

  • Netty使用FileRegion实现文件传输, FileRegion底层封装了FileChannel#transferTo0方法,可以 将文件缓冲区的数据直接传输到目标Channel,避免内核缓冲区和用户态缓冲区之间的数据拷贝。