【編者按】近日發(fā)布的Hive 0.13中采用了ACID語義的事務機制,在分區(qū)層保證事務原子性、一致性和持久性,并通過開啟ZooKeeper或內(nèi)存中的鎖機制保證事務隔離性。數(shù)據(jù)流攝取、緩慢變化維、數(shù)據(jù)重述這些新的用例在新版本中成為了可能,當然新版Hive中也還存在一些不足,Hive新版本具體帶來哪些改變呢?作者Alan Gates為我們帶來了精彩分析。
以下為原文:
什么是ACID,有什么作用?
ACID代表數(shù)據(jù)庫事務中的4個特性,原子性(任何一個數(shù)據(jù)庫操作要么被完整執(zhí)行,要么完全不執(zhí)行)、一致性(一旦應用程序執(zhí)行了一個操作,操作的結(jié)果對于每一個之后的操作都是可見的)、隔離性(一個用戶的操作不會對其他用戶產(chǎn)生意料之外的副作用)、持久性(一旦一個操作被完成,這些操作也將被記錄下來,即使機器或者系統(tǒng)出現(xiàn)故障,也要保證這些記錄的完整性)。這些特性一直被認為是事務功能的重要組成部分。
在最近發(fā)布的Hive 0.13中,事務的原子性、一致性和持久性在分區(qū)層得到保證,隔離性則通過開啟ZooKeeper或內(nèi)存中可用的鎖機制來保證。通過在Hive 0.13中加入事務,實現(xiàn)在行級提供全部的ACID語義,這樣的話,一個應用程序可以添加行,而另一個應用程序可以從同一分區(qū)中讀取數(shù)據(jù),互相之間不會產(chǎn)生干擾。
采用ACID語義的事務機制被添加到Hive中來處理以下的用例:
不足:
流攝入接口
有關(guān)使用流數(shù)據(jù)攝入的詳細信息,請參閱StreamingDataIngest。
語法變化
多個新命令被添加到Hive的DDL中以支持ACID和事務,一些現(xiàn)有的DDL也被做了一些修改。
例如:新加入的SHOW TRANSACTIONS命令,有關(guān)該命令的詳細信息,請參閱ShowTransactions。
SHOW COMPACTIONS也是一個新加入的命令,詳細信息請參閱ShowCompactions。
原有的SHOW LOCKS命令被修改,以提供與事務相關(guān)的新鎖信息。如果你正在使用ZooKeeper或者內(nèi)存鎖命令,你會注意到這條命令在輸出上并沒有多大改變,詳細信息請參閱ShowLocks。
ALTER TABLE中添加了一個新的選項,用來壓縮表或分區(qū)。一般用戶不需要去請求壓縮,因為系統(tǒng)會檢測到他們的需求,然后自動啟動壓縮。但是,如果一個表壓縮被意外終止或者一個用戶想要去手動壓縮表,ALTER TABLE可以滿足用戶,提供手動啟動壓縮,有關(guān)詳細信息,請參閱AlterTable/PartitionCompact。ALTER TABLE會將請求排入隊列、壓縮并返回請求,如果用戶想看到壓縮的進展情況,可以使用SHOW COMPACTIONS命令。
基礎設計
HDFS不支持對文件進行更改。在寫入者向文件進行寫入操作,同時文件被其他用戶讀取這種情況下,它無法保證讀取的一致性。為了在HDFS上提供這一功能,我們采用在其他數(shù)據(jù)倉庫工具使用的標準方法,將表或分區(qū)數(shù)據(jù)存儲在一組基礎文件中,將新記錄、更新和刪除操作存儲在delta文件中。 為每個事務創(chuàng)建一組新delta文件(或者在流代理如:Flume或Storm中,為每一批事務創(chuàng)建一組新delta文件),更改表或分區(qū)。在讀取時,讀取器將基礎文件和delta文件合并,應用更新和刪除操作。
有時這些變化需要合并成基礎文件,一組線程必須添加到Hive metastore中。他們確定什么時候需要壓縮,然后執(zhí)行壓縮,最后進行清理(刪除舊文件)。壓縮的類型分兩種,次要的和主要的。次要壓縮采用一組現(xiàn)有的delta文件,并為每一次bucket重寫一個delta文件。主要壓縮則要為每個bucket寫一個或多個delta文件,為每一次bucket重寫一個新基礎文件。所有壓縮都在后臺完成,并不妨礙數(shù)據(jù)的并發(fā)讀取和寫入。在一次壓縮后,系統(tǒng)會等待直到所有舊文件的讀取結(jié)束,然后刪除舊的文件。
以前一個分區(qū)(或如果沒有分區(qū)表的表)的所有文件都放在單個目錄中。因為這些變化,所有采用ACID思想寫入的分區(qū)都將有一個基礎文件的目錄,以及delta文件集目錄。
新鎖管理器DbLockManager也添加到了Hive中。該鎖管理器將所有鎖信息存儲在metastore中,此外所有事務也存儲在metastore中。這意味著事務和鎖即使在服務器出現(xiàn)故障時也能保證持久性,為了避免客戶端死機、離開或者鎖掛起,鎖持有者和事務啟動器需要向metastore發(fā)出心跳信號(heartbeat),如果在給定的時間內(nèi)服務器沒有收到客戶端發(fā)出的心跳信號,該鎖或事務將被中止。
配置
許多新配置關(guān)鍵項被添加到系統(tǒng)用以支持事務。
配置關(guān)鍵項 |
默認值 |
事務啟動值 |
注釋 |
hive.txn.manager |
org.apache.hadoop. hive.ql.lockmgr. DummyTxnManager |
org.apache.hadoop. hive.ql.lockmgr. DbTxnManager |
DummyTxnManager延用了Hive 0.13之前的做法,不提供事務。 |
hive.txn.timeout |
300 |
如果在這段時間內(nèi),客戶端沒有發(fā)出心跳信號,事務就會被宣告終止。 |
|
hive.txn.max. open.batch |
1000 |
事務的最大數(shù)量,可以用open_txns()獲取。 |
|
hive.compactor. initiator.on |
false |
true (for exactly one instance of the Thrift metastore service) |
是否在該metastore實例上運行啟動器和垃圾清理線程。 |
hive.compactor. worker.threads |
0 |
> 0 on at least one instance of the Thrift metastore service |
有多少工作線程在該metastore實例上運行。 |
hive.compactor. worker.timeout |
86400 |
壓縮作業(yè)在該時間內(nèi)未完成將被宣布失敗,壓縮操作被重新排入隊列。 |
|
hive.compactor. check.interval |
300 |
檢查是否有分區(qū)需要被壓縮。 |
|
hive.compactor. delta.num.threshold |
10 |
delta目錄的數(shù)目,達到該數(shù)后將觸發(fā)次要壓縮。 |
|
hive.compactor. delta.pct.threshold |
0.1 |
與基礎文件中delta文件的百分比,達到該值會觸發(fā)主要壓縮。(1 = 100%) |
|
hive.compactor. abortedtxn.threshold |
1000 |
給定分區(qū)中已中止事務的數(shù)目,達到該數(shù)會也會觸發(fā)主要壓縮。 |
hive.txn.max.open.batch控制多個事務流代理,如Flume或Storm。流代理將多個詞條寫到單個文件中(每個Flume代理或每個Storm螺栓)。因此,增加該值可以減少流代理創(chuàng)建的文件數(shù),但增加此值也增加了開放事務的數(shù)目(Hive需要追蹤),這可能會影響讀取的性能。
工作線程為壓縮操作產(chǎn)生了許多MapReduce作業(yè),而它們自身并沒有做壓縮。確定進行表壓縮后,增加工作線程的數(shù)目會減少表壓縮的時間。隨著更多的MapReduce作業(yè)在后臺運行,Hadoop集群的后臺負載也在增加。
減小此值將減少壓縮表或分區(qū)的時間。當然,首先得檢查壓縮是否必要,這需要為每個表或分區(qū)調(diào)用多個NameNode,降低此值可以減少NameNode的負載。
表屬性
如果表的所有者不希望系統(tǒng)自動確定何時要壓縮,那么可以手動設置表屬性NO_AUTO_COMPACTION,用來阻止所有的自動壓縮操作。
原文鏈接:ACID and Transactions in Hive (翻譯/毛夢琪 責編/魏偉)以“ 云計算大數(shù)據(jù) 推動智慧中國 ”為主題的 第六屆中國云計算大會 將于5月20-23日在北京國家會議中心隆重舉辦。產(chǎn)業(yè)觀察、技術(shù)培訓、主題論壇、行業(yè)研討,內(nèi)容豐富,干貨十足。票價優(yōu)惠,馬上 報名 !