这是我参与「第四届青训营」笔记创作活动的第7天,笔记的内容是有关青训营课程中的一个分享.
前言
这一次的内容是关于大数据Shuffle的原理,主要是分享Spark中的shuffle算子以及介绍Shuffle。
一、Shuffle概述
讨论Shuffle前我首先介绍一下MapReduce,因为Shuffle是在属于其中一个阶段的。
唉开源实现的MapReduce中,存在Map、Shuffle、Reduce三个阶段。
Shuffle的阶段是在map阶段的基础上,进行数据移动,为后续的reduce阶段做准备。
Shuffle对性能的重要性:
- M*R次网络连接
- 大量的数据移动
- 数据丢失风险
- 可能存在大量的排序操作
- 大量的数据序列化、反序列化操作
- 数据压缩
在目前的大数据场景下,数据Shuffle表示了不同分区数据交换的过程,不同的shuffle策略性能差异较大。
目前在各个引擎中Shuffle都是优化的重点,在spark框架中,Shuffle是支撑spark进行大规模复杂数据处理的基石。
二、Shuffle算子
2.1 Shuffle算子分类
Saprk中会产生shuffle的算子大概可以分为4类。
2.2 Spark中对shuffle的抽象 -宽依赖、窄依赖
- 窄依赖:父RDD的每个分片至多被子RDD中的一个分片所依赖
- 宽依赖:父RDD中的分片可能被子RDD中的多个分片所依赖
2.3 Shuffle Dependency构造 - Partitioner
- 两个接口
- numberPartitions
- getPartition
- 经典实现
- HashPartitioner
总结
这一节课对Shuffle宽窄依赖有了清晰的认识,对ShuffleDependency及其相关的组件也有了基本的认识。
常见的shuffle算子在自己的实际操作中遇到了四种中的三种,shuffle对性能的影响也学习到了,对我受益匪浅。