Spark项目实战-数据倾斜解决方案之聚合源数据

数据倾斜的解决跟之前讲解的性能调优,有一点异曲同工之妙。

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

数据倾斜问题最直接、最有效、最简单的方案就是:聚合源数据和过滤导致倾斜的key。

一、聚合源数据

我们在Spark做一些聚合的操作groupByKey、reduceByKey,其实就是拿到每个key对应的values或者对每个key对应的values执行一定的计算。现在这些操作,比如groupByKey和reduceByKey都是在spark作业中执行的。

而spark作业的数据来源,通常是哪里呢?90%的情况下,数据来源都是hive表(hdfs,大数据分布式存储系统)。有了spark以后,hive比较适合做什么事情?hive就是适合做离线的,晚上凌晨跑的ETL(extract transform load,数据的采集、清洗、导入),从而去形成一个完整的hive中的数据仓库,我们可以简单理解数据仓库就是一堆表。

spark作业的源表其实通常情况下来说也是通过某些hive etl生成的。hive etl可能是晚上凌晨在那儿跑,今天跑昨天的数据。而数据倾斜,某个key对应的80万数据,某些key对应几百条,某些key对应几十条。

现在咱们直接在生成hive表的hive etl中,对数据进行聚合。比如按key来分组,将key对应的所有的values,全部用一种特殊的格式,拼接到一个字符串里面去,比如“key=sessionid, value: action_seq=1|user_id=1|search_keyword=火锅|category_id=001;action_seq=2|user_id=1|search_keyword=涮肉|category_id=001”。

对key进行group,在spark中拿到key=sessionid,values<Iterable>。hive etl中直接对key进行了聚合,那么也就意味着每个key就只对应一条数据。在spark中就不需要再去执行groupByKey+map这种操作了。直接对每个key对应的values字符串,map操作,进行你需要的操作即可。 spark中可能对这个操作就不需要执行shffule操作了,也就根本不可能导致数据倾斜。或者是对每个key在hive etl中进行聚合,对所有values聚合一下,不一定是拼接起来,可能是直接进行计算。

聚合源数据的另一个思路:我们可能没有办法对每个key就聚合出来一条数据,那么也可以做一个妥协,对每个key对应的数据,有好几个粒度,比如10万条里面包含了几个城市、几天、几个地区的数据,现在放粗粒度。直接就按照城市粒度,做一下聚合,几个城市,几天、几个地区粒度的数据,都给聚合起来。总之尽量去聚合,减少每个key对应的数量,也许聚合到比较粗的粒度之后,原先有10万数据量的key,现在只有1万数据量。减轻数据倾斜的现象和问题。

二、过滤导致倾斜的key

如果你能够接受某些数据,在spark作业中直接就摒弃掉,不使用。比如说总共有100万个key,只有2个key是数据量达到10万的,其他所有的key对应的数量都是几十。这个时候,我们自己可以去取舍,如果业务和需求可以理解和接受的话,在你从hive表查询源数据的时候,直接在sql中用where条件,过滤掉某几个key。那么这几个原先有大量数据,会导致数据倾斜的key,被过滤掉之后,那么在spark作业中自然就不会发生数据倾斜了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值