内容简介:本文详细介绍Hive事务与ACID特性的核心概念与生产实战应用。风哥教程参考Hive官方文档Hive Transactions、ACID Support等内容,涵盖事务表创建、INSERT/UPDATE/DELETE操作、事务管理、并发控制等核心知识点,结合生产环境实际案例,帮助读者掌握Hive事务处理在企业数据仓库中的实战应用技巧。
目录大纲
Part01-基础概念与理论知识
1.1 Hive事务概述
1.2 ACID特性详解
1.3 事务表架构原理
Part02-生产环境规划与建议
2.1 事务表设计规范
2.2 性能优化策略
2.3 运维管理方案
Part03-生产环境项目实施方案
3.1 事务表创建与配置
3.2 数据操作实战
3.3 事务管理实战
Part04-生产案例与实战讲解
4.1 数据更新场景案例
4.2 数据删除场景案例
4.3 并发控制案例
Part05-风哥经验总结与分享
5.1 事务表最佳实践
5.2 常见问题与解决方案
5.3 生产环境注意事项
Part01-基础概念与理论知识
1.1 Hive事务概述
Hive从0.13版本开始支持ACID事务,允许对表数据进行INSERT、UPDATE、DELETE操作。更多视频教程www.fgedu.net.cn
事务支持的发展历程:
Hive 0.13:支持INSERT事务
Hive 0.14:支持UPDATE、DELETE事务
Hive 2.0:支持完整ACID语义
Hive 3.0:优化事务性能,支持物化视图
事务应用场景:
1. 数据修正:更新错误数据
2. 数据删除:清理过期数据
3. 增量更新:小批量数据更新
4. 维度表维护:缓慢变化维处理
1.2 ACID特性详解
Hive事务支持完整的ACID特性:
原子性(Atomicity):事务中的操作要么全部成功,要么全部失败。学习交流加群风哥微信: itpux-com
一致性(Consistency):事务执行前后数据保持一致状态。
隔离性(Isolation):并发事务之间相互隔离,互不影响。
持久性(Durability):事务提交后,数据永久保存。
Hive支持的隔离级别:
SET hive.txn.isolation.level;
— 设置隔离级别
SET hive.txn.isolation.level=read_committed;
SET hive.txn.isolation.level=repeatable_read;
hive.txn.isolation.level=repeatable_read
# 支持的隔离级别
read_committed: 读已提交
repeatable_read: 可重复读(默认)
1.3 事务表架构原理
Hive事务表基于以下架构实现:
基础存储:ORC文件格式,支持高效更新
增量文件:UPDATE/DELETE操作生成增量文件
压缩合并:定期合并基础文件和增量文件
锁机制:基于ZooKeeper或内存的锁管理器
/user/hive/warehouse/fgedu_trans_table/
├── delta_0000001_0000001_0000/ # 增量目录
│ └── bucket_00000 # 增量文件
├── base_0000002/ # 基础目录
│ └── bucket_00000 # 基础文件
└── delete_delta_0000003_0000003_0000/ # 删除增量目录
Part02-生产环境规划与建议
2.1 事务表设计规范
事务表设计需要遵循以下规范:风哥提示:事务表设计要权衡功能需求和性能影响。
表属性要求:
1. 存储格式必须为ORC
2. 必须分桶(CLUSTERED BY)
3. 必须设置事务属性(TBLPROPERTIES)
分桶设计建议:
分桶数量建议为2的幂次方
分桶列选择高基数列
分桶数量根据数据量确定
2.2 性能优化策略
事务表性能优化要点:
SET hive.support.concurrency=true;
SET hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
— 优化参数
SET hive.compactor.initiator.on=true;
SET hive.compactor.worker.threads=5;
SET hive.compactor.check.interval=300;
— 压缩阈值
SET hive.compactor.delta.num.threshold=10;
SET hive.compactor.delta.pct.threshold=0.1f;
2.3 运维管理方案
事务表运维管理方案:更多学习教程公众号风哥教程itpux_com
SHOW COMPACTIONS;
SHOW TRANSACTIONS;
SHOW LOCKS;
— 手动触发压缩
ALTER TABLE fgedu_trans_table COMPACT ‘major’;
ALTER TABLE fgedu_trans_table COMPACT ‘minor’;
Part03-生产环境项目实施方案
3.1 事务表创建与配置
创建事务表需要满足特定条件。from bigdata视频:www.itpux.com
3.1.1 开启事务支持
<property>
<name>hive.support.concurrency</name>
<value>true</value>
</property>
<property>
<name>hive.txn.manager</name>
<value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
</property>
<property>
<name>hive.compactor.initiator.on</name>
<value>true</value>
</property>
<property>
<name>hive.compactor.worker.threads</name>
<value>5</value>
</property>
— 会话级别配置
SET hive.support.concurrency=true;
SET hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
SET hive.compactor.initiator.on=true;
SET hive.compactor.worker.threads=5;
OK
Time taken: 0.123 seconds
3.1.2 创建事务表
CREATE TABLE fgedu_user_profile (
user_id STRING,
user_name STRING,
age INT,
gender STRING,
city STRING,
level STRING,
update_time TIMESTAMP
) CLUSTERED BY (user_id) INTO 16 BUCKETS
STORED AS ORC
TBLPROPERTIES (
‘transactional’=’true’,
‘orc.compress’=’SNAPPY’,
‘orc.create.index’=’true’
);
— 验证表属性
SHOW TBLPROPERTIES fgedu_user_profile;
OK
Time taken: 0.234 seconds
# 表属性
+—————–+—————-+
| prpt_name | prpt_value |
+—————–+—————-+
| transactional | true |
| orc.compress | SNAPPY |
| orc.create.index| true |
+—————–+—————-+
3.2 数据操作实战
事务表支持INSERT、UPDATE、DELETE操作。学习交流加群风哥QQ113257174
3.2.1 INSERT操作
INSERT INTO TABLE fgedu_user_profile
VALUES
(‘U001’, ‘张三’, 28, ‘M’, ‘北京’, ‘VIP’, CURRENT_TIMESTAMP),
(‘U002’, ‘李四’, 32, ‘M’, ‘上海’, ‘SVIP’, CURRENT_TIMESTAMP),
(‘U003’, ‘王五’, 25, ‘F’, ‘广州’, ‘普通’, CURRENT_TIMESTAMP);
— 批量插入
INSERT INTO TABLE fgedu_user_profile
SELECT user_id, user_name, age, gender, city, level, CURRENT_TIMESTAMP
FROM fgedu_user_source;
Query ID = root_20240119190000_xxxx
Total jobs = 1
Loading data to table default.fgedu_user_profile
Table default.fgedu_user_profile stats: [numFiles=1, numRows=3, totalSize=1234, rawDataSize=456]
OK
Time taken: 12.345 seconds
3.2.2 UPDATE操作
UPDATE fgedu_user_profile
SET level = ‘VIP’, update_time = CURRENT_TIMESTAMP
WHERE user_id = ‘U003’;
— 批量更新
UPDATE fgedu_user_profile
SET level = ‘SVIP’, update_time = CURRENT_TIMESTAMP
WHERE city IN (‘北京’, ‘上海’, ‘广州’) AND age > 30;
Query ID = root_20240119190500_xxxx
Total jobs = 1
Rows updated: 1
OK
Time taken: 15.678 seconds
# 批量更新
Rows updated: 2
OK
Time taken: 18.234 seconds
3.2.3 DELETE操作
DELETE FROM fgedu_user_profile WHERE user_id = ‘U003’;
— 条件删除
DELETE FROM fgedu_user_profile WHERE age < 18;
— 查看删除后的数据
SELECT * FROM fgedu_user_profile;
Query ID = root_20240119191000_xxxx
Total jobs = 1
Rows deleted: 1
OK
Time taken: 14.567 seconds
# 查询结果
+———-+————+——+——–+——+——-+————————–+
| user_id | user_name | age | gender | city | level | update_time |
+———-+————+——+——–+——+——-+————————–+
| U001 | 张三 | 28 | M | 北京 | VIP | 2024-01-19 19:00:00.0 |
| U002 | 李四 | 32 | M | 上海 | SVIP | 2024-01-19 19:05:00.0 |
+———-+————+——+——–+——+——-+————————–+
3.3 事务管理实战
事务管理包括锁管理、压缩管理等操作。
3.3.1 锁管理
SHOW LOCKS;
— 查看表锁
SHOW LOCKS fgedu_user_profile;
— 查看扩展锁信息
SHOW LOCKS fgedu_user_profile EXTENDED;
+—————–+—————-+—————+————-+
| lock_id | database | table | lock_state |
+—————–+—————-+—————+————-+
| lock_0000001 | default | fgedu_user_profile | ACQUIRED |
+—————–+—————-+—————+————-+
3.3.2 压缩管理
SHOW COMPACTIONS;
— 手动触发Minor压缩
ALTER TABLE fgedu_user_profile COMPACT ‘minor’;
— 手动触发Major压缩
ALTER TABLE fgedu_user_profile COMPACT ‘major’;
+————-+—————-+—————-+————+————-+
| compaction_id | database | table | type | state |
+————-+—————-+—————-+————+————-+
| 1 | default | fgedu_user_profile | minor | succeeded |
| 2 | default | fgedu_user_profile | major | working |
+————-+—————-+—————-+————+————-+
# 手动压缩
Compaction enqueued with id 3
OK
Time taken: 0.456 seconds
Part04-生产案例与实战讲解
4.1 数据更新场景案例
本案例演示用户等级更新的完整流程。更多视频教程www.fgedu.net.cn
# user_level_update.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
echo “=== 用户等级更新 ===”
echo “Date: $(date)”
hive -e “
— 开启事务支持
SET hive.support.concurrency=true;
SET hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
— 查看更新前数据
SELECT user_id, user_name, level FROM fgedu_user_profile WHERE user_id IN (‘U001’, ‘U002’, ‘U003’);
— 根据消费金额更新等级
UPDATE fgedu_user_profile p
SET level = CASE
WHEN a.total_amount >= 10000 THEN ‘SVIP’
WHEN a.total_amount >= 5000 THEN ‘VIP’
ELSE ‘普通’
END,
update_time = CURRENT_TIMESTAMP
FROM (
SELECT user_id, SUM(amount) AS total_amount
FROM fgedu_orders
WHERE dt >= DATE_SUB(CURRENT_DATE, 30)
GROUP BY user_id
) a
WHERE p.user_id = a.user_id;
— 查看更新后数据
SELECT user_id, user_name, level FROM fgedu_user_profile WHERE user_id IN (‘U001’, ‘U002’, ‘U003’);
“
echo “=== 更新完成 ===”
Date: Fri Jan 19 19:30:00 CST 2024
# 更新前数据
+———-+————+——-+
| user_id | user_name | level |
+———-+————+——-+
| U001 | 张三 | VIP |
| U002 | 李四 | SVIP |
| U003 | 王五 | 普通 |
+———-+————+——-+
# 执行更新
Query ID = root_20240119193000_xxxx
Total jobs = 2
Rows updated: 3
OK
Time taken: 45.678 seconds
# 更新后数据
+———-+————+——-+
| user_id | user_name | level |
+———-+————+——-+
| U001 | 张三 | SVIP |
| U002 | 李四 | SVIP |
| U003 | 王五 | VIP |
+———-+————+——-+
=== 更新完成 ===
4.2 数据删除场景案例
数据删除场景演示过期数据清理。学习交流加群风哥微信: itpux-com
— 场景:删除超过1年未活跃的用户
— 查看待删除数据
SELECT COUNT(*) AS to_delete_count
FROM fgedu_user_profile p
LEFT JOIN fgedu_user_activity a ON p.user_id = a.user_id
WHERE a.last_active_time < DATE_SUB(CURRENT_DATE, 365) OR a.last_active_time IS NULL;
— 执行删除
DELETE FROM fgedu_user_profile
WHERE user_id IN (
SELECT p.user_id
FROM fgedu_user_profile p
LEFT JOIN fgedu_user_activity a ON p.user_id = a.user_id
WHERE a.last_active_time < DATE_SUB(CURRENT_DATE, 365) OR a.last_active_time IS NULL
);
+—————–+
| to_delete_count |
+—————–+
| 12500 |
+—————–+
# 执行删除
Query ID = root_20240119193500_xxxx
Total jobs = 2
Rows deleted: 12500
OK
Time taken: 123.456 seconds
4.3 并发控制案例
并发控制案例演示多用户同时操作的处理。风哥提示:事务表的并发控制需要合理设置隔离级别。
SET hive.support.concurrency=true;
SET hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
— 查询数据
SELECT * FROM fgedu_user_profile WHERE user_id = ‘U001’;
— 更新数据(未提交)
UPDATE fgedu_user_profile SET level = ‘VVIP’ WHERE user_id = ‘U001’;
— 会话2:同时查询
— 此时查询到的是更新前的数据(可重复读)
SELECT * FROM fgedu_user_profile WHERE user_id = ‘U001’;
— 会话1:提交后
— 会话2再次查询可以看到更新后的数据
+———-+————+——+——–+——+——-+
| user_id | user_name | age | gender | city | level |
+———-+————+——+——–+——+——-+
| U001 | 张三 | 28 | M | 北京 | SVIP |
+———-+————+——+——–+——+——-+
# 会话1更新
Rows updated: 1
OK
# 会话2查询(隔离性)
+———-+————+——+——–+——+——-+
| user_id | user_name | age | gender | city | level |
+———-+————+——+——–+——+——-+
| U001 | 张三 | 28 | M | 北京 | SVIP |
+———-+————+——+——–+——+——-+
# 会话1提交后会话2查询
+———-+————+——+——–+——+——-+
| user_id | user_name | age | gender | city | level |
+———-+————+——+——–+——+——-+
| U001 | 张三 | 28 | M | 北京 | VVIP |
+———-+————+——+——–+——+——-+
Part05-风哥经验总结与分享
5.1 事务表最佳实践
风哥在生产环境中使用事务表的经验总结:from bigdata视频:www.itpux.com
1. 适用场景选择:
适合:维度表更新、小批量数据修改、数据修正
不适合:大批量数据更新、高频写入场景
2. 分桶设计:
分桶数量根据数据量确定,建议每个桶100MB-1GB
分桶列选择高基数列,避免数据倾斜
3. 压缩策略:
定期执行压缩,避免增量文件过多影响性能
设置合理的压缩阈值,自动触发压缩
5.2 常见问题与解决方案
问题1:压缩任务失败
解决方案:检查压缩线程配置,查看压缩日志。
SHOW COMPACTIONS;
— 查看压缩日志
hdfs dfs -cat /tmp/hive/hive.log | grep -i compaction;
问题2:锁等待超时
解决方案:调整锁超时时间,优化事务执行时间。学习交流加群风哥QQ113257174
SET hive.lock.numretries=3;
SET hive.lock.sleep.between.retries=60;
5.3 生产环境注意事项
1. 性能影响:事务操作会产生额外开销,谨慎使用UPDATE/DELETE。
2. 压缩维护:定期检查压缩状态,确保压缩任务正常运行。
3. 备份策略:事务表需要特殊备份策略,考虑增量备份。
SELECT
table_name,
num_rows,
raw_data_size,
num_files
FROM hive_table_stats
WHERE transactional = ‘true’
ORDER BY table_name;
风哥提示:Hive事务表提供了ACID支持,但需要权衡功能需求和性能影响。在生产环境中,建议将事务表用于维度表维护、数据修正等场景,避免在高频写入场景中使用。同时要建立完善的压缩监控机制,确保事务表的性能稳定。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
