spark 数据倾斜的一些表现

我遇到的问题其实是自己的业务代码的bug导致shuffle时发生了倾斜,groupby操作时大量的key映射到了同一台机器。

我自己的bug没有多少参考价值,因为是一个弱智bug,但是由于之前没有这方面的经验,看了日志也不懂发生了什么,在群里请教了木艮同学和Jepson同学, 终于找到了问题。稍微写一下发生数据倾斜时的一些日志和监控图表吧,权当参考。

问题现象

  1. 任务日志显示某节点内存超过yarn的限制:xx G,被yarn杀掉。
  2. 打开webui(:4040/jobs),打开executor列表,会显示只有一个worker在工作,

    ![worker_list_data_leaning](https://yqfile.alicdn.com/32b3ee55e135ac608e8ec2ecd0266c09e36c3de6.png)
    
    对应的报错节点的日志:
    
16/10/31 11:10:18 INFO storage.MemoryStore: Block broadcast_14 stored as values in memory (estimated size 337.4 KB, free 13.2 MB)
16/10/31 11:12:44 ERROR executor.Executor: Managed memory leak detected; size = 5924550044 bytes, TID = 423
16/10/31 11:12:44 ERROR executor.Executor: Exception in task 0.0 in stage 13.0 (TID 423)
java.lang.OutOfMemoryError: Java heap space
    at org.apache.spark.util.collection.AppendOnlyMap.growTable(AppendOnlyMap.scala:218)
    at org.apache.spark.util.collection.SizeTrackingAppendOnlyMap.growTable(SizeTrackingAppendOnlyMap.scala:38)
    at org.apache.spark.util.collection.AppendOnlyMap.incrementSize(AppendOnlyMap.scala:204)
    at org.apache.spark.util.collection.AppendOnlyMap.changeValue(AppendOnlyMap.scala:151)
    at org.apache.spark.util.collection.SizeTrackingAppendOnlyMap.changeValue(SizeTrackingAppendOnlyMap.scala:32)
    at org.apache.spark.util.collection.ExternalSorter.insertAll(ExternalSorter.scala:192)
    at org.apache.spark.shuffle.sort.SortShuffleWriter.write(SortShuffleWriter.scala:64)
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:73)
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41)
    at org.apache.spark.scheduler.Task.run(Task.scala:89)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
16/10/31 11:12:46 ERROR util.SparkUncaughtExceptionHandler: Uncaught exception in thread Thread[Executor task launch worker-0,5,main]
java.lang.OutOfMemoryError: Java heap space
    at org.apache.spark.util.collection.AppendOnlyMap.growTable(AppendOnlyMap.scala:218)
    at org.apache.spark.util.collection.SizeTrackingAppendOnlyMap.growTable(SizeTrackingAppendOnlyMap.scala:38)
    at org.apache.spark.util.collection.AppendOnlyMap.incrementSize(AppendOnlyMap.scala:204)
    at org.apache.spark.util.collection.AppendOnlyMap
  • 下图是阿里云集群监控图表中的cpu曲线,黑色的曲线是其中一台worker,靠前的两次100%就是两次问题任务执行,红色的是修改了部分问题之后重新跑了一遍,还是有部分倾斜,但是成功跑完了。最后一段是正常曲线。(因为集群已经关了,没法看大图了。。)
    cpu_data_leaning
  • 下图是对应的内存曲线
    mem_data_leaning

可以看到,可能是webui的显示问题,shuffle read只显示200M+的数据量,实际内存使用已经超6G了,开始的时候没想到是这个问题。木艮同学指出日志出错是在shuffle阶段,应该是数据倾斜问题,Jepson同学说数据实际占有内存比数据大小大很多,于是我大概知道了可能出错的地方,排查了一下这个stage对应的DAG里带shuffle的transformation操作,才发现了bug。

我的问题是比较弱智的bug,加了一些数据源,新写了处理代码;然后新的任务改了,之前的任务代码忘记改了,导致新的数据没有设置key,全部group到一个地方去了。

优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/62541

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。