大数据 Shuffle 原理与实践(下篇)|青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第2天 前几天已经对流式计算、批式计算、spark等等有了一些了解。今天继续来学习上次没学完的课。 1.reducer之前的操作都为shuffle 2.rdd弹性分布式数据集
3.7 Writer实现 - BypassMergeShuffleWrite
- UnsafeShuffleWriter(对外)
- SortShuffleWrite(对内)
3.8 Reader实现
— 网络时序图
1.使用基于netty的网络通信框架 2.位置信息记录在MapOutputTracker中 3.主要会发送两种类型的请求(openBlocks请求,Chunk请求或Stream请求)
— ShuffleBlockFetchIterator(随即放)
1.区分local和remote节省网络消耗 2.防止OOM
— External Shuffle Service
ESS作为一个存在于每一个节点上的agent为所有Shuffle Reader提供服务,从而优化了Spark作业的资源利用率, Map Task在运行结束后可以正常退出
3.9 Shuffle 优化使用的技术
— Zero Copy
DMA:直接存储器存取,是指外部不通过CPU而直接与系统内存交换数据接口技术。
—Netty Zero Copy
1.可堆外内存,避免JVM堆内存到堆外内存的数据拷贝 2.CompositeByteBuf、Unpooled.wrappedBuffer. ByteBuf.slice , 可以合并、包装、切分数组,避免发生内存拷贝
3.Netty使用FileRegion实现文件传输,FileRegion底层封装了FileChannel#transferTo() 方法,可以将文件缓冲区的数据直接传输到目标Channel,避免内核缓冲区和用户态缓冲区之间的数据拷贝
3.10 常见问题
1.数据存储在本地磁盘,没有备份 2.IO并发:大量RPC请求(M*R) 3.IO吞吐:随机读、写大放(3X) 4.GC频繁,影响NodeManager
3.11 Shuffle 优化
1.避免shuffle(使用broadcast替代join)
2.使用可以map-side预聚合的算子
3.12shuffle参数优化
3.13 Shuffle倾斜处理办法
1.提高并行度 2.AQE Skew Join 3.14 案例 — 参数优化