當前位置:成語大全網 - 書法字典 - HBase性能優化-row key &;柱族設計

HBase性能優化-row key &;柱族設計

RowKey是二進制碼流,可以是任意字符串,最大長度64kb。實際應用中壹般為10-100byte,以byte[]的形式保存,壹般設計為固定長度。建議越短越好,不要超過16字節,原因如下:

設計中必須保證RowKey的唯壹性。由於HBase中的數據存儲是以Key-Value的形式,如果將具有相同RowKey的數據插入到HBase中的同壹個表中,那麽原來的數據將會被新的數據覆蓋。

設計的RowKey要均勻分布在所有HBase節點上,避免數據熱點。

如果初步設計的RowKey的數據分布不均勻,但是RowKey末尾的數據呈現出良好的隨機性,此時可以考慮翻轉RowKey的信息或者直接將末尾的字節提前到RowKey的開頭。反轉可以有效地使行鍵隨機分布,但是犧牲了行鍵的順序。

缺點:

這對Get操作有好處,但對Scan操作沒有好處,因為原始RowKey上數據的自然順序已經被打亂了。

加鹽的原理是在原來的RowKey前面加壹個定長的隨機數,也就是給RowKey賦壹個隨機前綴,使之不同於它們之間RowKey的開頭。隨機數可以保證所有區域之間的數據負載平衡。

缺點:

因為添加了隨機數,所以基於原來的RowKey查詢時無法知道隨機數是什麽,所以查詢時需要在所有可能的區域進行搜索,加鹽不利於讀取。並且加鹽增加了讀寫時的吞吐量。

對RowKey的全部或部分數據進行哈希,然後用哈希後的值全部或部分替換原RowKey的前綴部分。這裏所說的Hash包括MD5、sha1、sha256或sha512等算法。

缺點:

與反轉類似,哈希對掃描也不好,因為它打亂了原始行鍵的自然順序。

列族越多,Memstore越多;會存在於記憶中;當滿足某些條件時,存儲在Memstore中的數據將被刷新;每次刷新時,每個Memstore都會在磁盤上生成壹個Hfile文件。

列族越多,最終保存到磁盤的Hfile就越多。目前的刷新操作是在區域級別的,也就是說,區域中的壹個Memstore被刷新,同壹區域的其他Memstore也會被刷新。當表中有多個列族,且列族之間的數據不均勻時,比如壹個列族有100W行,壹個列族只有10行,會導致大量文件持久化到磁盤,同時有很多小文件,每次刷新操作也涉及壹定的IO操作。

列太多有兩個主要影響:

lockSize默認為64K或65536字節的塊大小,即每個讀取請求讀取的最小數據大小。增大塊大小可以提高掃描性能,減小塊大小可以提高隨機讀取的速度。

如果業務請求主要是Get請求,可以考慮將塊大小設置得小壹些。如果掃描請求是主要請求,則可以增加塊大小。

LRUBlockCache是目前HBase默認的BlockCache機制。

在此基礎上,HBase采用分層設計,將整個BlockCache分為三個部分,BlockCache包含三級優先級隊列:

Single:如果壹個塊是第壹次被訪問,它將被放在這個級別的隊列中。

多:如果壹個塊被訪問多次,多隊列從單隊列中移出。

在內存中:它具有最高的優先級,駐留在緩存中。它是在創建列族時定義的,與其他兩個緩存不同,這兩個緩存不會因訪問頻率而改變,訪問頻率決定了它的獨立性。其他兩個塊無論被訪問多少次,都不會被放入內存部分。內存中的塊無論被訪問多少次都會被放在內存段,但是內存中除了優先級之外不會提供其他保證。

BlockCache塊緩存默認為true。

將數據放入緩存不壹定能提高性能。

如果在實踐中,壹些表或表中的列族不經常被訪問,或者只按順序掃描表,則可以關閉數據塊緩存。

BloomFilter是Bloom在1970中提出的壹種多哈希函數映射的快速搜索算法。通常用於壹些需要快速判斷某個元素是否屬於集合,但並不嚴格要求100%正確的場合。

BloomFilter的數據存儲在StoreFile的元中,壹旦寫入,就不能更新,因為StoreFile是不可變的。

BloomFilter是列族級別的配置屬性。如果在表中設置了BloomFilter,那麽HBase在生成StoreFile時會包含壹個BloomFilter結構數據,稱為元塊;;元塊由LRU塊緩存和數據塊(真實鍵值數據)壹起維護。因此,打開BloomFilter會有壹些存儲和內存緩存開銷。

BloomFilter包含三個參數:NONE(默認)、ROW和ROWCOL。

所以ROWCOL的空間開銷比rowcol高。

區域中的存儲文件越多,bloomfilter效果越好。

區域中存儲文件的數量越少,HBase的讀取性能越好。

Hfile可以壓縮存儲在HDFS上,有助於節省磁盤IO,但是壓縮解壓縮會提高讀寫數據時的CPU利用率。

壓縮特性是用CPU資源換取磁盤空間資源,對讀寫性能不會有太大影響。

默認值為NONE,這意味著沒有打開壓縮。

除非壓縮不適合業務場景,比如壓縮圖片、音頻、視頻,否則建議開啟表格壓縮。

HBase目前提供了三種常用的壓縮方式:GZip、LZO和Snappy。

Snappy的壓縮率最低,但編解碼率最高,CPU消耗最少,所以目前壹般推薦Snappy。

用於設置柱族可以記錄的最大版本數。默認值為3,可以通過alter進行修改。

對於經常更新的應用,建議設置為1,可以快速剔除無用數據,節省存儲空間,提高查詢效率。

用於設置細胞的生命周期。如果單元格過期,它將被刪除。單位是秒。默認值為****EVER。

HBase提供了四種編碼/解碼類型:前綴、Diff、快速Diff和前綴樹。

可以根據具體用途選擇適當的編碼/解碼。

如果設計的表有很長的rowkey和很多列,建議使用Fast Diff格式。