写点什么

spark 调优(一):从 hql 转向代码

  • 2022 年 7 月 05 日
  • 本文字数:983 字

    阅读完需:约 3 分钟

大家好,我是怀瑾握瑜,一只大数据萌新,家有两只吞金兽,嘉与嘉,上能 code 下能 teach 的全能奶爸

如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~



1. 起因

日常大数据的处理,常见的数据输出就是最大最小值,求个和,求个平均数这种,常见的写法,写个 hql,先分个组,在加一个 max 或 sum 就可以


SELECT id,name,  max(score1),  sum(score2),  avg(score3)  FROM table  GROUP BY id,name
复制代码


当然如果条件更复杂一些,比如加一个 if 判断,就是 sql 稍微长一些,但还是能写出来


本地测试,还 OK,测试环境,勉强能行,感觉不错,无非就是怼资源的问题


但放到上产上,直接傻眼


snappy压缩,原始数据500G280亿条数据第一步Shuffle Write 800G接下来的任务预估需要8个小时跑完
复制代码


我可是用 1.5T 的内存,200 个并发,内存经常溢出,超时,GC 时间巨长

2.优化开始

sql 有问题,首先肯定第一反应就是优化资源分配和使用


--conf spark.storage.memoryFraction=0.7
复制代码


有很多任务心跳超时


--conf spark.executor.heartbeatInterval=240
复制代码


任务序列化时间过长


--conf spark.locality.wait=60
复制代码


发现 GC 时间过长,优化 jvm 参数


-XX:+UseG1GC
复制代码


发现 spark 有任务合并,在特殊位置增加 reparation,强制任务分隔


dataset.repartition(20000)
复制代码


经过一系列优化发现有效果,但收效甚微,最后一步执行还是要以小时计算


仔细分析了一下 sql,是不是 spark 底层对多次的 max,min 这种,在数据量大的时候需要多次遍历数据

3. 问题解决

最后的决定,用代码写,再试一次


Dataset<Row> ds = spark.sql(sql);dsTag0200.javaRDD().mapPartitionsToPair(数据转型分组当key做成tuple2此处我缓存了一些需要后面聚合的差值).reduceByKey(判断最大最小sum的聚合操作使用差值直接聚合一遍就可以直接输出最终结果)
复制代码


激动的心颤抖的手,任务执行,下班走人,生死有命富贵在天,执行结果,大宝明天见


当然最终结果 1 个半小时结束,效率还可以接受而且这样内存比较受控,可以更高的增加 executor 等通过合理资源去提高并行度

4 总结

对于 hql 相对复杂的一些操作,尤其是对原始数据,一定要考虑数据量的问题,数据量大到一定程度,不是怼资源可以过去的了,而且这样优化的空间也会变得很少



结束语

如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~

可关注公众号【怀瑾握瑜的嘉与嘉】,获取资源下载方式

发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2022.07.01 加入

还未添加个人简介

评论

发布
暂无评论
spark调优(一):从hql转向代码_spark_怀瑾握瑜的嘉与嘉_InfoQ写作社区