環(huán)境:hive 3.1.0
執(zhí)行引擎:hive on tez
-
什么是hive ACID?
hive官網(wǎng)對于ACID的介紹:
https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions
中文文檔關(guān)于ACID的介紹:
https://www.docs4dev.com/docs/zh/apache-hive/3.1.1/reference/Hive_Transactions.html
其實(shí)和傳統(tǒng)數(shù)據(jù)庫中所說的ACID有異曲同工之妙: - 原子性(Atomicity)
原子性是指事務(wù)是一個不可分割的工作單位,事務(wù)中的操作要么全部成功,要么全部失敗。 - 一致性(Consistency)
事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另外一個一致性狀態(tài)。
舉例說明:張三向李四轉(zhuǎn)100元,轉(zhuǎn)賬前和轉(zhuǎn)賬后的數(shù)據(jù)是正確的狀態(tài),這就叫一致性,如果出現(xiàn)張三轉(zhuǎn)出100元,李四賬號沒有增加100元這就出現(xiàn)了數(shù)據(jù)錯誤,就沒有達(dá)到一致性。 - 隔離性(Isolation)
事務(wù)的隔離性是多個用戶并發(fā)訪問數(shù)據(jù)庫時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操作數(shù)據(jù)所干擾,多個并發(fā)事務(wù)之間要相互隔離。 - 持久性(Durability)
持久性是指一個事務(wù)一旦被提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的,接下來即使數(shù)據(jù)庫發(fā)生故障也不應(yīng)該對其有任何影響。
其中事務(wù)(Transaction)是訪問和更新數(shù)據(jù)庫的程序執(zhí)行單元;事務(wù)中可能包含一個或多個sql語句,而ACID是衡量事務(wù)的4個維度。hive0.13之后提供了行級別ACID,
常見的INSERT、UPDATE和DELETE已經(jīng)在hive0.14開始支持,先創(chuàng)建一張默認(rèn)結(jié)構(gòu)的hive表create table test.trans_table1(column1 string,column2 string);
SHOW CREATE TABLE查看其建表語句:
CREATE TABLE `test.trans_table1`(
`column1` string,
`column2` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
'hdfs://ambari-hadoop1:8020/warehouse/tablespace/managed/hive/test.db/trans_table1'
TBLPROPERTIES (
'bucketing_version'='2',
'transactional'='true',
'transactional_properties'='default',
'transient_lastDdlTime'='1703744670')
發(fā)現(xiàn)其配置項(xiàng)中有三個和事務(wù)相關(guān)的選項(xiàng):
- transactional:是否啟用表的事務(wù)支持
-
transactional_properties:指定了事務(wù)的屬性
1.default: 默認(rèn)值,表示支持插入、更新、刪除操作。
2.insert_only: 僅支持插入操作,不支持更新和刪除。
3.insert_only_external: 僅支持插入操作,對于外部表。 -
transient_lastDdlTime:最后一次DDL日期時間
hive默認(rèn)創(chuàng)建存儲格式為ORC的事務(wù)表,對表執(zhí)行一次insert values操作發(fā)現(xiàn)增加了一個delta開頭的目錄
其下有兩個文件_orc_acid_version和bucket_00000
而delete操作也同樣會生成目錄:
而UPDATE操作則會同時生成兩個目錄:
先創(chuàng)建一個delete前綴的目錄,再創(chuàng)建一個代表insert的delta前綴目錄,即先刪除后插入。
以上目錄的命名規(guī)范格式為 delta_minWID_maxWID_stmtID,即 delta 前綴、寫事務(wù)的 ID 范圍、以及語句 ID。 - 針對寫事務(wù)(INSERT、DELETE 等),Hive 還會創(chuàng)建一個寫事務(wù) ID(Write ID),該 ID 在表范圍內(nèi)唯一。
- 語句 ID(Statement ID)則是當(dāng)一個事務(wù)中有多條寫入語句時使用的,用作唯一標(biāo)識。
_orc_acid_version 的內(nèi)容是 2,即當(dāng)前 ACID 版本號是 2。而bucket開頭的文件則是實(shí)際的數(shù)據(jù)內(nèi)容,由于存儲格式是ORC,可以使用以下方法查看:hive --orcfiledump /warehouse/tablespace/managed/hive/test.db/trans_table1/delta_0000001_0000001_0000/bucket_00000
可以查看相關(guān)元數(shù)據(jù),但并非數(shù)據(jù)本身,這里不做過多解析:hive --orcfiledump -d /warehouse/tablespace/managed/hive/test.db/trans_table1/delta_0000001_0000001_0000/bucket_00000
則可以查看相關(guān)數(shù)據(jù)內(nèi)容: - operation 0 表示插入,1 表示更新,2 表示刪除。由于使用了 split-update,UPDATE 是不會出現(xiàn)的;
- originalTransaction是該條記錄的原始寫事務(wù) ID。對于 INSERT 操作,該值和 currentTransaction是一致的。對于 DELETE,則是該條記錄第一次插入時的寫事務(wù) ID;
-
bucket是一個 32 位整型,由 BucketCodec 編碼,各個二進(jìn)制位的含義為:
1-3 位:編碼版本,當(dāng)前是 001;
4 位:保留;
5-16 位:分桶 ID,由 0 開始。分桶 ID 是由 CLUSTERED BY 子句所指定的字段、以及分桶的數(shù)量決定的。該值和 bucket_N 中的 N 一致;
17-20 位:保留;
21-32 位:語句 ID;
舉例來說,整型 536936448 的二進(jìn)制格式為 00100000000000010000000000000000,即它是按版本 1 的格式編碼的,分桶 ID 為 1; - rowId 是一個自增的唯一 ID,在寫事務(wù)和分桶的組合中唯一;
- currentTransaction 當(dāng)前的寫事務(wù) ID;
-
row 具體數(shù)據(jù)。對于 DELETE 語句,則為 null
還可以通過 row__id 這個虛擬列進(jìn)行查看(originalTransaction, bucket, rowId)select row__id,column1,column2 from test.trans_table1;
注意row__id是兩個"_"符合。
還有個問題由于每次DML的執(zhí)行都會產(chǎn)生對應(yīng)小文件,隨著時間推移DML執(zhí)行次數(shù)的增多,會產(chǎn)生越來越多的小文件,而過多的小文件對HDFS會產(chǎn)生不利的影響,比如增加namenode的內(nèi)存占用等等,為此hive引入了壓縮Compaction的概念。
Minor Compaction 會將所有的 delta 文件壓縮為一個文件,delete 也壓縮為一個。壓縮后的結(jié)果文件名中會包含寫事務(wù) ID 范圍,同時省略掉語句 ID。壓縮過程是在 Hive Metastore 中運(yùn)行的,會根據(jù)一定閾值自動觸發(fā)。我們也可以使用如下語句人工觸發(fā):ALTER TABLE trans_table1 COMPACT 'minor';
壓縮前:
壓縮后:
查看壓縮后的文件發(fā)現(xiàn),插入操作產(chǎn)生的數(shù)據(jù)都被合并起來:
同樣刪除操作的數(shù)據(jù)也被合并在了一起:
因此Minor Compaction 不會刪除任何數(shù)據(jù)。
而Major Compaction則會將所有文件合并為一個文件,以 base_N 的形式命名,其中 N 表示最新的寫事務(wù) ID。已刪除的數(shù)據(jù)將在這個過程中被剔除。
major前:
major后:
??需要注意的是,在 Minor 或 Major Compaction 執(zhí)行之后,原來的文件不會被立刻刪除。這是因?yàn)閯h除的動作是在另一個名為 Cleaner 的線程中執(zhí)行的。因此,表中可能同時存在不同事務(wù) ID 的文件組合,這在讀取過程中需要做特殊處理。
有了大致的了解后,是否任意存儲格式的表均具有ACID特性?
首先TextFile,默認(rèn)建表語句中關(guān)于事務(wù)的配置項(xiàng):'transactional'='true', 'transactional_properties'='insert_only',
可以執(zhí)行insert操作,但是無法執(zhí)行delete和update,報錯:Error: Error while compiling statement: FAILED: SemanticException [Error 10414]: Attempt to do update or delete on table test.text_table1 that is insert-only transactional (state=42000,code=10414)
嘗試修改transactional_properties值為default,但是無法修改:Error: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Cannot convert an ACID table to non-ACID (state=08S01,code=1)
官網(wǎng)的意思是目前僅支持ORC格式的hive表:
此外Hive ACID還存在一些限制,感興趣可以進(jìn)一步了解:
https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions#:~:text=SQL%20MERGE%20statement.-,Limitations,-BEGIN%2C%20COMMIT
本博客為學(xué)習(xí)所記,意在備忘所學(xué)過程,故有引用之處,其中參考博客有:
-
深入學(xué)習(xí)MySQL事務(wù):ACID特性的實(shí)現(xiàn)原理https://www.cnblogs.com/kismetv/p/10331633.html文章來源:http://www.zghlxwxcb.cn/news/detail-806971.html
-
實(shí)戰(zhàn) | 深入理解 Hive ACID 事務(wù)表
https://blog.csdn.net/zjerryj/article/details/91470261文章來源地址http://www.zghlxwxcb.cn/news/detail-806971.html
到了這里,關(guān)于Hive ACID事務(wù)表的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!