Roekey設計原則:
1)Rowkey的長度原則: 是一個二進制碼流,Rowkey 的長度被很多開發者建議說設計在10~100 個字節,不過建議是越短越好,不要超過16 個字節。
2)Rowkey散列原則:如果Rowkey 是按時間戳的方式遞增,不要將時間放在二進制碼的前面,建議將Rowkey的高位作為散列字段,由程序循環生成,低位放時間字段,這樣將提高數據均衡分布在每個Regionserver 實現負載均衡的幾率。如果沒有散列字段,首字段直接是時間信息將產生所有新數據都在一個 RegionServer 上堆積的熱點現象,這樣在做數據檢索的時候負載將會集中在個別RegionServer,降低查詢效率。
3)Rowkey唯一原則:必須在設計上保證其唯一性。
列族設計原則:
(1)一般不建議設計多個列族。具體原因如下
假如HBase表的表設置兩個列族,若已一個列族1000萬行,另一個列族100行。當一個要求region分裂時候,會導致100行的列會同樣分布到多個region中。這樣就出現基數問題,會導致掃描列族A的性能低下。某個列族在flush的時候,它鄰近的列族也會因關聯效應出發flush,最終導致系統產生更多的I/O。
HBase本身的設計目標是支持稀疏表,而稀疏表通常會有很多列,但是每一行有值的列又比較少。在HBase中Column Family的數量通常很小,同時HBase建議把經常一起訪問的比較類似的列放在同一個Column Family中,這樣就可以在訪問少數幾個列時,只讀取盡量少的數據。
在設計Hbase schema的時候,要盡量只有一個column family,至於為什么主要從flush和compaction說起,它們觸發的基本單位都是Region級別,所以當一個column family有大量的數據的時候會觸發整個region里面的其他column family的memstore(其實這些memstore可能僅有少量的數據,還不需要flush的)也發生flush動作;另外compaction觸發的條件是當store file的個數(不是總的store file的大小)達到一定數量的時候會發生,而flush產生的大量store file通常會導致compaction,flush/compaction會發生很多IO相關的負載,這對Hbase的整體性能有很大影響,所以選擇合適的column family個數很重要。
(2)數據塊緩存配置
如果經常順序訪問或者很少訪問,可以關閉列族的緩存,讓BLOCKCACHE 參數設置false,列族緩存默認打開。
>create 'mytable',{NAME=>'colfam1',BLOCKCACHE=>'false'}
(3)激進緩存配置
可以選擇一個列族賦予更高的緩存,該參數IN_MEMORY 設置true。列族默認的關閉的。如果你預期一個列族比另一個列族的隨機讀更多,這個特性遲早用的上。
>create 'mytable',{NAME=>'colfam1',IN_MEMORY=>'true'}
(4)布隆過濾器(BLOOMFILTER)設置
減少硬盤讀取數據帶來的開銷。對存儲的數據塊做反向測試,占用額外的空間。
布隆過濾器隨着它們索引的對象數據的增長而增長,所以行級布隆過濾器比列限定符級布隆過濾器占用空間要少。當空間不是問題時,它們可以幫助你“榨干”系統的性能潛力。
>create 'mytable',{NAME=>'colfam1',BLOOMFILTER=>'ROWCOL'}
BLOOMFILTER默認參數為NONE。一個行級布隆過濾器用ROW啟動,列限定級布隆過濾器用ROWCOL啟動。行級布隆過濾器在數據快里檢查特定行鍵是否存在,列限定符級布隆過濾器檢查行與列限定符組合是否不存在。ROWCOL布隆過濾器的開銷高於ROW布隆過濾器。
(5)生產時間配置
超過這個時間設置的就會在下一次大合並中被刪除。TTL =>"18000"。你可以禁用TTL,或者通過設置其值為INT.MAX_VALUE(2147483647)讓它永遠啟用(這是默認值)。
>create 'mytable',{NAME=>'colfam1',TTL=>'1800'}
(6)列族壓縮
壓縮可以節省空間,讀寫數據會增加CPU的使用率 LZO,SNAPPY,GZIP(不常用)。
>create 'mytable',{NAME=>'colfam1',COMPRESSION=>'SNAPPY'}
注意,數據只在硬盤上是壓縮的,在內存(MemStore或BlockCache)或通過網絡傳輸是是沒有壓縮的。
(7)單元時間版本
默認為3個版本,來保存歷史數據。如果只需要喲個版本,推薦設置表時只維護一個版本。
>create 'mytable',{NAME=>'colfam1',VERSION=>1,TTL=>'1800'}
也可以指定列族存儲的最少時間版本數:
>create 'mytable',{NAME=>'colfam1',VERSION=>5,MIN_VERSIONS=>'1'}
