首页 > 解决方案 > 减少映射器和减少器以在 Hive 中对非常大的表/视图进行简单查询

问题描述

我们有一个在大约 5 TB 大小的表/视图上运行的简单查询。我们正在执行 ETL,最后通过添加分区将数据添加到核心表中。

但是由于我们正在处理的数据非常庞大,因此查询会产生 4000 多个映射器和 1000 多个减速器。查询也运行了 40 多分钟。

如何提高/减少资源利用率?

询问:

insert overwrite table dss.prblm_mtrc partition (LOAD_DT) select *, '2019-01-02' as LOAD_DT from dss.v_prblm_mtrc_stg_etl

标签: hadoophivehdfsquery-optimizationapache-tez

解决方案


使用静态分区,如果目标表中已经有很多分区,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

如果您的源表有太多小文件,请尝试减少它们,对 orc 文件使用 concatenate或在加载源表时使用合并

使用矢量化、调整映射器和缩减器并行性:https ://stackoverflow.com/a/48487306/2700344

set hive.vectorized.execution.enabled = true;
set hive.vectorized.execution.reduce.enabled = true;

所有矢量化设置都在这里

如果您的目标表包含许多已加载的分区,请尝试关闭自动收集统计信息,此设置可能会加快加载速度:

set hive.stats.autogather=false;

此外,如果您的源表是 orc 并且拆分计算需要很长时间,请尝试以下设置:

hive.exec.orc.split.strategy=BI;

更多关于 ORC 策略:ORC 拆分策略


推荐阅读