Spark数据倾斜问题


什么是数据倾斜

在对一个数据集进行并行处理的过程中,当执行Shuffle操作的时候,是通过Key来进行Value的输出,聚合等操作的。而对于相同的Key,都会被分到一个Redece Task来处理,那么如果某个Key所对应的Value数据量相比与其他的Key高出很多,就会出现数据倾斜。


简单来说:
数据倾斜就是,在一个并行处理的数据集中,某一个Partition的数据量显著高于其它的Partition,从而会导致整个数据集的处理速度下降。

数据倾斜的现象

在Spark中,每个Job会被划分为多个Stage,每个Stage会包含多个Task,这些Task会被并行处理。那么,如果出现了数据倾斜,也就是说,某一个Task所要处理的Partition数据量比起其他并行执行的Task所要处理的Partition数据量要大很多,那么,可以想象,这个数据集的处理速度就会远远落后于集群平均处理速度,就会浪费大量的时间。

  1. 假如,有一百万条数据要并行处理,共有4个Task,假设每个Task处理10万数据需要1分钟,那么,可以看出,前三个Task1分钟就能够执行完成,而第四个Task则需要7分钟才能执行完成,那么执行完整个Stage总共所需要的时间就是7分钟。
    如果没有发生数据倾斜,每个Task能够平均分配数据,即每个Task处理25万的数据,那么,执行完整个Stage所需要的时间就是2.5分钟。
    所以说,发生数据倾斜最直接的现象就是一些Task执行的很快,而有些Task就会执行的特别慢,从而降低对数据的处理速度。

  2. 第二种现象,就是,由于某个Task处理的数据量太大,导致执行该Task的机器内存根本放不下这些数据,就会发生OOM(OutOfMemory)异常,最终会导致,整个作业无法执行。

如何定位数据倾斜的位置

数据倾斜问题的出现,基本上是因为在程序中使用到了产生Shuffle的算子。

  1. 首先需要检查程序中有哪些地方使用到了产生Shuffle的算子,比如:reduceByKey,groupByKey,join,countByKey等。

  2. 检查log

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.1、 分配更多资源 1.1.1、分配哪些资源? Executor的数量 每个Executor所能分配的CPU数...
    miss幸运阅读 8,387评论 3 15
  • 1、 性能调优 1.1、 分配更多资源 1.1.1、分配哪些资源? Executor的数量 每个Executor所...
    Frank_8942阅读 10,101评论 2 36
  • 场景 数据倾斜解决方案与shuffle类性能调优 分析 数据倾斜 有的时候,我们可能会遇到大数据计算中一个最棘手的...
    过江小卒阅读 8,789评论 0 9
  • Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势 | 36大数据 http://...
    葡萄喃喃呓语阅读 4,680评论 0 10
  • 端午节回老家,转角坐着三两个六七十岁的老头老太,大概十五六年前吧,印象中他们就是那样坐在小巷的转角,每天上学放学都...
    微乴问阅读 1,209评论 0 0