沒(méi)有備案的網(wǎng)站百度能收錄品牌推廣方案策劃書(shū)
目錄
一、前言
二、Hive事務(wù)背景知識(shí)
hive事務(wù)實(shí)現(xiàn)原理
hive事務(wù)原理之 —— delta文件夾命名格式
_orc_acid_version 說(shuō)明
bucket_00000
合并器(Compactor)
二、Hive事務(wù)使用限制
參數(shù)設(shè)置
客戶端參數(shù)設(shè)置
客戶端參數(shù)設(shè)置
三、Hive事務(wù)使用操作演示
操作步驟
客戶端設(shè)置參數(shù)
創(chuàng)建一張事務(wù)表
插入幾條數(shù)據(jù)
刪除一條數(shù)據(jù)
針對(duì)事務(wù)表的增刪改查操作演示
創(chuàng)建事務(wù)表
插入一條數(shù)據(jù)
修改數(shù)據(jù)
刪除數(shù)據(jù)
一、前言
使用過(guò)mysql的同學(xué)對(duì)mysql的事務(wù)這個(gè)概念應(yīng)該不陌生,當(dāng)對(duì)mysql的表進(jìn)行增刪改的時(shí)候,mysql會(huì)開(kāi)啟一個(gè)事務(wù),以確保本次操作的數(shù)據(jù)的安全性,在hive3.0之后,hive也開(kāi)始支持了事務(wù),以滿足一些增刪改的業(yè)務(wù)場(chǎng)景,接下來(lái)將對(duì)hive的事務(wù)操作做詳細(xì)的說(shuō)明。
二、Hive事務(wù)背景知識(shí)
Hive設(shè)計(jì)之初時(shí),是不支持事務(wù)的,原因:
- Hive的核心目標(biāo)是將已經(jīng)存在的結(jié)構(gòu)化數(shù)據(jù)文件映射成為表,然后提供基于表的SQL分析處理,是一款面向歷史、面向分析的工具;
- Hive作為數(shù)據(jù)倉(cāng)庫(kù),是分析數(shù)據(jù)規(guī)律的,而不是創(chuàng)造數(shù)據(jù)規(guī)律的;
- Hive中表的數(shù)據(jù)存儲(chǔ)于HDFS上,而HDFS是不支持隨機(jī)修改文件數(shù)據(jù)的,其常見(jiàn)的模型是一次寫(xiě)入,多次讀取;
從Hive0.14版本開(kāi)始,具有ACID語(yǔ)義的事務(wù)(支持INSERT,UPDATE和DELETE)已添加到Hive中,以解決以下場(chǎng)景下遇到的問(wèn)題:
1)流式傳輸數(shù)據(jù)
使用如Apache Flume或Apache Kafka之類(lèi)的工具將數(shù)據(jù)流式傳輸?shù)浆F(xiàn)有分區(qū)中,可能會(huì)有臟讀(開(kāi)始查詢后能看到寫(xiě)入的數(shù)據(jù))
2)變化緩慢數(shù)據(jù)更新
星型模式數(shù)據(jù)倉(cāng)庫(kù)中,維度表隨時(shí)間緩慢變化。例如,零售商將開(kāi)設(shè)新商店,需要將其添加到商店表中,或者現(xiàn)有商店可能會(huì)更改其平方英尺或某些其他跟蹤的特征。這些更改需要插入單個(gè)記錄或更新記錄(取決于所選策略)
3)數(shù)據(jù)修正
有時(shí)發(fā)現(xiàn)收集的數(shù)據(jù)不正確,需要局部更正
hive事務(wù)實(shí)現(xiàn)原理
Hive的文件是存儲(chǔ)在HDFS上的,而HDFS上又不支持對(duì)文件的任意修改,只能是采取另外的手段來(lái)完成。具體來(lái)說(shuō):
- 用HDFS文件作為原始數(shù)據(jù)(基礎(chǔ)數(shù)據(jù)),用delta保存事務(wù)操作的記錄增量數(shù)據(jù);
- 正在執(zhí)行中的事務(wù),是以一個(gè)staging開(kāi)頭的文件夾維護(hù)的,執(zhí)行結(jié)束就是delta文件夾。每次執(zhí)行一次事務(wù)操作都會(huì)有這樣的一個(gè)delta增量文件夾;
- 當(dāng)訪問(wèn)Hive數(shù)據(jù)時(shí),根據(jù)HDFS原始文件和delta增量文件做合并,查詢最新的數(shù)據(jù);
對(duì)于insert,update,delete三種操作來(lái)說(shuō),
1、INSERT語(yǔ)句會(huì)直接創(chuàng)建delta目錄;
2、DELETE目錄的前綴是delete_delta;
3、UPDATE語(yǔ)句采用了split-update特性,即先刪除、后插入;
hive事務(wù)原理之 —— delta文件夾命名格式
通過(guò)上面的描述,大概了解到hive的事務(wù)在執(zhí)行過(guò)程中,delta目錄文件很重要,具體來(lái)說(shuō),一個(gè)delta文件的完整名稱,可以拆開(kāi)來(lái)看,各個(gè)部分的含義需要分別去理解,比如當(dāng)我們執(zhí)行一條delete語(yǔ)句開(kāi)啟一個(gè)事務(wù)時(shí),將會(huì)出現(xiàn)類(lèi)似下面第一條格式的文件;
?對(duì)于這個(gè)文件來(lái)說(shuō),其完整的含義,可以類(lèi)比為:delta_minWID_maxWID_stmtID,拆開(kāi)來(lái)看即:
1、即delta前綴、寫(xiě)事務(wù)的ID范圍、以及語(yǔ)句ID;刪除時(shí)前綴是delete_delta,里面包含了要?jiǎng)h除的文件;
2、Hive會(huì)為寫(xiě)事務(wù)(INSERT、DELETE等)創(chuàng)建一個(gè)寫(xiě)事務(wù)ID(Write ID),該ID在表范圍內(nèi)唯一;
3、語(yǔ)句ID(Statement ID)則是當(dāng)一個(gè)事務(wù)中有多條寫(xiě)入語(yǔ)句時(shí)使用的,用作唯一標(biāo)識(shí);
而每個(gè)事務(wù)的delta文件夾下,都存在兩個(gè)文件
_orc_acid_version 說(shuō)明
?_orc_acid_version的內(nèi)容是2,即當(dāng)前ACID版本號(hào)是2。和版本1的主要區(qū)別是UPDATE語(yǔ)句采用了split-update特性,即先刪除、后插入。這個(gè)文件不是ORC文件,可以下載下來(lái)直接查看。
bucket_00000
bucket_00000文件則是寫(xiě)入的數(shù)據(jù)內(nèi)容。如果事務(wù)表沒(méi)有分區(qū)和分桶,就只有一個(gè)這樣的文件。文件都以O(shè)RC格式存儲(chǔ),底層二級(jí)制,需要使用ORC TOOLS查看,詳見(jiàn)附件資料;
可以通過(guò)引入相關(guān)的依賴包進(jìn)行查看
?對(duì)于其中的內(nèi)容做一下補(bǔ)充說(shuō)明:
- operation:0 表示插入,1 表示更新,2 表示刪除。由于使用了split-update,UPDATE是不會(huì)出現(xiàn)的,所以delta文件中的operation是0 , delete_delta 文件中的operation是2;
- originalTransaction、currentTransaction:該條記錄的原始寫(xiě)事務(wù)ID,當(dāng)前的寫(xiě)事務(wù)ID;
- rowId:一個(gè)自增的唯一ID,在寫(xiě)事務(wù)和分桶的組合中唯一;
- row:具體數(shù)據(jù),對(duì)于DELETE語(yǔ)句,則為null,對(duì)于INSERT就是插入的數(shù)據(jù),對(duì)于UPDATE就是更新后的數(shù)據(jù);
合并器(Compactor)
隨著表的修改操作,創(chuàng)建了越來(lái)越多的delta增量文件,就需要合并以保持足夠的性能,合并器Compactor是一套在Hive Metastore內(nèi)運(yùn)行,支持ACID系統(tǒng)的后臺(tái)進(jìn)程。所有合并都是在后臺(tái)完成的,不會(huì)阻止數(shù)據(jù)的并發(fā)讀、寫(xiě)。合并后,系統(tǒng)將等待所有舊文件的讀操作完成后,刪除舊文件。
合并操作分為兩種
- minor compaction(小合并),小合并會(huì)將一組delta增量文件重寫(xiě)為單個(gè)增量文件,默認(rèn)觸發(fā)條件為10個(gè)delta文件;
- major compaction(大合并),大合并將一個(gè)或多個(gè)增量文件和基礎(chǔ)文件重寫(xiě)為新的基礎(chǔ)文件,默認(rèn)觸發(fā)條件為delta文件相應(yīng)于基礎(chǔ)文件占比10%;
二、Hive事務(wù)使用限制
然Hive支持了具有ACID語(yǔ)義的事務(wù),但是在使用起來(lái),并沒(méi)有像在MySQL中使用那樣方便,有很多限制,歸納如下:
- 尚不支持BEGIN,COMMIT和ROLLBACK,所有語(yǔ)言操作都是自動(dòng)提交的;
- 表文件存儲(chǔ)格式僅支持ORC(STORED AS ORC);
- 需要配置參數(shù)開(kāi)啟事務(wù)使用;
- 外部表無(wú)法創(chuàng)建為事務(wù)表,因?yàn)镠ive只能控制元數(shù)據(jù),無(wú)法管理數(shù)據(jù);
- 表屬性參數(shù)transactional必須設(shè)置為true;
- 必須將Hive事務(wù)管理器設(shè)置為org.apache.hadoop.hive.ql.lockmgr.DbTxnManager才能使用ACID表;
- 事務(wù)表不支持LOAD DATA ...語(yǔ)句;
參數(shù)設(shè)置
在使用hive的事務(wù)表時(shí),需要對(duì)部分參數(shù)做設(shè)置之后才能生效,參數(shù)的設(shè)置可以在客戶端,也可以在服務(wù)端,兩者任選其一;
客戶端參數(shù)設(shè)置
# 可以使用set設(shè)置當(dāng)前session生效 也可以配置在hive-site.xml中)
set hive.support.concurrency = true; --Hive是否支持并發(fā)
set hive.enforce.bucketing = true; --從Hive2.0開(kāi)始不再需要 是否開(kāi)啟分桶功能
set hive.exec.dynamic.partition.mode = nonstrict; --動(dòng)態(tài)分區(qū)模式 非嚴(yán)格
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; --事務(wù)管理器
客戶端參數(shù)設(shè)置
set hive.compactor.initiator.on = true; --是否在Metastore實(shí)例上運(yùn)行啟動(dòng)壓縮合并
set hive.compactor.worker.threads = 1; --在此metastore實(shí)例上運(yùn)行多少個(gè)合并程序工作線程
三、Hive事務(wù)使用操作演示
接下來(lái)通過(guò)實(shí)際操作演示下hive事務(wù)表的使用
操作步驟
客戶端設(shè)置參數(shù)
打開(kāi)一個(gè)客戶端窗口后,執(zhí)行下面的事務(wù)設(shè)置參數(shù)
set hive.support.concurrency = true; --Hive是否支持并發(fā)
set hive.enforce.bucketing = true; --從Hive2.0開(kāi)始不再需要 是否開(kāi)啟分桶功能
set hive.exec.dynamic.partition.mode = nonstrict; --動(dòng)態(tài)分區(qū)模式 非嚴(yán)格
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; --
set hive.compactor.initiator.on = true; --是否在Metastore實(shí)例上運(yùn)行啟動(dòng)壓縮合并
set hive.compactor.worker.threads = 1; --在此metastore實(shí)例上運(yùn)行多少個(gè)壓縮程序工作線程。
創(chuàng)建一張事務(wù)表
CREATE TABLE emp (id int, name string, salary int)
STORED AS ORC TBLPROPERTIES ('transactional' = 'true');
?
插入幾條數(shù)據(jù)
INSERT INTO emp VALUES (1, 'Jerry', 5000);
INSERT INTO emp VALUES (2, 'Tom', 8000);
INSERT INTO emp VALUES (3, 'Kate', 6000);
執(zhí)行過(guò)程可以看到走了M-R任務(wù)
?同時(shí)執(zhí)行過(guò)程中,觀察hdfs目錄文件,可以看到產(chǎn)生了下面的staging文件
?
而執(zhí)行完成后,正好產(chǎn)生了一個(gè)_orc_acid_version文件,以及bucket_00000文件;
?如果執(zhí)行多條數(shù)據(jù)的插入,就會(huì)產(chǎn)生多少個(gè)下面的文件目錄;
?查詢數(shù)據(jù),可以看到已經(jīng)完成數(shù)據(jù)的插入;
刪除一條數(shù)據(jù)
delete from emp where id =2;
執(zhí)行刪除之后,再次查看hdfs文件目錄,可以看到這里多了一個(gè)delete_delta文件,關(guān)于這個(gè)文件上面我們有詳細(xì)的說(shuō)明;
針對(duì)事務(wù)表的增刪改查操作演示
創(chuàng)建事務(wù)表
create table trans_student(id int,name String,age int
)stored as orc TBLPROPERTIES('transactional'='true');
可以通過(guò)describe命令查看表的詳細(xì)信息
describe formatted trans_student;
插入一條數(shù)據(jù)
insert into trans_student (id, name, age) values (1,"allen",18);
?插入完成后,hdfs文件目錄就生成了相關(guān)的事務(wù)文件
修改數(shù)據(jù)
update trans_student
set age = 20
where id = 1;
執(zhí)行完成后,檢查hdfs目錄就多了一個(gè)delete_delta文件;
刪除數(shù)據(jù)
delete from trans_student where id =1;
執(zhí)行完成后,檢查hdfs目錄又多了一個(gè)delete_delta文件;