spark hive 任务优化浅谈

本文探讨了数据倾斜在Spark和Hadoop中的表现及查找方法,并提供了业务逻辑、程序层面和调参等方面的解决方案。此外,还介绍了拆数据、合数据、预计算等任务优化策略,以及其他的实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在日常的etl开发的过程中,不管是使用spark,或者是hive来做开发,经常会遇见任务跑的特别慢,或者任务出现oom,或者数据量并不大,但是任务就是跑的特别慢等等情况。

关于任务的优化,我将自己工作中用到的一些小的trick分享出来。

数据倾斜

数据倾斜是什么?数据倾斜是在计算数据的时候,数据的分散度不够,大量的数据集中在一台或者几台机器上计算,导致整个计算过程过慢甚至失败。
举个例子,1TB的数据,十台机器并行计算,由于数据分区不合理,9台机器上各承担了10GB的计算任务,剩下910GB的数据在一台机器上。因而负载大的机器,需要的资源过大,运行的时间过长等等问题。

数据倾斜的表现

  • hadoop中的数据倾斜
    • 一个或者多个reduce卡主
    • 各种oom报错
      *单个reduce, 读写的数据量极大
  • spark中的数据倾斜
    • Excutor lost, OOM, shuffle过程出错
    • Driver OOM
    • 单个Executor执行特别就,整个任务卡在某个阶段不能执行
    • 正常运行的任务突然失败

问题查找

  • hadoop中的问题查找
    • 读取的数据源是否数据倾斜
    • group或者on的时候,是否有大量相同的key
  • spark中的问题查找
    • 读取的数据源是否数据倾斜
    • spark计算中的数据倾斜,只可能发生在shuffle操作阶段。查找代码,啊中的程序
    • 读取数据源,按照猜测对某几个字段进行group统计,定位倾斜的字段
    • 看log,根据spark ui,确定是哪个stage特别慢。然后根据stage,定位代码

问题解决

这个问题的解决主要从三个方面进行着手解决:业务逻辑、程序层面和调参方面
业务逻辑

  1. 如果读取的数据源倾斜比较严重,则上游写入数据平均一些

  2. 将直接聚合,改为二级甚至三级聚合。比如:
    select key1, xxx from a group by key1.
    改为
    select key1, xxx from ( select key1, key2, key3, xxx from a group by key1, key2, key3) group by key1

  3. 与2类似,如果没有存在的字段用于多重聚合。可以生成随机key,实现多重聚合。

  4. 区别对待,将倾斜的key的数据单独处理。比如倾斜的key,增加并行度等等方式。这里如何判断倾斜的key,可以使用历史数据或者随机sample的方式判断。或者倾斜的key单独join或者group不要等操作

  5. 自定义分区,需要用户自定义实现分区策略,这种方法效果比较明显。

程序层面

  1. 使用group by 提到count(dinstinc xxx)操作

调仓方面

  1. 不管是hive还是spark,如果有小表与大表join,可以使用mapjoin提到reduce join
  2. hsql,可以调整map, reduce的个数,来缓解数据倾斜问题
  3. 更多相关参数,可以去官网撸一遍配置

拆数据

另外一个关于任务优化的办法,就是化大为小,将大任务拆成小任务。下面提供几个拆数据的思路。

  1. 时间维度,将天任务改成小时任务,甚至将小时任务改成分钟任务甚至秒级别的实时任务。这样单次处理的任务数据量会小很多,比较好处理。
  2. 按照某个维度,对数据进行拆分,使用多个任务进行并行处理

合数据

天下合久必分,分久必合。如果一旦数据拆分特别细,导致hive分区过多,则会出现任务特别慢的情况。这种情况,可能就要考虑合并文件

预计算

这个思路是将可以提前计算的数据提前计算好,一旦等待的数据ready之后,可以更快的计算处理。
举个例子,原本一个任务需要读取A和B两份数据,A数据第二天凌晨1点就好了,B数据需要到第二天10点才能ready。如果在B数据好了之后再开始数据,则任务需要运行1个小时。但是通过修改代码,可以将A数据提前计算好,等到B数据ready之后,再进行计算,只需要20分钟。业务就可以看到数据了。

其他零零散散的任务优化技巧

  1. 大量的spark小任务,可以使用多线程提升效率
  2. 当涉及到大量数据任务的数据流的时候,优化数据产出流程或者重新建模,可能会更快的产出最终的数据。

参考资料

  1. https://blog.youkuaiyun.com/u010039929/article/details/55044407
  2. https://zhuanlan.zhihu.com/p/64240857
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值