Hive 事物表
Hive Transactional Tables 事务表
Hive 事务背景知识
Hive 本身从设计之初时,就是不支持事务的,因为Hive的核心目标是将已经存在的结构化数据文件映射成为表,然后提供基于表的SQL分析处理,是一款面向分析的工具。且映射的数据通常存储于HDFS上,而HDFS是不支持随机修改文件数据的。
这个定位就意味着在早期的 Hive 的 SQL 语法中是没有 update,delete 操作的,也就没有所谓的事务支持了,因为都是 select 查询分析操作。
从 Hive0.14 版本开始,具有 ACID 语义的事务已添加到 Hive 中,以解决以下场景下遇到的问题:
流式传输数据。使用如 Apache Flume 或 Apache Kafka 之类的工具将数据流式传输到 Hadoop 集群中。虽然这些工具可以每秒数百行或更多行的速度写入数据,但是 Hive 只能每隔 15 分钟到一个小时添加一次分区。频繁添加分区会很快导致表中大量的分区。
因此通常使用这些工具将数据流式传输到现有分区中,但是这会使读者感到脏读(也就是说,他们将在开始查询后看到写入的数据),并将许多小文件留在目录中,这将给 NameNode 带来压力。通过事务功能,同时允许读者获得一致的数据视图并避免过多的文件。尺寸变化缓慢。在典型的星型模式数据仓库中,维度表随时间缓慢变化。例如,零售商将开设新商店,需要将其添加到商店表中,或者现有商店可能会更改其平方英尺或某些其他跟踪的特征。这些更改导致插入单个记录或更新 记录(取决于所选策略)。
数据重述。有时发现收集的数据不正确,需要更正。从 Hive 0.14 开始,可以通过 INSERT,UPDATE 和 DELETE 支持这些用例。
Hive事务表局限性
虽然 Hive 支持了具有 ACID 语义的事务,但是在使用起来,并没有像在 MySQL 中使用那样方便,有很多局限性。原因很简单,毕竟 Hive 的设计目标不是为了支持事务操作,而是支持分析操作,且最终基于 HDFS 的底层存储机制使得文件的增加删除修改操作需要动一些小心思。具体限制如下:
- 尚不支持
BEGIN
,COMMIT
和ROLLBACK
。所有语言操作都是自动提交的。 - 仅支持 ORC文件格式(STORED AS ORC)。
- 默认情况下事务配置为关闭。需要 配置参数开启 使用。
- 表必须是 分桶表(Bucketed) 才可以使用事务功能。
- 表参数 transactional 必须为 true;
- 外部表不能成为 ACID 表,不允许从非 ACID 会话读取/写入 ACID 表。
案例:创建使用 Hive 事务表
如果不做任何配置修改,直接针对 Hive 中已有的表进行 Update、Delete、Insert 操作,可以发现,只有 Insert 语句可以执行,Update 和 Delete 操作会报错。
如何在 Hive 中配置开启事务表,并且进行操作:
1 |
|