这是我参与「第四届青训营 」笔记创作活动的第5天
1. Shuffle概述
在开源实现的MapReduce中,存在Map、Shuffle、Reduce三个阶段。
Map阶段,是在单机上进行的针对—小块数据的计算过程。
Shuffle阶段,在map阶段的基础上,进行数据移动,为后续的reduce阶段做准备。
reduce阶段,对移动后的数据进行处理,依然是在单机上处理一小份数据。
在大数据场景下,数据shuffile表示了不同分区数据交换的过程,不同的shuffile策略性能差异较大。在spark框架中,shuffle是支撑spark进行大规模复杂数据处理的基石。
Spark中对shuffle的抽象–宽依赖、窄依赖:
窄依赖:父RDD的每个分片至多被子RDD中的一个分片所依赖;
宽依赖:父RDD中的分片可能被子RDD中的多个分片所依赖。
2. Shuffle过程
1.Hash Shuffle -写数据:每个partition会映射到一个文件片段。
2.Sort shuffle -写数据:每个task 生成—个包含所有partiton 数据的文件。
3.Shuffle -读数据:每个reduce task分别获取所有map task生成的属于自己的片段。
3. Shuffle优化使用的技术:Netty Zero Copy
1.可堆外内存,避免JVM堆内存到堆外内存的数据拷贝。
2.CompositeByteBuf 、Unpooled.wrappedBuffer、ByteBuf.slice,可以合并、包装、切分数组,避免发生内存拷贝。
3.Netty使用FileRegion实现文件传输,FileRegion底层封装了FileChannel#transferTo()方法,可以将文件缓冲区的数据直接传输到目标Channel,避免内核缓冲区和用户态缓冲区之间的数据拷贝
4. Magnet
Magnet 实现原理:
1.Spark driver组件,协调整体的shuffle操作;
2.map任务的shuffle writer过程完成后,增加了一个额外的操作push-merge,将数据复制—份推到远程shuffle服务上;
3.magnet shuffle service是一个强化版的ESS,将隶属于同一个shuffle partition的block,会在远程传输到magnet后被merge到一个文件中;
4.reduce任务从magnet shuffle service接收合并好的shuffle数据。
Magnet可靠性:
1.如果Map task输出的Block没有成功Push到magnet上,并且反复重试仍然失败,则reducetask直接从ESS上拉取原始block数据;
2.如果magnet上的block因为重复或者冲突等原因,没有正常完成merge的过程,则reducetask直接拉取未完成merge的block;
3.如果reduce拉取已经merge好的block失败,则会直接拉取merge前的原始block;
4.本质上,magnet中维护了两份shuffle数据的副本。