Hive查询速度越来越慢,是踩了哪些常见坑?如何优化?
- 内容介绍
- 文章标签
- 相关推荐

说实话, 只要在大数据岗位干过一年以上,应该都遇到过那种离谱的 Hive 查询:昨天 3 分钟能跑完的任务,今天突然 40 分钟还卡在 map 阶段;同一个 SQL 在测试环境飞快,到了生产连日志都刷不动;有时候 Tez 跑得稀碎,一切换回 MR 又灵了…,瞬间迷茫了,说白了就是...。
性能下降不是 SQL 老化, 而是小文件越来越多
平心而论... 后来啊一看 HDFS 文件,整整 1.8 亿个小文件。NameNode 的 CPU 直接干到 280% GC 开始上天整个任务调度都慢得要死。
我见过 NameNode 主要原因是小文件太多,重启耗时 47 分钟才恢复。
历史遗留项目
你资源够多自然快,资源不够也只能干着急。
不同引擎不是谁更牛,而是“谁更适合你的数据特征”
我以前也会随便写:
SELECT * FROM big_table WHERE event_type = 'login'
看上去很正常对吧?但这会导致:
- 没有命中分区
- full scan 全表扫描
改成:
SELECT , , FROM big_table WHERE event_type = 'login'
打个比方, 如果你要在仓库里找一把扳手,合理的方式不是“把整个仓库搬到办公室”, 我算是看透了。 而是“只把工具箱拿来”。列裁剪就是只读必要列。谓词下推就是尽可能提前过滤。

说实话, 只要在大数据岗位干过一年以上,应该都遇到过那种离谱的 Hive 查询:昨天 3 分钟能跑完的任务,今天突然 40 分钟还卡在 map 阶段;同一个 SQL 在测试环境飞快,到了生产连日志都刷不动;有时候 Tez 跑得稀碎,一切换回 MR 又灵了…,瞬间迷茫了,说白了就是...。
性能下降不是 SQL 老化, 而是小文件越来越多
平心而论... 后来啊一看 HDFS 文件,整整 1.8 亿个小文件。NameNode 的 CPU 直接干到 280% GC 开始上天整个任务调度都慢得要死。
我见过 NameNode 主要原因是小文件太多,重启耗时 47 分钟才恢复。
历史遗留项目
你资源够多自然快,资源不够也只能干着急。
不同引擎不是谁更牛,而是“谁更适合你的数据特征”
我以前也会随便写:
SELECT * FROM big_table WHERE event_type = 'login'
看上去很正常对吧?但这会导致:
- 没有命中分区
- full scan 全表扫描
改成:
SELECT , , FROM big_table WHERE event_type = 'login'
打个比方, 如果你要在仓库里找一把扳手,合理的方式不是“把整个仓库搬到办公室”, 我算是看透了。 而是“只把工具箱拿来”。列裁剪就是只读必要列。谓词下推就是尽可能提前过滤。

