Spark数据倾斜(一):描述及定位

1、数据倾斜的原理

在执行shuffle操作的时候,是按照key,来进行values的数据的输出、拉取和聚合的。同一个key的values,一定是分配到一个reduce task进行处理的。
假如现在有多个key对应的values,总共是90万,但是问题是,可能某个key对应了88万数据,key-values(88万数据)分配到一个task上去面去执行,另外两个task,可能各分配到了1万数据,可能是数百个key,对应的1万条数据。如下图所示,

image.png

2、数据倾斜的现象

spark数据倾斜,有两种表现:

  • 1、我们的大部分的task,都执行的特别特别快,(你要用client模式,standalone client,yarn client,本地机器只要一执行spark-submit脚本,就会开始打印log,task175 finished);剩下几个task,执行的特别特别慢,前面的task,一般1s可以执行完5个;假如总共有1000个task,可能最后第998、999 task,要执行1、2个小时才能执行完一个task。
    这就是出现数据倾斜了,虽然非常慢,但是还能执行。

  • 2、运行的时候,其他task都很快执行完了,也没什么特别的问题;但是有的task,就是会突然间,报了一个OOM,JVM Out Of Memory,内存溢出了,task failed,task lost,resubmitting task。反复执行几次都到了某个task就是跑不通,最后就挂掉。
    某个task就直接OOM,那么基本上也是因为数据倾斜了,task分配的数量实在是太大了!!!内存放不下,然后你的task每处理一条数据,还要创建大量的对象,所以内存爆掉了。
    这也是出现数据倾斜了,这种情况就很差,因为你的程序如果不去解决数据倾斜的问题,压根儿就跑不出来。

3、数据倾斜定位

出现数据倾斜的原因,基本只可能是因为发生了shuffle操作,在shuffle的过程中,出现了数据倾斜的问题。因为某个,或者某些key对应的数据,远远的高于其他的key。

  • 1、在自己的程序里面找找,哪些地方用了会产生shuffle的算子,groupByKey、countByKey、reduceByKey、join

  • 2、看log
    log一般会报是在你的哪一行代码,导致了OOM异常;或者呢,看log,看看是执行到了第几个stage!!!
    根据我们之前写过stage划分算法,把我们的spark代码,划分成一个一个的stage,然后查看日志中哪一个stage的task特别慢,
    最后通过stage定位到代码,去找找,代码那个地方,是哪个shuffle操作。

你可能感兴趣的:(Spark数据倾斜(一):描述及定位)