概述
在HBase-1.1.0之前,HBase集羣中資源都是全量的。用戶、表這些都是沒有限制的,看似完美實則隱患較大。
流量限制
爲什麼要做流量限制,無限制全量跑不是更好嗎?
比如今天的雙十一日,數據流量是非常大的。如果不限制用戶和表的流量,某些重要的核心業務,需要在資源有限的情況下優先保證正常運行。如果非核心業務在此期間其QPS一直降不下來,嚴重消耗系統資源,影響核心業務的正常運作。
針對上述問題,可以採取以下方案來解決:
資源限制:針對用戶、命名空間及表的請求大小和QPS進行限制。
資源隔離:將不同表中的數據通過物理隔離,均衡到不同的RegionServer上。
資源限制
開啓HBase資源限制是有條件,其中包含以下兩個條件:
1.版本必須在1.1.0以上,或者在低版本中打上了HBase對應的Patch(HBASE-11598)
2.HBase的資源限制開關默認是關閉的,需要在HBase的配置文件中進行開啓。
# 編輯HBase配置文件
vi hbase-site.xml
# 添加如下內容
<property>
<name>hbase.quota.enabled</name>
<value>true</value>
</property>
# 退出編輯並保存
首次啓動時配置的,需要重啓HMaster服務進程才能生效。
Quota語句
req/time:單位時間內的請求次數,
size/time:單位時間內的請求數據的大小
req:整數,請求次數
time:時間單位,sec, min, hour, day (秒,分鐘,小時,天)
size: 存儲單位
B (bytes), K (kilobytes), M (megabytes), G(gigabytes), T (terabytes), P (petabytes)
命令
list_quotas, set_quota TYPE => <type>, <args>
Quota參數:
TYPE => THROTTLE
THROTTLE_TYPE:可以表示爲READ,WRITE或默認類型(讀取+寫入)。
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
限制命名空間中的表個數
# 創建一個命令空間最大包含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'}
限制命名空間的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'}