赞
踩
SparkStreaming解决数据倾斜方法
两阶段聚合的方式解决数据倾斜
解释:
对DStream 进行map操作对原始key前加上随机值,map完后进行第一次reducebykey操作,此结果为打散key后的reducebykey结果,再次进行map操作根据分隔符,去掉随机数保留原有key,map后再进行reducebykey,保证相同key的数据准确累加。
代码实现
val dsStream=stream.filter(item => item.value().split("\t").length == 3)//过滤合格的数据
.mapPartitions(partitions => //对所有分区的数据进行转换
partitions.map(item => {
val rand = new Random() //创建随机数对象
val line = item.value() //获取value
val arr = line.split("\t") //切割
val id = arr(1) //取第二个元素
(rand.nextInt(3) + "_" + id, 1) //随机数与app_id进行拼接,并且返回二元组
}))
val result = dsStream.reduceByKey(_ + _) //重组之后的第一次reduceByKey
result.map(item => { //进行map转换把key切割还原
val id = item._1.split("_")(1)
(id, item._2)
}).reduceByKey(_ + _).print() //还原之后进行第二次聚合
想要更多文档资料及更多大数据相关文档资料请加qq群下载:912703269
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。