併發支援 ( 是資料庫的必須,而且他們的使用案例很好懂。至少,我們要盡可能支援併發讀和寫。新增幾個發現當前已經鎖定的鎖,是有用的。這裡沒有乙個直接的需求新增乙個api顯式獲取鎖,所以,所有鎖都是隱式獲取的。
hive定義一下模式的鎖(注意不需要意向鎖)
見名知意,多個共享鎖可以同時獲取,而排他鎖會阻塞其他鎖。
相容性列表如下:
existing locksx
requested lock
s
truefalse
x
falsefalse
對於一些操作,鎖的性質是有層次的。例如,一些分割槽操作,表也是被鎖定(例如,保證表的分割槽正在建立時,表不能被刪除)
鎖模式獲取背後的原理如下:
對於非分割槽表,鎖定模式相當直觀。當表正在讀取時,乙個s鎖被獲取。而對其他操作(插入資料到表,修改表的任何屬性)就要獲取x鎖。
對於分割槽表,原理如下:
當讀取表分割槽時,會獲取表的s鎖。對於其他操作,會獲取分割槽的x鎖。但是,如果修改僅僅是針對新分割槽,就會獲取表的s鎖,而修改是針對所有分割槽,會獲取表的x鎖。
所以,當舊分割槽讀寫時,新分割槽也可以被轉換為rcfile。
無論何時,分割槽被鎖定時,會獲取所有的它的父節點的s鎖。
基於這,操作的鎖獲取如下:
hive commandlocks acquired
select .. t1 partition p1s on t1, t1.p1
insert into t2(partition p2) select .. t1 partition p1s on t2, t1, t1.p1 and x on t2.p2
insert into t2(partition p.q) select .. t1 partition p1s on t2, t2.p, t1, t1.p1 and x on t2.p.q
alter table t1 rename t2x on t1
alter table t1 add colsx on t1
alter table t1 replace colsx on t1
alter table t1 change colsx on t1
alter table t1 add partition p1s on t1, x on t1.p1
alter table t1 drop partition p1s on t1, x on t1.p1
alter table t1 touch partition p1s on t1, x on t1.p1
*alter table t1 set serdeproperties *
s on t1
*alter table t1 set serializer *
s on t1
*alter table t1 set file format *
s on t1
*alter table t1 set tblproperties *
x on t1
drop table t1x on t1
為了避免死鎖,這裡提出乙個非常簡單的計畫.所有鎖定的物件按照字典排序,然後在按照鎖定模式獲取。注意一些場景,物件列表可能不知道——例如,動態分割槽,編譯時不知道正在修改的分割槽列表。所以,列表會保守生成,由於分割槽的數量可能不知道,所以會在表或所知的字首上獲取排他鎖。
新增兩個可配置的引數,決定鎖嘗試時,鎖嘗試次數和等待時間。如果重試的次數是非常高的,它可以導致乙個活鎖。參考zookeeper recipes(理解如何使用zookeeper apis實現read/write鎖。需要注意的是,不是等待的鎖請求將被拒絕。存在的鎖將會釋放,然後等待的鎖會在嘗試週期後繼續嘗試。
因為鎖的分層特性,上面列出的規定recipe將無法正常工作:
表t的s鎖規定如下:
呼叫create( ),建立乙個路徑名為"/warehouse/t/read-"的節點。協議中,這個鎖定的節點會在後面使用。保證設定序列和臨時標誌。
在鎖定的節點呼叫getchildren( ),不設定watch的標記
如果已經有乙個子節點,路徑名以"write-"和乙個更小的序列號數字開頭,已經被獲取了,那麼這個鎖不能被獲取。刪除第一步驟建立的節點,返回。
否則授權鎖。
表t的x鎖規定如下:
呼叫create( ),建立乙個路徑名為"/warehouse/t/write-"的節點。協議中,這個鎖定的節點會在後面使用。保證設定序列和臨時標誌。
在鎖定的節點呼叫getchildren( ),不設定watch的標記
如果已經有乙個子節點,路徑名以"read-"或者"write-"和乙個更小的序列號數字開頭,已經被獲取了,那麼這個鎖不能被獲取。刪除第一步驟建立的節點,返回。
否則授權鎖。
擬定的計算,為了讀飢餓了寫,如果遇到長時間的讀,會導致寫的飢餓。
這個預設hive行為不會改變,併發不會支援。
關閉併發,可以修改下面的變數為false: hive.support.concurrency
檢視表的鎖,可以執行下面的命令:
show locks ;show locks
extended;
show locks
partition ();
show locks
partition () extended;
翻譯自
Hive鎖與併發模型
併發支援 是資料庫的必須,而且他們的使用案例很好懂。至少,我們要盡可能支援併發讀和寫。新增幾個發現當前已經鎖定的鎖,是有用的。這裡沒有乙個直接的需求新增乙個api顯式獲取鎖,所以,所有鎖都是隱式獲取的。hive定義一下模式的鎖 注意不需要意向鎖 見名知意,多個共享鎖可以同時獲取,而排他鎖會阻塞其他鎖...
hive併發問題
hive 併發模型 使用案例 併發支援 是資料庫的必須,而且他們的使用案例很好懂。至少,我們要盡可能支援併發讀和寫。新增幾個發現當前已經鎖定的鎖,是有用的。這裡沒有乙個直接的需求新增乙個api顯式獲取鎖,所以,所有鎖都是隱式獲取的。hive定義一下模式的鎖 注意不需要意向鎖 共享 s 排他 x 見名...
Hive筆記 Hive資料模型
hive資料模型 hive中的資料模型主要分為 除了原始列型別 整數integers,浮點數floating point numbers,泛型字串generic strings,日期和布林值dates and booleans 之外,hive還支援陣列 array 和對映 map 此外,使用者可以基...