什么是数据倾斜
在对一个数据集进行并行处理的过程中,当执行Shuffle操作的时候,是通过Key来进行Value的输出,聚合等操作的。而对于相同的Key,都会被分到一个Redece Task来处理,那么如果某个Key所对应的Value数据量相比与其他的Key高出很多,就会出现数据倾斜。
简单来说:
数据倾斜就是,在一个并行处理的数据集中,某一个Partition的数据量显著高于其它的Partition,从而会导致整个数据集的处理速度下降。
数据倾斜的现象
在Spark中,每个Job会被划分为多个Stage,每个Stage会包含多个Task,这些Task会被并行处理。那么,如果出现了数据倾斜,也就是说,某一个Task所要处理的Partition数据量比起其他并行执行的Task所要处理的Partition数据量要大很多,那么,可以想象,这个数据集的处理速度就会远远落后于集群平均处理速度,就会浪费大量的时间。
-
假如,有一百万条数据要并行处理,共有4个Task,假设每个Task处理10万数据需要1分钟,那么,可以看出,前三个Task1分钟就能够执行完成,而第四个Task则需要7分钟才能执行完成,那么执行完整个Stage总共所需要的时间就是7分钟。
如果没有发生数据倾斜,每个Task能够平均分配数据,即每个Task处理25万的数据,那么,执行完整个Stage所需要的时间就是2.5分钟。
所以说,发生数据倾斜最直接的现象就是一些Task执行的很快,而有些Task就会执行的特别慢,从而降低对数据的处理速度。 -
第二种现象,就是,由于某个Task处理的数据量太大,导致执行该Task的机器内存根本放不下这些数据,就会发生OOM(OutOfMemory)异常,最终会导致,整个作业无法执行。
如何定位数据倾斜的位置
数据倾斜问题的出现,基本上是因为在程序中使用到了产生Shuffle的算子。
-
首先需要检查程序中有哪些地方使用到了产生Shuffle的算子,比如:reduceByKey,groupByKey,join,countByKey等。
-
检查log
网友评论