Hive锁机制及死锁排查
Hive的锁机制是如何工作的?请说明Hive锁的类型(共享锁/排他锁)、锁级别(表锁/分区锁)以及锁超时处理。在实际生产中如何排查和解决Hive锁等待和死锁问题?
回答
孤独的心
Hive锁机制实现如下:
1. 锁类型
- 共享锁(S锁):读操作获取,允许多个S锁共存
- 排他锁(X锁):写操作(INSERT/UPDATE/DELETE/ALTER)获取,互斥
- 意向锁:读意向(IS)、写意向(IX),用于层级封锁
2. 锁级别
- 表级锁:全表扫描的查询、DDL操作
- 分区级锁:带分区过滤的查询,只锁相关分区
- 锁粒度优先:分区 < 表,分区级锁并发度更高
3. 锁管理器
- Hive 2.x+ 默认使用 ZKLockManager(基于ZooKeeper)
- 旧版本使用 Embedded Lock Manager(仅单Metastore)
- 锁信息存储在 Metastore 的 TABL_LOCKS / PARTITION_LOCKS 表
4. 锁超时与死锁处理
- hive.lock.numretries(默认100次)
- hive.lock.sleep.between.retries(默认60秒)
- 总等待时间可达100分钟
- 死锁检测通过锁等待图实现,超时后自动释放
5. 排查与解决
-- 查看当前锁
SHOW LOCKS <table>;
SHOW LOCKS <table> PARTITION (<partition>);
-- 查看锁等待
SELECT * FROM HIVE_LOCKS;
- 使用
SHOW LOCKS确认锁持有者 - 检查长时间运行查询,kill阻塞的query
- 优化分区裁剪减少锁范围
- 设置合理的锁超时参数
- 对于非ACID表可设置
hive.support.concurrency=false关闭锁