hive的ACID

Hive自0.14版本开始支持update和delete,要执行update和delete的表必须支持ACID。但缺省是不支持的,,需要一些附加的配置。
如果一个表要实现update和delete功能,该表就必须支持ACID,而支持ACID,就必须满足以下条件:
1、表的存储格式必须是ORC(STORED AS ORC);
2、表必须进行分桶(CLUSTERED BY (col_name, col_name, …) INTO num_buckets BUCKETS);
3、Table property中参数transactional必须设定为True(tblproperties(‘transactional’=’true’));
4、以下配置项必须被设定:
Client端:

1
2
3
4
hive.support.concurrency – true
hive.enforce.bucketing – true
hive.exec.dynamic.partition.mode – nonstrict  
hive.txn.manager – org.apache.hadoop.hive.ql.lockmgr.DbTxnManager

服务端:

1
2
3
hive.compactor.initiator.on – true
hive.compactor.worker.threads – 1
hive.txn.manager – org.apache.hadoop.hive.ql.lockmgr.DbTxnManager

说明:不能修改bucket列的值,否则会报以下错误:
FAILED: SemanticException [Error 10302]: Updating values of bucketing columns is not supported. Column id.
说明:不能update分区键,否则会报以下错误:
FAILED: SemanticException [Error 10292]: Updating values of partition columns is not supported

由于HDFS是不支持本地文件更改的,同时在写的时候也不支持读。
表或者分区内的数据作为基础数据。事务产生的新数据如Insert/Update/Flume/Storm等会存储在增量文件(Delta Files)中。读取这个文件的时候,通常是Table Scan阶段,会合并更改,使读出的数据一致。

Hive Metastore上面增加了若干个线程,会周期性地合并并合并删除这些增量文件。

具体可以实现参考这个网页。 https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions