让 Hive 支持行级 insert、update、delete

目录

一、Hive 具有 ACID 语义事务的使用场景

1. 流式接收数据

2. 缓慢变化维

3. 数据重述

二、配置 Hive 支持事务(Hive 2.0)

1. 在 hive-site.xml 文件中添加如下配置项

2. 添加 Hive 元数据(使用 MySQL 存储)

三、测试

1. 启动 Hadoop 集群和 MySQL

2. 建立测试表

3. 测试 insert、update、delete

4. 已有非 ORC 表的转换

参考:


        Hive 从 0.14 版本开始支持事务和行级更新,但缺省是不支持的,需要一些附加的配置。要想支持行级 insert、update、delete,需要配置 Hive 支持事务。

一、Hive 具有 ACID 语义事务的使用场景

1. 流式接收数据

        许多用户使用诸如 Apache Flume、Apache Storm 或 Apache Kafka 这样的工具将流数据灌入 Hadoop 集群。当这些工具以每秒数百行的频率写入时,Hive 也许只能每 15 分钟到 1 小时添加一个分区,因为过于频繁地添加分区很快就会使一个表中的分区数量难以维护。而且这些工具还可能向已存在的分区中写数据,但是这样将会产生脏读(可能读到查询开始时间点以后写入的数据),还在这些分区的所在目录中遗留大量小文件,进而给 NameNode 造成压力。在这个使用场景下,事务支持可以获得数据的一致性视图同时避免产生过多的文件。

2. 缓慢变化维

        在一个典型的星型模式数据仓库中,维度表随时间的变化很缓慢。例如,一个零售商开了一家新商店,需要将新店数据加到商店表,或者一个已有商店的营业面积或其它需要跟踪的特性改变了。这些改变会导致插入或修改个别记录。从 0.14 版本开始,Hive 支持行级更新。

3. 数据重述

        有时发现数据集合有错误并需要更正。或者当前数据只是个近似值(如只有全部数据的 90%,得到全部数据会滞后)。或者业务业务规则可能需要根据后续事务重述特定事务(打个比方,一个客户购买了一些商品后又购买了一个会员资格,此时可以享受折扣价格,包括先前购买的商品)。或者一个客户可能按照合同在终止了合作关系后要求删除他们的客户数据。从 Hive 0.14开始,这些使用场景可以通过行级 insert、update 和 delete 支持。

二、配置 Hive 支持事务(Hive 2.0)

1. 在 hive-site.xml 文件中添加如下配置项

<property>
    <name>hive.support.concurrency</name>
    <value>true</value>
</property>
<property>
    <name>hive.exec.dynamic.partition.mode</name>
    <value>nonstrict</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>1</value>
</property>

2. 添加 Hive 元数据(使用 MySQL 存储)

INSERT INTO NEXT_LOCK_ID VALUES(1);
INSERT INTO NEXT_COMPACTION_QUEUE_ID VALUES(1);
INSERT INTO NEXT_TXN_ID VALUES(1);
COMMIT;

        说明:初始时这三个表没有数据,如果不添加数据,会报以下错误:

org.apache.hadoop.hive.ql.lockmgr.DbTxnManager FAILED: Error in acquiring locks: Error communicating with the metastore

三、测试

1. 启动 Hadoop 集群和 MySQL

$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
~/mysql/bin/mysqld &

2. 建立测试表

use test;
create table t1(id int, name string) 
clustered by (id) into 8 buckets 
stored as orc TBLPROPERTIES ('transactional'='true');

        说明:建表语句必须带有 into buckets 子句和 stored as orc TBLPROPERTIES ('transactional'='true') 子句,并且不能带有 sorted by 子句。

3. 测试 insert、update、delete

insert into t1 values (1,'aaa');
insert into t1 values (2,'bbb');
update t1 set name='ccc' where id=1;
delete from t1 where id=2; 

        执行结果分别如图1-3 所示。

图1

图2

图3

        说明:不能修改 bucket 列的值,否则会报以下错误:

FAILED: SemanticException [Error 10302]: Updating values of bucketing columns is not supported.  Column id.

4. 已有非 ORC 表的转换

        在本地文件 /home/grid/a.txt 中写入以下 4 行数据:
1,张三,US,CA
2,李四,US,CB
3,王五,CA,BB
4,赵六,CA,BC

-- 建立非分区表并加载数据
CREATE TABLE t1 (id INT, name STRING, cty STRING, st STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';  
LOAD DATA LOCAL INPATH '/home/grid/a.txt' INTO TABLE t1;  
SELECT * FROM t1;

-- 建立外部分区事务表并加载数据
CREATE EXTERNAL TABLE t2 (id INT, name STRING) PARTITIONED BY (country STRING, state STRING)
CLUSTERED BY (id) INTO 8 BUCKETS
STORED AS ORC TBLPROPERTIES ('transactional'='true');
INSERT INTO T2 PARTITION (country, state) SELECT * FROM T1;
SELECT * FROM t2;

-- 修改数据
INSERT INTO TABLE t2 PARTITION (country, state) VALUES (5,'刘','DD','DD');
UPDATE t2 SET name='张' WHERE id=1;
DELETE FROM t2 WHERE name='李四';
SELECT * FROM t2; 

        修改前和修改后的数据分别如图4、图5 所示。

图4

图5

        说明:不能 update 分区键,否则会报以下错误:

FAILED: SemanticException [Error 10292]: Updating values of partition columns is not supported

参考:

<think>嗯,用户想了解Hive2和Hive的区别。首先我需要确认Hive2具体指的是哪个版本。Hive的版本历史中,Hive 2.x系列是从大约2016年开始的,而Hive 1.x则在之前。Hive2主要对应的是Hive 2.x版本,而Hive可能指的是更早的版本,比如1.x或者更旧的。 接下来,我应该从几个关键方面来比较两者的不同。首先,执引擎方面,Hive默认使用MapReduce,而Hive2转向了Tez,可能还有LLAP的支持。这样在性能上会有提升,特别是实时查询方面。 然后是HPL/SQL的支持Hive2引入了这个存储过程语言,允许编写更复杂的逻辑,而旧版Hive可能没有这个功能。事务处理也是一个重点,Hive2支持ACID事务,这对需要数据一致性的场景很重要,而旧版可能只支持或表锁定,事务支持有限。 资源管理方面,Hive2可能与YARN集成更好,支持动态资源分配,而旧版可能资源利用率不高。元数据管理方面,Hive2可能优化了元数据存储,减少锁竞争,提升并发性能。另外,Hive2可能支持更多的文件格式,比如ORC和Parquet,而旧版可能支持较少。 安全性方面,Hive2可能增强了权限控制和Kerberos集成。兼容性方面,Hive2可能与Hadoop 3.x和JDK 8+兼容,而旧版可能不支持。还有用户接口的改进,比如Beeline作为默认客户端,取代了旧的CLI。 需要确认这些信息是否正确,比如Hive2的ACID事务是否在2.x版本中引入,以及LLAP的具体版本支持。另外,用户可能想知道升Hive2的优势和需要注意的地方,比如兼容性问题和配置调整。 最后,总结主要区别,帮助用户明确升后的改进点,以及适用场景,比如需要实时查询或事务支持时选择Hive2。同时提醒用户注意版本差异带来的变化,确保回答准确且结构清晰。</think>Hive2(通常指Hive 2.x版本)与Hive 1.x版本在架构、功能和性能上有显著差异。以下是逐步对比分析: --- ### **1. 执引擎优化** - **Hive 1.x** 默认使用**MapReduce**作为执引擎,性能较低,尤其在复杂查询时延迟较高。 支持少量优化(如向量化查询),但实时性不足。 - **Hive 2.x** - 引入**Tez**作为默认执引擎,支持DAG(有向无环图)任务调度,减少中间结果落盘,提升性能。 - 新增**LLAP(Live Long and Process)**特性,通过常驻进程实现低延迟交互式查询(类似传统数据库)。 - 示例性能对比: $$ \text{查询时间(Tez)} \approx 0.5 \times \text{查询时间(MapReduce)} $$ --- ### **2. 事务支持** - **Hive 1.x** 仅支持**表或分区**的锁定,无法实现ACID事务,不适合高并发写入场景。 - **Hive 2.x** - 通过**Hive ACID 2.0**支持完整的**事务**(INSERT/UPDATE/DELETE),满足OLAP场景需求。 - 依赖**事务管理器**(如Apache Druid)和**ORC文件格式**实现原子性。 --- ### **3. SQL兼容性** - **Hive 1.x** 语法兼容性有限,复杂查询需依赖UDF(用户自定义函数)。 - **Hive 2.x** - 支持**ANSI SQL标准**(如`OVER`子句、`GROUPING SETS`)。 - 新增**HPL/SQL**(Hive存储过程语言),允许编写存储过程。 - 示例: ```sql CREATE PROCEDURE demo() BEGIN SELECT * FROM table WHERE id > 100; END; ``` --- ### **4. 资源管理与扩展性** - **Hive 1.x** 资源分配依赖**静态配置**,无法动态调整,易导致资源浪费或瓶颈。 - **Hive 2.x** - 深度集成**YARN**,支持动态资源分配(如根据负载调整Container数量)。 - 优化**并**机制,提升大规模集群效率。 --- ### **5. 元数据管理** - **Hive 1.x** 元数据存储在**关系型数据库**(如MySQL),但存在单点性能瓶颈。 - **Hive 2.x** - 引入**Metastore分片**和**缓存优化**,减少元数据访问延迟。 - 支持**Hive Metastore Server**独立部署,提升并发处理能力。 --- ### **6. 安全性增强** - **Hive 2.x**新增功能: - **SQL标准授权**(基于角色的权限控制)。 - **列加密**(通过Hadoop KMS实现)。 - **Kerberos认证**集成更完善。 --- ### **总结:升Hive2的优势** | 场景 | Hive 1.x | Hive 2.x | |---------------------|-------------------|---------------------------| | 实时交互查询 | 不支持 | 通过LLAP实现毫秒响应 | | 高并发写入 | 仅表锁定 | 事务支持 | | 复杂ETL流程 | 依赖外部脚本 | 内置HPL/SQL存储过程 | | 资源利用率 | 静态分配 | 动态调整(YARN集成) | --- ### **注意事项** - 升Hive2需检查**Hadoop版本兼容性**(建议Hadoop 3.x)。 - 旧版UDF和HQL脚本可能需要**语法适配**。 - 若需ACID事务,必须使用**ORC文件格式**并配置事务管理器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值