性能调优,最有效,最直接,最简单的方式,就是加资源,加并行度,注意RDD架构(复用同一个RDD,加上cache缓存);shuffle,jvm等,是次要的。

数据倾斜,解决方案:

第一个方案:聚合源数据


现在,做一些聚合操作,groupByKey,reduceByKey这种操作,说白了,就是拿到每个key对应的values;reduceByKey,说白了,就是对每个key对应的values执行一定的计算。

现在这些操作,比如groupByKey和reduceByKey,包括join,都是在spark作业中执行的


spark作业的数据来源,通常是哪里?90%情况下,数据来源都是hive表(hdfs,大数据分布式存储系统),hdfs上存储的大数据,进行各种各样的计算,hive表中的数据,通常是怎么出来的呢?有了spark以后,hive比较适合做什么事情,hive就是适合做离线的,晚上凌晨跑的,ETL(数据的采集,清洗,导入) ,从而去形成完整的hive中的数据仓库,说白了,数据仓库中就是一顿表,

spark作业的源表,hive表,其实通常情况下来说,也是通过某些hive etl生成的,hive etl可能是晚上凌晨在那跑,今天跑昨天的数据就可以

 


现在出现数据倾斜,某个key对应的88万数据,某些key对应几百条,某些key对应几十条,现在,直接在生成hive表的etl中,对数据进行聚合。比如按key来分组,将key对应的所有的values,全部用一种特殊的格式,拼接到一个字符串里面去,比如“key
= seesion, value:action_seq = 1 | user_id=1|search_keyword="火锅"”。。。

对key进行group,在spark中,拿到key=sessionid,values<Iterable>,hive
etl中,直接对key进行了聚合,那么也就意味着,每个key只是对应了一条数据,在spark中就不需要再去执行groupByKey+map这种操作了,直接对每个key对应的values字符串,map操作,进行你需要的操作即可

spark,可能就对这个操作,就不需要执行shuffle操作了,那么也就不可能导致数据倾斜了

第二个方案:过滤导致倾斜的key


你可能没有办法对每个key,就聚合出来一条数据,那么也可以做一个妥协,对每个key对应的数据,10万条,有好几个粒度,比如10万条包含了几个城市,几天,几个地区的数据,现在放粗粒度;直接就按照城市的粒度,做一下聚合,几个城市,几天,几个地区粒度的数据,都给聚合起来,比如说

city_id date area_id

select 。。。。 from . group by city_id将粒度放粗

尽量去聚合,减少每个key对应的数量,也许聚合到比较粗的粒度后,原先有10万数据量的key,现在只有1万数据量。减轻数据倾斜的现象和问题

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信