现象:Hive 提交 SQL 之后,任务长时间不动,Map 或者 Reduce 停在某个百分比不动,不报错、不失败,就是卡住。
底层跑 Hive on MR / Tez / Spark‑on‑YARN,绝大多数问题体现在 YARN 任务层面。
一、第一步:定位卡在哪一层
- 如果还没提交:卡在编译、解析、获取元数据(元数据库 MySQL 卡顿、NameNode 卡顿)
- 如果已经提交 YARN:去 Yarn UI 看对应 Job。看是 Map 阶段卡,还是 Reduce 阶段卡。
- Map 进度不动
- Reduce 卡在 0%、33%、99%、100%(99% 最典型,大概率数据倾斜)
- Task 大量 Pending,不启动
场景 1:任务已经提交 YARN,Reduce 卡在 99%
最高频:数据倾斜
现象:大部分 reduce 迅速跑完,少数几个 reduce 长时间 RUNNING,Shuffle Read/Reduce input records 巨大。
排查:
处理:
不要单纯加大 reduce 内存,治标不治本。
场景 2:Map 阶段卡住,Map 进度不动
补充:查看小文件方式
1)统计目录下文件总数量(最基础)
# 统计该目录下所有文件(递归)
hdfs dfs -count /user/hive/warehouse/xxx.db/xxx_table
输出格式:目录数 文件数 总字节数 路径
重点看第二个数字,文件数量巨大,大概率存在小文件。
2)筛选小于指定大小的文件(找出小文件)
# 查找 /xxx 下 小于128M 的文件,打印路径+大小
hdfs dfs -ls -R /user/hive/warehouse/xxx.db/xxx_table | awk '$5 < 134217728 {print $5,$8}'
# 查找小于1M的极小文件(高频排查)
hdfs dfs -ls -R /user/hive/warehouse/xxx.db/xxx_table | awk '$5 < 1048576 {print $5,$8}'
缺点:目录超大时ls -R很慢,不建议在生产根目录直接跑。
3)更高效:hdfs dfsadmin 读取 fsimage(推荐生产大集群)
NameNode 的 fsimage 保存全量元数据,离线统计,不占用 NN 压力
# 下载fsimage
hdfs dfsadmin -fetchImage /tmp/fsimage
# 解析统计小文件数量
hdfs oiv -i /tmp/fsimage -o /tmp/fsimage.txt -p Delimited
awk '$8 < 1048576 {print}' /tmp/fsimage.txt | wc -l
✅ 优点:不压 NameNode,适合全集群统计小文件总量。
4)Hive 表单独统计(数仓场景)
看numFiles字段,分区表可以循环查每个分区的文件数。
— Hive SQL查看表文件数量
describe formatted 库名.表名;
场景 3:大量 Task Pending,不启动,Map/Reduce 都是 0%
资源不足,YARN 没有可用 Container :YARN 集群资源被别的任务占满,队列资源耗尽,队列最大并发限制。
看 YARN UI,Applications 页面,大量任务处于 PENDING 状态。
排查点:
处理:
场景 4:还没有提交 YARN Job,Hive 客户端本身卡住
SQL 在编译阶段,根本没有生成 Job。 常见原因:
处理:
场景 5:卡住,reduce 不断 Full GC,偶尔 OOM
两种可能
- 如果只有个别 reduce 记录数大:倾斜。
- 如果所有 reduce 记录数差不多:调大 reduce 内存。
set mapreduce.reduce.memory.mb=4096;
set mapreduce.reduce.java.opts=-Xmx3276m;
二、标准排查流程
Hive SQL 卡住,第一步先看任务是否已经提交 YARN。
- Task 大量 Pending:YARN 队列资源不足,容器申请不到,kill 低优先级任务或者换队列。
- Reduce 卡在 99%,大部分 task 跑完少数很慢:优先怀疑数据倾斜。查看 Counter 的 Reduce‑input‑records 定位异常 reduce,下载 container 日志找热点 key,区分脏数据或者业务热点,做过滤或者打散优化。
- Map 阶段卡住:排查 HDFS 状态,是否大量小文件,开启输入合并;检查文件权限、块损坏。
三、常用应急参数(hive 会话内设置)
–合并小文件输入,减少map数
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
–groupby倾斜处理
set hive.groupby.skewindata=true;
–mapjoin开启
set hive.auto.convert.join=true;
–调整reduce内存
set mapreduce.reduce.memory.mb=4096;
set mapreduce.reduce.java.opts=-Xmx3276m;





