hive併發問題

2021-09-02 03:43:23 字數 2650 閱讀 5110

hive 併發模型

使用案例

併發支援 ( 是資料庫的必須,而且他們的使用案例很好懂。至少,我們要盡可能支援併發讀和寫。新增幾個發現當前已經鎖定的鎖,是有用的。這裡沒有乙個直接的需求新增乙個api顯式獲取鎖,所以,所有鎖都是隱式獲取的。

hive定義一下模式的鎖(注意不需要意向鎖)

共享 (s)

排他 (x)

見名知意,多個共享鎖可以同時獲取,而排他鎖會阻塞其他鎖。

相容性列表如下:

*existing lock s x

requested lock **

*s *true fal*** *

false false

對於一些操作,鎖的性質是有層次的。例如,一些分割槽操作,表也是被鎖定(例如,保證表的分割槽正在建立時,表不能被刪除)

鎖模式獲取背後的原理如下:

對於非分割槽表,鎖定模式相當直觀。當表正在讀取時,乙個s鎖被獲取。而對其他操作(插入資料到表,修改表的任何屬性)就要獲取x鎖。

對於分割槽表,原理如下:

當讀取表分割槽時,會獲取表的s鎖。對於其他操作,會獲取分割槽的x鎖。但是,如果修改僅僅是針對新分割槽,就會獲取表的s鎖,而修改是針對所有分割槽,會獲取表的x鎖。

所以,當舊分割槽讀寫時,新分割槽也可以被轉換為rcfile。

無論何時,分割槽被鎖定時,會獲取所有的它的父節點的s鎖。

基於這,操作的鎖獲取如下:

hive command locks acquired

select .. t1 partition p1 s on t1, t1.p1

insert into t2(partition p2) select .. t1 partition p1 s on t2, t1, t1.p1 and x on t2.p2

insert into t2(partition p.q) select .. t1 partition p1 s on t2, t2.p, t1, t1.p1 and x on t2.p.q

alter table t1 rename t2 x on t1

alter table t1 add cols x on t1

alter table t1 replace cols x on t1

alter table t1 change cols x on t1

alter table t1 add partition p1 s on t1, x on t1.p1

alter table t1 drop partition p1 s on t1, x on t1.p1

alter table t1 touch partition p1 s 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 t1 x 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;

解決併發問題

一.使用redis鎖 智慧型雲 工單系統 搶單 工單id鎖key public static final string cloud live gain order lock orderid cloud live gain order lock orderid component public cla...

Connection併發問題

connection lock getconnection lock.setautocommit false lock.createstatement execute select from zhaojianyong for update final connection connection ge...

001 併發 併發問題入門

在此記錄,以備遺忘 加一把鎖不就好了,如果們被鎖住了,就代表有人在使用這個廁所,問題完美被解決了!併發問題就是解決 多個執行緒 使用 同乙個公共資源 的事情!直接在業務邏輯上新增synchronized關鍵字即可 public class test02main catch interruptedex...