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

115 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第7天。

大数据 Shuffle 原理与实践

shuffle 概述: hadoop中在mapper之后,reducer之前的阶段称之为shuffle,是mapreduce的核心。我们不用知道它的定义,只需要知道它的功能,以及它的优化。 那么为什么会有shuffle呢? hadoop中,map负责数据的初级拆分获取解析,reduce负责最终数据的集总,除了业务逻辑的功能外,其他的核心数据处理都是由shuffle来支持。 为什么shuffle如此重要呢? 这是因为,数据shuffle表示了不同分区数据交换的过程,不同的shuffle策略性能差异较大。目前在各个引擎中shuffle都是优化的重点,在spark框架中,shuffle是支撑spark进行大规模复杂数据处理的基石。

shuffle算子汇总: 1.去重 2.聚合 3.排序 4.重分区 5.集合或者表操作

Spark Shuffle包括: HashShuffleManager 未被优化的HashShuffleManager:假设每个Executor 只有 1 个 CPU core,无论 Executor 上分配多少个 Task 线程,同一时间都只能执行一个 Task 线程。 优化的HashShuffleManager:设置 spark.shuffle.consolidateFiles为 true 即可开启优化机制(默认为 false) SortShuffleManager 普通运行机制 bypass 运行机制 TungstenSortShuffle 各类Shuffle优缺点: HashShuffle 优点:不需要排序 缺点:打开,创建的文件过多

SortShuffle 优点:打开的文件少、支持map-side combine 缺点:需要排序

TungstenSortShuffle 优点:更快的排序效率,更高的内存利用效率 缺点:不支持map-side combine

Shuffle优化: 避免shuffle ——使用broadcast替代join 使用可以map-side预聚合的算子 Shuffle 参数优化 Shuffle 倾斜优化 什么叫倾斜?有什么危害? 数据倾斜的原理很简单:在进行shuffle的时候,必须将各个节点上相同的key拉取到某个节点上的一个task来进行处理,比如按照key进行 聚合或join等操作。此时如果某个key对应的数据量特别大的话,就会发生数据倾斜。比如大部分key对应10条数据,但是个别key却对应了100万 条数据,那么大部分task可能就只会分配到10条数据,然后1秒钟就运行完了;但是个别task可能分配到了100万数据,要运行一两个小时。因此,整 个Spark作业的运行进度是由运行时间最长的那个task决定的。 危害: 出现数据倾斜的时候,Spark作业看起来会运行得非常缓慢,甚至可能因为某个task处理的数据量过大导致内存溢出。

解决倾斜方法举例: 增大并发度 和 AQE