HBase隨筆記錄許可權控制、名稱空間、流量限制和表負載均衡
限制輸出:
get 'table','rowkey',MAXLENGTH => 60
status:返回狀態。可選simple、summary、detailed
version:版本
許可權:
grant 'hdfs','RW','test:t1','cf1','col1'
get 'test:t1','row-1','cf1:col1'
revoke 'hdfs','W','@test'
然後通過user_permission來檢視許可權
user_permission '@test'
user_permission 'test:t1'
建立表
create '表空間:lmj_test',{NAME=> 'adn', BLOOMFILTER => 'ROWCOL', VERSIONS => '1', TTL =>'15768000', MIN_VERSIONS => '0', COMPRESSION => 'SNAPPY', BLOCKCACHE=> 'true'}
hbase> # SPLITALGO("HexStringSplit", "UniformSplit" or classname)
hbase> create 't1', 'f1', {NUMREGIONS=> 15, SPLITALGO => 'HexStringSplit'}
create 'split_table_test',{NAME =>'cf',COMPRESSION => 'SNAPPY'}, {SPLITS_FILE => 'test_split.txt'}
splits_file請放在hdfs中/hbase下
GZIP, LZO, Snappy,作者推薦使用Snappy,因為它有較好的Encoding/Decoding速度和可以接受的壓縮率。
清空表:truncate 'test'
刪除表:先disable,再drop
修改表結構:
先disable後enable
alter 't1', {NAME => 'f1'}, {NAME =>'f2', METHOD => 'delete'}
例如:修改表test1的cf的TTL為180天
hbase(main)> disable 'test1'
hbase(main)> alter'test1',{NAME=>'body',TTL=>'15552000'},{NAME=>'meta',TTL=>'15552000'}
hbase(main)> enable 'test1'
put'lmj_test','00001','adn:adn_3','aaa',1432483200000
get 'test','rowkey','cf1:col1'
建立namespace
hbase>create_namespace 'ai_ns'
刪除namespace
hbase>drop_namespace 'ai_ns'
檢視namespace
hbase>describe_namespace 'ai_ns'
列出所有namespace
hbase>list_namespace
在namespace下建立表
hbase>create 'ai_ns:testtable',{NAME=> 'CF1',VERSION => '3',}
檢視namespace下的表
hbase>list_namespace_tables 'ai_ns'
compact:
1.概述
溢寫以後生成許多storefile
minor compaction:最早生成的幾個storefile會被合併,這一步不會對標記的刪除和過期的資料進行處理,經常發生,資料量較小,佔用資源不多
major compaction:預設值是7天執行一次
設定
<property>
<name>hbase.hregion.majorcompaction</name>
<value>604800000</value>
</property>
2.危害
-》消耗大量的資源,對hbase的效能產生影響
-》會導致hbase的應用阻塞
企業中一般關閉自動觸發,使用手動觸發 major_compact
3.操作
在自動觸發之前手動觸發
major_compact'table-name'
hbase流量限制和表負載均衡
1.概述
在HBase-1.1.0之前,HBase叢集中資源都是全量的。使用者、表這些都是沒有限制的,看似完美實則隱患較大。今天,筆者就給大家剖析一下HBase的流量限制和表的負載均衡。
2.內容
也許有同學有疑問,為啥要做流量限制,無限制全量跑不是更好嗎?舉個例子,比如今天的雙十一日,資料流量是非常大的。如果不限制使用者和表的流量,某些重要的核心業務,需要在資源有限的情況下優先保證正常執行。如果非核心業務在此期間其QPS一直降不下來,嚴重消耗系統資源,影響核心業務的正常運作。
針對上述問題,可以採取以下方案來解決:
· 資源限制:針對使用者、名稱空間及表的請求大小和QPS進行限制。
· 資源隔離:將不同表中的資料通過物理隔離,均衡到不同的RegionServer上。
3.資源限制
開啟HBase資源限制是有條件,其中包含以下兩個條件:
· 版本必須在1.1.0以上,或者在低版本中打上了HBase對應的Patch(HBASE-11598)
· HBase的資源限制開關預設是關閉的,需要在HBase的配置檔案中進行開啟。新增內容如下所示:
# 編輯HBase配置檔案
vi $HBASE_HONE/conf/hbase-site.xml
# 新增如下內容
<property>
<name>hbase.quota.enabled</name>
<value>true</value>
</property>
# 退出編輯並儲存
如果不是在首次啟動時配置的,需要額外重啟HMaster服務程序才能使之生效。
3.1 Quota語句
HBase中限流是通過Quota語句來操作的,限流的方式有兩種,一種是針對使用者進行限流;另一種是針對表來進行限流。操作命令如下所示:
# 限制使用者u1每秒請求10次
hbase>set_quota TYPE => THROTTLE, USER => 'u1',LIMIT => '10req/sec'
# 限制使用者u1每秒的讀請求為10次
hbase>set_quota TYPE => THROTTLE, THROTTLE_TYPE => READ, USER => 'u1', LIMIT => '10req/sec'
# 限制使用者u1每天的請求量為10M
hbase>set_quota TYPE => THROTTLE, USER => 'u1',LIMIT => '10M/day'
# 限制使用者u1的寫請求量每秒為10M
hbase>set_quota TYPE => THROTTLE, THROTTLE_TYPE => WRITE, USER => 'u1', LIMIT => '10M/sec'
# 限制使用者u1在操作表t2時,每分鐘的請求量為5K
hbase>set_quota TYPE => THROTTLE, USER => 'u1',TABLE => 't2', LIMIT => '5K/min'
# 限制使用者u1在操作表t2時,每秒的讀請求為10次
hbase>set_quota TYPE => THROTTLE, THROTTLE_TYPE => READ, USER => 'u1', TABLE => 't2', LIMIT => '10req/sec'
# 刪除使用者u1在命令空間ns2的請求限制
hbase>set_quota TYPE => THROTTLE, USER => 'u1',NAMESPACE => 'ns2', LIMIT => NONE
# 限制在名稱空間ns1中每小時的請求為10次
hbase>set_quota TYPE => THROTTLE, NAMESPACE => 'ns1',LIMIT => '10req/hour'
# 限制表t1每小時的請求為10T
hbase>set_quota TYPE => THROTTLE, TABLE => 't1',LIMIT => '10T/hour'
# 刪除使用者u1的所有請求限制
hbase>set_quota TYPE => THROTTLE, USER => 'u1',LIMIT => NONE
# 顯示使用者u1在名稱空間ns2中的所有限制詳情
hbase>list_quotas USER => 'u1,NAMESPACE => 'ns2'
# 顯示命令空間ns2的所有限制詳情
hbase>list_quotas NAMESPACE => 'ns2'
# 顯示錶t1的所有限制詳情
hbase>list_quotas TABLE => 't1'
# 顯示所有限制詳情
hbase>list_quotas
從操作的命令中可以看出,HBase限制流量支援表和使用者。可以通過THROTTLE_TYPE來控制READ(讀)、WRITE(寫)操作,這類操作在HBase中是隨機進行限制的。而LIMIT關鍵字,可以從兩個維度進行資源限制,分別是req/time和size/time。
· req/time:這種表示限制單位時間內的請求次數,time可以是秒、分、時、天,req表示次數。
· size/time:這種表示單位時間內請求資料的量,time可以是秒、分、時、天,size可以時B (bytes), K (kilobytes), M (megabytes), G(gigabytes), T (terabytes), P (petabytes)。
LIMIT限制預設大小是:10req/day 或 100P/hour。對於命令set_quota來說,執行這條命令僅僅是限制單個RegionServer上的流量,並不是整個叢集的限制總量(叢集限制總量=每個RegionServer的限制量*RegionNum)。另外,執行set_quota命令後,預設是需要等待300000秒(5分鐘)才會生效。如果覺得時間太長,可以將生效時間縮短,通過hbase-site.xml檔案中的引數hbase.quota.refresh.period來設定時間,比如:
# 一分鐘後生效
hbase.quota.refresh.period=60000
3.2 限制名稱空間中的表個數
在建立名稱空間中的表個數,可以在建立名稱空間時指定,也可以在建立之後在此修改表個數,同樣也可以刪除表限制。通過設定hbase.namespace.quota.maxtables屬性值來改變。操作內容如下所示:
# 建立一個命令空間最大包含5個表
hbase>create_namespace 'ns1', {'hbase.namespace.quota.maxtables'=>'5'}
# 修改一個已存在的命令空間所允許的表數量大小為8個
hbase>alter_namespace 'ns2', {METHOD => 'set', 'hbase.namespace.quota.maxtables'=>'8'}
# 顯示命令空間下的所有詳情
hbase> describe_namespace'ns2'
# 刪除命令空間中表個數的限制
hbase>alter_namespace 'ns2', {METHOD => 'unset',NAME=>'hbase.namespace.quota.maxtables'}
3.3 限制名稱空間的Region
在建立名稱空間時 ,可以限制Region的個數。在建立之後也可以通過命令來修改個數的上限值。具體操作如下所示:
# 建立一個名稱空間最大包含10個Region
hbase>create_namespace 'ns1', {'hbase.namespace.quota.maxregions'=>'10'
# 顯示命令空間中詳情
hbase>describe_namespace 'ns1'
# 修改名稱空間中最大Region個數為20個
hbase>alter_namespace 'ns2', {METHOD => 'set', 'hbase.namespace.quota.maxregions'=>'20'}
# 刪除名稱空間中Region個數的限制
hbase> alter_namespace'ns2', {METHOD => 'unset', NAME=> 'hbase.namespace.quota.maxregions'}
這裡也許有些同學在操作的過程當中遇到過,在請求操作限制閥值時,日誌沒有打印出錯誤資訊,這是由於預設日誌輸出時INFO級別,不會列印這類異常,如果要檢視,可以通過修改log4j的日誌級別為DEBUG,這樣就可以檢視到對應的異常資訊了。
4.資源隔離
在HBase中可以通過資源隔離的方式來間接的限流。將請求均衡到多個RegionServer中去。通過balance_switch命令來實現自動均衡操作。命令如下:
# 檢視自動均衡狀態
balance_switchstatus
# 停止自動均衡
balance_switchstop
# 開啟自動均衡
balance_switchstart
在實際業務中,如果HBase某個表的RegionServer全部集中在一個上,這時候可以考慮使用move命令手動均衡操作,具體操作語法如下:
# move手動操作語法
move [region id] [ServerName]
如下圖所示:
從圖中一個Table Region來說,”t2,,1510401809742.bd015fc10e75b70a52adc0c32a2321c2.“其中region id為”bd015fc10e75b70a52adc0c32a2321c2“。我們可以在HBase叢集客戶端執行以下命令來手動指定region。命令如下所示:
# 將該Region(dn3)移動到Region(dn1)
echo "move'bd015fc10e75b70a52adc0c32a2321c2','dn1,16020,1510401268652'"|hbase shell
在往HBase表中寫資料的時候,預設是往一個Region中寫資料,當資料量很大時,才會自動拆分成多個Region,拆分的規則和RowKey設計有關。為了防止出現這種情況,我們可以在建立表的時候進行預分割槽操作。命令如下所示:
# 建立表的預分割槽(6個Region),RegionTotals = SPLITS.length + 1
create 't2', 'cf', SPLITS => ['0001','0002','0003','0004','0005']
這樣我們可以拆分成6個Region,這裡也許有同學要問,為什麼是6個Region。其實,從上圖中就可以看出,表分割槽中第一個Region是沒有StartKey,最後一個Region是沒有EndKey的。為什麼會出現這種情況,下面就給大家來剖析這個原因。如下圖所示:
從圖中可知,在第一個Region中只有EndKey,沒有StartKey。第一個Region中的EndKey(0001),就是第二個Region的StartKey,以此類推,到最後一個Region就只有StartKey(0005)了。這就是為什麼第一個Region沒有StartKey,最後一個Region沒有EndKey的原因。
其實,我們在使用HBase的Java API獲取Region的StartKey和EndKey的時候,有時會出現Null,也就是這個原因。
5.總結
在使用Quota命令進行限流時,需要確保hbase-site.xml檔案中的限流屬性開啟。另外,在對錶做手動均衡操作時,使用move命令即可。HBase是有自動均衡的策略的,均衡的Region取決於設計分割的Key,Key的產生又和HBase中中Rowkey的設計息息相關。所以,HBase中表的RowKey設計的是否優秀,決定了Region均衡時,分割Key的選取。