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

53 阅读2分钟

这是我参与【第四届青训营】笔记创作活动的第5天

一、本堂课重点内容

1)spark数据shuffle策略

2)shuffle的实现和优化

3)对比分析不同数据shuffle方式的优缺点

4)介绍Cloud Shuffle Server总体架构和实现

二、详细知识点介绍

2.1 shuffle 概述

1)Map阶段:在单机上进行的针对一小块数据的计算过程

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

3)Reduce阶段:对移动后的数据进行处理,依然是在单机上处理一小份数据

2.2 shuffle 对性能非常重要的原因

(1)M*R次网络连接 (2)大量的数据移动 (3)数据丢失风险 (4)可能存在大量的排序操作 (5)大量的数据序列化、反序列化操作 (6)数据压缩

2.3 Shuffle 算子分类

image.png

2.4 Partitioner 两个接口

numberPartitions、getPartition

2.5 shuffle 过程的触发流程

image.png

2.6 BypassMergeShuffleWriter

(1) 不需要排序,节省时间

(2) 写操作的时候会打开大量文件

(3) 类似于Hash Shuffle

2.7 UnsafeShuffleWriter

(1)使用类似内存页储存序列化数据

(2)数据写入后不再反序列化

2.8 常见问题

(1)数据存储在本地磁盘,没有备份 (2)IO并发:大量RPC请求(M*R) (3)IO吞吐:随机读、写放大(3X) (4)GC频繁,影响NodeManager

2.9 常见倾斜处理办法 (1)提高并行度(优点:足够简单,缺点:只缓解、不根治)

三、实践练习例子

3.1 Shuffle 算子应用

 代码`:val text=sc.textFile("mytextfile.txt")
       val counts=text
           .flatMap(line => line.split(" "))
           .map(word => (word,1))
           .reduceByKey(_+_)
       counts.collect]`
       

3.2 参数优化

代码:`select 
            ad_type,
            sum(click),
            sum(duration)
       from ad_show
       where date='20220101'
       group by
           ad_type`

四、课后个人总结

本章节学习中Shuffle算子部分的ShuffleDependency及其相关组件和Push shuffle中的Cloud Shuffle Service的设计实现思路,其中,上述讲述中的Cloud Shuffle Service流程较为复杂,需要分步理解。