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操作。

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

推荐阅读更多精彩内容

  • 1.1、 分配更多资源 1.1.1、分配哪些资源? Executor的数量 每个Executor所能分配的CPU数...
    miss幸运阅读 3,216评论 3 15
  • 1、 性能调优 1.1、 分配更多资源 1.1.1、分配哪些资源? Executor的数量 每个Executor所...
    Frank_8942阅读 4,631评论 2 36
  • 场景 数据倾斜解决方案与shuffle类性能调优 分析 数据倾斜 有的时候,我们可能会遇到大数据计算中一个最棘手的...
    过江小卒阅读 3,492评论 0 9
  • 原文:https://tech.meituan.com/spark-tuning-pro.html Spark性能...
    code_solve阅读 1,207评论 0 34
  • 这个海岛已接近半岛的最东方,不到五点钟,天色已经颇亮。 从宾馆几分钟就走到了海边。海滩上看不到人,可几行新鲜的脚印...
    子肖阅读 531评论 13 22