我们在一个大约5 TB大小的表/视图上运行一个简单的查询。我们正在执行ETL,最后通过添加分区将数据添加到核心表中。
但是由于我们正在处理的数据非常庞大,因此查询产生了4000多个mappers和1000多个reducer。查询还会运行40分钟以上。
如何提高/减少资源利用率?
查询:
insert overwrite table dss.prblm_mtrc partition (LOAD_DT) select *, '2019-01-02' as LOAD_DT from dss.v_prblm_mtrc_stg_etl
答案 0 :(得分:1)
使用静态分区,以防目标表中已经有很多分区,Hive将在最终加载之前对其进行扫描,请参见以下内容:HIVE Dynamic Partitioning tips
insert overwrite table dss.prblm_mtrc partition (LOAD_DT='2019-01-02') select * from dss.v_prblm_mtrc_stg_etl
如果源表中的小文件太多,请尝试缩小它们,使用concatenate for orc files或使用merge during loading source table
使用矢量化,调整映射器和化简器的并行性:https://stackoverflow.com/a/48487306/2700344
set hive.vectorized.execution.enabled = true;
set hive.vectorized.execution.reduce.enabled = true;
所有矢量化设置均为here。
如果目标表包含许多已经加载的分区,请尝试关闭统计信息自动收集,此设置可能会加快加载速度:
set hive.stats.autogather=false;
如果源表是orc并且拆分计算花费的时间太长,请尝试以下设置:
hive.exec.orc.split.strategy=BI;
有关ORC策略的更多信息:ORC split strategy