hadoop - 减少映射器和减少器以在 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
解决方案
使用静态分区,如果目标表中已经有很多分区,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 拆分策略
推荐阅读
- django - django 从具有相同外键的多个表中选择记录
- python - 如何使用 TimestampedGeoJson 和 folium 为 GPS 点创建绘图动画?
- mockito - 永远不会返回的模拟挂起
- php - 未找到 Microsoft Graph Todo 类
- java - 如何将 Java 类中的数据存储到 mysql 中?
- ios - 如何使用 XCUITesting 在 iOS 中自动化 Google/Facebook 注册?
- spring-boot - Spring Boot JMS 监听器不会部署在 EAP 7.3 (JBoss/Wildfly) 上
- docker - docker overlay2 增加大小
- python - 如何在 python 中为绑定的 PDF 文件创建目录 (TOC)
- ruby-on-rails - 是否可以将 OCI 对象存储与 aws-sdk-s3 gem 一起使用?