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

79 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第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数据的副本。