项目问题总结

项目1中出现以下几个问题的解决方案

发生数据倾斜:

1、大部分的task,都执行的特别快,剩下的几个task,执行的特别特别慢,前面的1s执行5个,但是最后需要执行2个小时
2、运行的时候,其他task都执行完了,也没什么特别的问题,但是有的task,就会突然间报OOM,JVM Out of Memory,内存溢出,反复执行几次到某个task都跑不通,最后就挂掉了
ps:不能单纯靠偶然的内存溢出就判断发生了数据倾斜。需要通过Spark WebUI查看报错的那个stage的各个task的运行时间以及分配的数据量,才能确定是否是由于数据倾斜导致本次的内存溢出。
3、在某些worker上的executor不给力,造成task运行时间长。

定位数据倾斜出现的原因与出现问题的位置

根据log去定位

出现数据倾斜的原因,基本只可能是因为发生了shuffle操作,在shuffle的过程中,出现了数据倾斜的问题。因为某个或者某些key对应的数据,远远的高于其他的key。
1、你在自己的程序里面找找,哪些地方用了会产生shuffle的算子,groupByKey、countByKey、reduceByKey、join
2、看log
log一般会报是在你的哪一行代码,导致了OOM异常。或者看log,看看是执行到了第几个stage。spark代码,是怎么划分成一个一个的stage的。哪一个stage生成的task特别慢,就能够自己用肉眼去对你的spark代码进行stage的划分,就能够通过stage定位到你的代码,到底哪里发生了数据倾斜。
在这里插入图片描述

解决方案

方案1:在对RDD执行shuffle算子时,给shuffle算子传入一个参数,比如reduceByKey(1000),该参数就设置了shuffle算子执行时shuffle read task的数量。对于Spark Sql的shuffle类语句,比如groupby 、join 等,需要设置一个参数,即spark.sql.shuffle.partitions,该参数代表了shuffle read task 的并行度
方案2(适合于聚合聚类的操作):这个方案的核心实现思路就是进行两阶段聚合。第一次是局部聚合,先给每个key都打上一个随机数,比如10以内的随机数,此时原先一样的key就变成不一样的了,比如(hello, 1) (hello, 1) (hello, 1) (hello, 1),就会变成(1_hello, 1) (1_hello, 1) (2_hello, 1) (2_hello, 1)。接着对打上随机数后的数据,执行reduceByKey等聚合操作,进行局部聚合,那么局部聚合结果,就会变成了(1_hello, 2) (2_hello, 2)。然后将各个key的前缀给去掉,就会变成(hello,2)(hello,2),再次进行全局聚合操作,就可以得到最终结果了,比如(hello, 4)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值