悬赏了,spark sql group by sum特别慢,请大牛支持,谢谢

flyaga 2017-01-18 01:59:19
HDP2.4.0版本,Spark sql运行在yarn-client模式,现在发现有些语句跑特别慢,20个节点,一千多个cpu核心,8T内存,数据量不到一亿条,都是类似这样的语
select 字段1,字段2,。。。,字段n,sum(字段a),sum(字段b),。。。,sum(字段z) from table1 group by 字段1,字段2,。。。,字段n,

group by十个字段,然后sum20多个值,竟然要十分钟以上,而把数据加载到一台oracle服务器,开启多核计算,同样语句只要30秒。

spark sql设置成动态分配,spark.dynamicallocation.enabled=true,设置成最大最小和初始化都是300。

发现是卡在最后一个task里,例如有200个任务,卡在最后一个任务里,最后一个任务占95%以上时间。

java调用spark的thrift server接口,直接运行SQL语句,没有采用调spark rdd方法,因为业务逻辑多且复杂,sql好维护。

请大牛分析下慢的原因,指导下如何提高查询速度,谢谢
...全文
6153 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
十锁 2021-06-29
  • 打赏
  • 举报
回复

老哥解决了吗? 我做完一轮数据分析后,产生了新的400W数据,要对这个数据进行group by的统计,sparkSql要10+分钟,而放到oracle 数据库 7S就出结果了,感觉也不是数据倾斜的关系,400W数据的分布已经是分区之后的,且分区相对均匀。

SuiQingYang 2020-04-17
  • 打赏
  • 举报
回复
引用 1 楼 LinkSe7en 的回复:
典型的数据倾斜。在一个stage里,每个task对应一个partition。当有一个partition的数据量大于其他的,就会出现你的情况。 这种情况你只能用代码的方法,观察问题所在的stage对应的dataset,然后在执行sql前,reparation(>200,有文档建议是2k)。 如果问题仍存在,就要对group by的字段值加盐,group by一轮后,去盐再group by得到最终数据。
加盐操作,如果是group by多个字段怎么办。比如group by A B C D,这种情况怎么加呢。还有reparation设置,是在执行sql前,直接设置嘛。
SuiQingYang 2020-04-17
  • 打赏
  • 举报
回复
引用 3 楼 LinkSe7en 的回复:
[quote=引用 2 楼 flyaga 的回复:] 多谢,group by 加盐?什么意思
举个简单例子:一个表有两列:id,num,然后执行语句:SELECT id , sum(num) as sum FROM t GROUP BY id 然后发现id有个值重复了1w,其他值都重复比较小,那么就很容易数据倾斜。 那么我们要写个自定义函数:输入一个字符串,返回 str + "-|-" + (Math.abs(rnd.nextInt() * 200) % 200 也就是为id增加一个-|-0~199的随机后缀。那么,一万条记录将被随机拆成200组每组50条记录。这就是加盐。具体拆多少组可以通过参数去控制。对加盐后的id进行group by,出来的数据,再把随机后缀去掉,再group by一轮就得到最终数据 [/quote] 真心请教 加盐操作,如果是group by多个字段怎么办。比如group by A B C D,这种情况怎么加呢。还有reparation设置,是在执行sql前,直接设置嘛。
SuiQingYang 2020-04-17
  • 打赏
  • 举报
回复
加盐,如果是group by多个字段怎么办。比如group by A B C D,这种情况怎么加呢。
maideclp123 2017-08-07
  • 打赏
  • 举报
回复
11111111111
myl353 2017-08-06
  • 打赏
  • 举报
回复
我是来学习的
九指码农 2017-07-25
  • 打赏
  • 举报
回复
很明显的数据倾斜问题啊,还有如果你的数据放在关系型数据库,记得要并发的去读,否则数据会全部落到一个分区里,别的分区没数据,就算你repartition 也得出发shuffle,shuflle肯定也耗时啊,最好指定分区键去读取。定位数据倾斜的原因。你这样子的集群,这么点数据量,应该是秒级别的出结果的
  • 打赏
  • 举报
回复
想知道数据存放在哪里的
许子御 2017-07-07
  • 打赏
  • 举报
回复
我来学习下。
kxg916361108 2017-07-07
  • 打赏
  • 举报
回复
解决了么?我也遇到同样的问题了。。。
flyaga 2017-04-20
  • 打赏
  • 举报
回复
@cy309173854 你有试过很多个sum和group吗?简单的查询速度还是可以的
LinkSe7en 2017-02-22
  • 打赏
  • 举报
回复
引用 12 楼 java8964 的回复:
Is it really "数据倾斜" depending on the statistics. You should check the statistic of Spark Job, especially how many records processed in the last slow task, Spark Spill Read/Write volume, comparing with other fast tasks, then draw the conclusion. Even though it looks like "数据倾斜", but without statistics, nobody is sure.
数据倾斜=data skew。教你装逼
曹宇飞丶 2017-02-22
  • 打赏
  • 举报
回复
引用 14 楼 cy309173854 的回复:
那么大的内存 ,表有多大,直接cache table ,加上spark.sql.inMemoryColumnarStorage.compressed 参数,我670G的数据缓存RDD至Storage Size in Memory才2.4G。 查询都是秒出结果。 ps:集群300g内存 , 280cores
忘了说,我的数据量是4000w
曹宇飞丶 2017-02-22
  • 打赏
  • 举报
回复
那么大的内存 ,表有多大,直接cache table ,加上spark.sql.inMemoryColumnarStorage.compressed 参数,我670G的数据缓存RDD至Storage Size in Memory才2.4G。 查询都是秒出结果。 ps:集群300g内存 , 280cores
q13477027443 2017-02-19
  • 打赏
  • 举报
回复
我来学习下了。
java8964 2017-02-15
  • 打赏
  • 举报
回复
Is it really "数据倾斜" depending on the statistics. You should check the statistic of Spark Job, especially how many records processed in the last slow task, Spark Spill Read/Write volume, comparing with other fast tasks, then draw the conclusion. Even though it looks like "数据倾斜", but without statistics, nobody is sure.
winds_xp 2017-02-06
  • 打赏
  • 举报
回复
1. 加盐之后如果性能没变,我觉得这个就要具体看是什么原因了,可能加了之后你的数据仍然倾斜。 你要把这个看清楚。 2.如果最后一个job消耗了95%的性能,那么就不是sum个数的问题,因为其它task具有一样的sum数可是性能却很快。 所以我觉得还是得从数据倾斜找原因。
flyaga 2017-01-23
  • 打赏
  • 举报
回复
parquet格式
iamXiaMi 2017-01-22
  • 打赏
  • 举报
回复
文件的格式是什么?什么类型的? 如果是卡最后个任务的话,一般来说是repartition了,可能是合并文件。
flyaga 2017-01-20
  • 打赏
  • 举报
回复
现在只能同时并行跑多段sql,可以缩短运行时间
加载更多回复(7)

1,261

社区成员

发帖
与我相关
我的任务
社区描述
Spark由Scala写成,是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于MapReduce算法实现的分布式计算。
社区管理员
  • Spark
  • shiter
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧