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

134 阅读2分钟

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

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

上节课我们学习了Spark,明白了Spark的原理和生态,也了解了RDD的概念,引出了SparkSQL,今天我们来学习大数据Shuffle原理与实践

Shuffle概述

MapReduce概述

MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算,2004年谷歌发布了 《MapReduce:Simplified Data Processing on Large Clusters》论文 在开源实现的MapReduce中,存在MapShuffleReduce三个阶段

  • Map阶段,是在单机上进行的针对一小块数据的计算过程

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

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

为什么shuffle对性能非常重要

Shuffle的过程中会产生大量的磁盘 IO、网络 IO、以及压缩、解压缩、序列化和反序列化的操作,这一系列的操作对性能都是一个很大的负担。

Sshuffle算子

Shuffle算子分类

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

image.png

Spark中对shuffle的抽象

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

算子内部的依赖关系

image.png

Shuffle Dependency构造 -Aggregator

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

Shuffle过程

Shuffle实现的发展历程

image.png

Hash Shuffle -写数据

每个partition会映射到一个独立的文件

image.png

Hash Shuffle -写数据优化

每个partition会映射到一个文件片段

image.png

Sort shuffle:写数据

每个task生成一个包含所有partition数据的文件

image.png

Sort shuffle:读数据

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

image.png

Push Shuffle

为什么需要Push Shuffle

Avg IO size太小,造成了大量的随机IO,严重影响磁盘的吞吐 M * R次读请求,造成大量的网络联届,影响稳定性

Magnet实现原理

  • Spark driver组件,协调整体的shuffle操作

  • map任务的shuffle writer过程完成后,增加了一个额外的操作Push-merge,将数据复制一份推到远程shuffle服务上

  • magnet shuffle service是一个强化版的ESS.将隶属于同一个shuffle partition的block,会在远程传输到magnet后被merge到一个文件中

  • reduce任务从magnet shuffle service接收合并好的shuffle数据

Cloud Shuffle Service思想

image.png

Cloud Shuffle Service AQE

一个partition会最终对应到多个Epochfile,每个EPoch 目前设置时512MB

image.png