Spark踩坑vlog——join时shuffle的大坑

业务背景

    项目中将两个表进行join,一个大表,一个小表,在平时200 executor-core * 20G executor-memory的资源下跑的挺好的,随着业务数据的增加,有一天,这个任务就跑不出来了,重试5次每次都失败,最后任务报错;
    报错时,俩表情况如下:大表的数据量约为278亿,1TB左右,另一个的数据量约为480万,4GB左右;通过DAG图发现,任务卡在俩表join的那个stage上;

报错信息

1.spark sql实现报错

    当使用SparkSQL对俩表进行join时,报错为:
org.apache.spark.shuffle.MetadataFetchFailedException:Missing an output location for shuffle 0
以及
org.apache.spark.shuffle.FetchFailedException:Failed to connect to hostname:port

2.rdd实现报错

    当使用rdd对俩表进行join时,报错为:
WARN TaskSetManager:Lost task 17.1 in stage 4.1:java.io.FileNotFoundException:一个文件/目录
以及
org.apache.spark.shuffle.FetchFailedException:Error in opening FileSegmentManagedBuffer

梳理过程

    通过看这些错哈,能发现是在join时产生的shuffle出了问题,那么我们对shuffle进行分析一下:shuffle过程分为两部分shuffle write和shuffle read;
    其中shuffle write就相当于write in local memory,这个过程中的分区数,是由上一个阶段的rdd分区数来决定的;shuffle read就是把数据读出来,然后在根据其对应的key进行reduce,得到结果;
    分析了这两个过程,发现报错中,Missing an output location for shuffle 0还有其他的报错,原因都是因为,在一个task执行对应数据计算的时候,太大了,最终失败,导致心跳检测无法检测到或者是超过了connection-time,所以最终找不到这个task及结果;那么我们还是得从降低这个task中处理的数据来入手。

优化策略

    首先,减小分区数据的最直接的办法,就是将整个数据都变小,所以尽可能在shuffle前,把改filter掉的数据全都过滤掉;其次,最粗暴的办法就是直接增大每个executor-memory,直接增大每个task的可支配内存;接着,通过“少量多次”的思想,把shuffle时的数据,分成尽可能多的、合理的分区数,官方建议分区数为程序总executor-core的2~3倍;最后,那就是投机取巧一点的办法了,想办法避开shuffle,如:使用map side join或broadcast join来避免shuffle过程;
    小tips:两表join时,将较小的表放在右边,这样会将小表读进内存,与接下来的大表匹配;hive则相反;
    总结一下:

  • 1.增大资源
  • 2.filter
  • 3.调整shuffle partition的数量
  • 4.是否数据倾斜
  • 5.map side join或broadcast join

具体实施效果

    此次出现的bug,不适用于方案2、5,因为那些数据都是要用的,并且数据量太大,不支持广播等;

方案1

    把整个程序的资源增加到executor-core=3; executor-num=100; executor-memory=30g; driver-memory=20g最终的结果还是在join时的最后两个task上失败了;

方案3

    使用了SparkSQL,在Spark SQL中设置shuffle时的分区时,应该设置参数spark.sql.shuffle.partition,这个参数默认为200,按照官方建议的总程序executor-core的2~3倍,设置值为800;
    并且为了更好的将数据打散,将两个表单独select出来后,小表的分区从自身的200 repartition到800,大表则按照自身的3200参与计算;
    发现运行结果,最终卡在join最后的4个task上,4个task失败,导致最终失败;

方案4

    通过查看,发现最终失败的几个task,各自计算的memory都为17.8G及以上,因此最终还是数据倾斜,调整数据倾斜的方式有很多,因为我想早点睡觉,之后如果翻看到的同学,就去翻翻前面的文章吧。
    最终定位到此次数据倾斜的原因是因为,两个表的join字段的数据类型不一致,大表的关联字段为String型,小表的关联字段为bigint型;在关联前,对小表执行cast(bigint to string),然后再join,并加上以上方案的行为,之后的task分区就变得均匀多了,成功运行~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容