spark解决数据倾斜:https://blog.csdn.net/qq_35394891/article/details/82261571
spark中job stage task关系: https://blog.csdn.net/qq_35394891/article/details/82791968
https://segmentfault.com/a/1190000022104436
练习题 2:用 Spark 算子实现对 1TB 的数据进行排序?
关于这道题的解法,你可能很自然地想到了归并排序的原理,首先每个分区对自己分区进行排序,最后汇总到一个分区内进行全排序,如下图所示:
可想而知,最后 1TB 的数据都会汇总到 1 个 Executor,就算这个 Executor 分配到的资源再充足,面对这种情况,无疑也是以失败告终。所以这道题的解法应该是另一种方案,首先数据会按照键的区间进行分发,也就是 Shuffle,如 [0,100000]、 [100000,200000)和 [200000,300000],每个分区没有交集。照此规则分发后,分区内再进行排序,就可以在满足性能要求的前提下完成全排序,如下图:
这种方式的全排序无疑实现了计算的并行化,很多测试性能的场景也用这种方式对 1TB 的数据进行排序,目前世界纪录是腾讯在 2016 年达到的 98.8 秒。对于这种排序方式,Spark 也将其封装为 sortByKey 算子,它采用的分区器则是 RangePartitioner。
小结
Spark Shuffle 是 Spark 最重要的机制,作为大数据工程师的你,有必要深入了解,Shuffle机制也是面试喜欢问到的一个问题,前面三张关于Shuffle的图大家一定要吃透。另外, Spark 作业的性能问题往往出现在 Shuffle 上,在上个课时中,我们也是通过广播变量而避免了 Shuffle,从而得到性能的提升,所以掌握了 Spark Shuffle 能帮助你有针对性地进行调优。
最后给你出一个思考题:还是在 08 课时第 2 道思考题的基础上,如果数据并没有均匀分布,那么很可能某个分区的数据会异常多,同样会导致作业失败,对于这种数据倾斜的情况,你认为有没有办法避免呢?
总结shuffle
发生在宽依赖算子所产生的跨节点数据移动称之为shuffle
shuffle算子:group
shuffle演变:HashShuffle-产生大量的中间文件(map * reducer的文件个数)造成过多的文件句柄和网络传输
推出Consolidation机制,旨在通过共用输出文件以降低文件数,但是无法根本解决文件过多问题, 因为reduce依然需要去拉取(reduce个数 * cpu core)个任务。