Spark Shuffle实现

Spark Shuffle实现

Spark 调度系统的三巨头:DAGScheduler、TaskScheduler 和 SchedulerBackend。相信你已经感受到,调度系统组件众多且运作流程精密而又复杂。

任务调度的首要环节,是 DAGScheduler 以 Shuffle 为边界,把计算图 DAG 切割为多个执行阶段 Stages。显然,Shuffle 是这个环节的关键。那么,我们不禁要问:“Shuffle 是什么?为什么任务执行需要 Shuffle 操作?Shuffle 是怎样一个过程?”

由于 Shuffle 的计算几乎需要消耗所有类型的硬件资源,比如 CPU、内存、磁盘与网络,在绝大多数的 Spark 作业中,Shuffle 往往是作业执行性能的瓶颈,因此,我们必须要掌握 Shuffle 的工作原理,从而为 Shuffle 环节的优化打下坚实基础。

什么是 Shuffle

Shuffle 的本意是扑克的“洗牌”,在分布式计算场景中,它被引申为集群范围内跨节点、跨进程的数据分发。在工地搬砖的任务中,如果我们把不同类型的砖头看作是分布式数据集,那么不同类型的砖头在各个分公司之间搬运的过程,与分布式计算中的 Shuffle 可以说是异曲同工。

Shuffle 的过程也是类似,分布式数据集在集群内的分发,会引入大量的磁盘 I/O 与网络 I/O。在 DAG 的计算链条中,Shuffle 环节的执行性能是最差的。你可能会问:“既然 Shuffle 的性能这么差,为什么在计算的过程中非要引入 Shuffle 操作呢?免去 Shuffle 环节不行吗?”

其实,计算过程之所以需要 Shuffle,往往是由计算逻辑、或者说业务逻辑决定的。

比如,在 Word Count 的例子中,我们的“业务逻辑”是对单词做统计计数,那么对单词“Spark”来说,在做“加和”之前,我们就是得把原本分散在不同 Executors 中的“Spark”,拉取到某一个 Executor,才能完成统计计数的操作。

结合过往的工作经验,我们发现在绝大多数的业务场景中,Shuffle 操作都是必需的、无法避免的。既然我们躲不掉 Shuffle,那么接下来,我们就一起去探索,看看 Shuffle 到底是怎样的一个计算过程。

Shuffle 工作原理

为了方便你理解,我们还是用 Word Count 的例子来做说明。在这个示例中,引入 Shuffle 操作的是 reduceByKey 算子,也就是下面这行代码


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值