1. 首页 > Hadoop教程 > 正文

大数据教程FG039-Hive事务与ACID实战

内容简介:本文详细介绍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 开启事务支持

— 在hive-site.xml中配置
<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

#!/bin/bash
# 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 并发控制案例

并发控制案例演示多用户同时操作的处理。风哥提示:事务表的并发控制需要合理设置隔离级别。

— 会话1:开始事务
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再次查询可以看到更新后的数据

# 会话1查询
+———-+————+——+——–+——+——-+
| 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

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息