减少映射器和约简器,以便在Hive中对非常大的表/视图进行简单查询

时间:2019-01-08 17:59:15

标签: hadoop hive hdfs query-optimization apache-tez

我们在一个大约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

1 个答案:

答案 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