一次Hive调优案例
一、问题引出
上游一张di表,日增数据量60GB,历史数据总量25TB。需求是从中抽取某筛选条件下的数据,并建立一张da表。
SQL如下:
select *
from t
where pt <= '${-1d_pt}'
每天凌晨运行该任务,运行时长约1小时,影响下游数据产出及时性。
二、问题分析
1.基础日志
观察日志,发现map task数量有3w+
2. tez-ui
观察tez-ui,发现在merge阶段,耗时约40min,主要耗时发生在merge阶段。推测map任务处理小文件过多,导致merge任务过重。
三、问题解决
1. 参数调优
set hive.tez.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; --HiveInputFormat换成CombineHiveInputFormat,将多个小文件打包成一个InputSplit提供给一个Map处理,避免因为大量小文件问题,启动大量任务。
set mapreduce.input.fileinputformat.split.minsize = 256000000; -- 每个Map最小输入大小
set mapreduce.input.fileinputformat.split.maxsize = 512000000; -- 每个Map最大输入大小
set hive.exec.parallel=true; --设置hive并发执行
首先进行map端小文件合并,将多个小文件打包成一个InputSplit提供给一个Map处理,避免因为大量小文件问题,启动大量任务。
然后控制每个map task处理的数据量,减少map task的数量。并设置hive并发执行。
经测试,加入以上参数后,任务运行时长可减少2/3以上。
2. 数据合并
由于是日志数据,可以将-2d的da数据,union上-1d的di,来获取-1d的da数据。SQL如下
select *
from t_da
where pt = '${-2d_pt}'
union all
select *
from t_di
where pt = '${-1d_pt}'
四、总结
以上为本次hive调优案例的处理过程。hive调优要求我们对hive、mapreduce执行原理较为熟悉,通过观察日志、执行DAG等信息,对症下药,方可获得较好的调优效果。