您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關HBase有哪些特性,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
1
可配置的數據塊大小
HFile數據塊大小可以在列族層次設置。這個數據塊不同于之前談到的HDFS數據塊。其默認值是
65,536字節,或64KB。數據塊索引存儲每個HFile數據塊的起始鍵。數據塊大小設置影響到數據塊索引的大小。數據塊越小,索引越大,從而占用更大內存空間。同時因為加載進內存的數據塊更小,隨機查找性能更好。但是如果你需要更好的序列掃描性能,那么一次能夠加載更多HFile數據進入內存則更為合理,這意味著數據塊應該設置為更大的值。相應地索引變小,你將在隨機讀性能上付出代價。
你可以在表實例化時設置數據塊大小,如下所示:
hbase(main):002:0>
create 'mytable',
{NAME => 'colfam1', BLOCKSIZE => '65536'}
2 數據塊緩存
把數據放進讀緩存,但工作負載卻經常不能從中獲得性能提升——例如,如果一張表或表里的列族只被順序化掃描訪問或者很少被訪問,你不會介意Get或Scan花費時間是否有點兒長。在這種情況下,你可以選擇關閉那些列族的緩存。
如果你只是執行很多順序化掃描,你會多次倒騰緩存,并且可能會濫用緩存把應該放進緩存獲得性能提升的數據給排擠出去。如果關閉緩存,你不僅可以避免上述情況發生,而且可以讓出更多緩存給其他表和同一表的其他列族使用。
數據塊緩存默認是打開的。你可以在新建表或者更改表時關閉它:
hbase(main):002:0>
create 'mytable',
{NAME => 'colfam1', BLOCKCACHE => 'false’}
3 激進緩存
你可以選擇一些列族,賦予它們在數據塊緩存里有更高的優先級(LRU緩存)。如果你預期一個列族比另一個列族隨機讀更多,這個特性遲早用得上。這個配置也是在表實例化時設定:
hbase(main):002:0>
create 'mytable',
{NAME => 'colfam1', IN_MEMORY => 'true'}
IN_MEMORY參數的默認值是false。因為HBase除了在數據塊緩存里保存這個列族相比其他列族更激進之外并不提供額外的保證,該參數在實踐中設置為true不會變化太大。
4 布隆過濾器(Bloom filters)
數據塊索引提供了一個有效的方法,在訪問一個特定的行時用來查找應該讀取的HFile的數據塊。但是它的效用是有限的。HFile數據塊的默認大小是64KB,這個大小不能調整太多。
如果你要查找一個短行,只在整個數據塊的起始行鍵上建立索引無法給你細粒度的索引信息。例如,如果你的行占用100字節存儲空間,一個64KB的數據塊包含(64 * 1024)/100 = 655.53 = ~700行,而你只能把起始行放在索引位上。你要查找的行可能落在特定數據塊上的行區間里,但也不是肯定存放在那個數據塊上。這有多種情況的可能,或者該行在表里不存在,或者存放在另一個HFile里,甚至在MemStore里。這些情況下,從硬盤讀取數據塊會帶來IO開銷,也會濫用數據塊緩存。這會影響性能,尤其是當你面對一個巨大的數據集并且有很多并發讀用戶時。
布隆過濾器允許你對存儲在每個數據塊的數據做一個反向測試。當某行被請求時,先檢查布隆過濾器看看該行是否不在這個數據塊。布隆過濾器要么確定回答該行不在,要么回答它不知道。這就是為什么我們稱它是反向測試。布隆過濾器也可以應用到行里的單元上。當訪問某列標識符時先使用同樣的反向測試。
布隆過濾器也不是沒有代價。存儲這個額外的索引層次占用額外的空間。布隆過濾器隨著它們的索引對象數據增長而增長,所以行級布隆過濾器比列標識符級布隆過濾器占用空間要少。當空間不是問ti時,它們可以幫助你榨干系統的性能潛力。
你可以在列族上打開布隆過濾器,如下所示:
hbase(main):007:0>
create 'mytable',
{NAME => 'colfam1', BLOOMFILTER => 'ROWCOL'}
BLOOMFILTER參數的默認值是NONE。一個行級布隆過濾器用ROW打開,列標識符級布隆過濾器用ROWCOL打開。行級布隆過濾器在數據塊里檢查特定行鍵是否不存在,列標識符級布隆過濾器檢查行和列標識符聯合體是否不存在。ROWCOL布隆過濾器的開銷高于ROW布隆過濾器。
5 生存時間(TTL)
應用系統經常需要從數據庫里刪除老數據。由于數據庫很難超過某種規模,所以傳統上數據庫內建了許多靈活處理辦法。例如,在TwitBase里你不愿意刪除用戶在使用應用系統期間生成的任何推帖。這些都是用戶生成數據,將來有一天當你執行一些高級分析時可能有用。但是并不需要保存所有推帖用于實時訪問。所以早于某個時間的推帖可以歸檔存放到平面文件里。
HBase可以讓你在數秒內在列族級別設置一個TTL。早于指定TTL值的數據在下一次大合并時會被刪除。如果你在同一單元上有多個時間版本,早于設定TTL的版本會被刪除。你可以關閉TTL或者通過設置其值為INT.MAX_VALUE (2147483647)來讓它永遠打開(這是默認值)。你可以在建表時設置TTL,如下所示:
hbase(main):002:0>
create 'mytable', {NAME => 'colfam1', TTL => '18000'}
該命令在colfam1列族上設置TTL為18,000秒=5小時。colfam1里超過5小時的數據將會在下一次大合并時被刪除。
6 壓縮
HFile可以被壓縮并存放在HDFS上。這有助于節省硬盤IO,但是讀寫數據時壓縮和解壓縮會抬高CPU利用率。壓縮是表定義的一部分,可以在建表或模式改變時設定。除非你確定不會從壓縮中受益,我們推薦你打開表的壓縮。只有在數據不能被壓縮或者因為某種原因服務器的CPU利用率有限制要求的情況下,有可能會關閉壓縮特性。
HBase可以使用多種壓縮編碼,包括LZO、Snappy和GZIP。LZO[1]和Snappy[2]是其中最流行的兩種。Snappy由Google在2011年發布,發布不久Hadoop和HBase項目開始提供支持。在此之前,選擇的是LZO編碼。Hadoop使用的LZO原生庫受GPLv2版權控制,不能放在Hadoop和Hbase的任何發行版里;它們必須單獨安裝。另一方面,Snappy擁有BSD許可(BSD-licensed),所以它更容易和Hadoop和HBase發行版捆綁在一起。LZO和Snappy的壓縮比例和壓縮/解壓縮速度差不多。
當建表時你可以在列族上打開壓縮,如下所示:
hbase(main):002:0> create 'mytable',
{NAME => 'colfam1', COMPRESSION => 'SNAPPY'}
注意數據只在硬盤上是壓縮的。在內存里(MemStore或BlockCache)或網絡傳輸時是沒有壓縮的。
改變壓縮編碼的做法不應該經常發生,但是如果你的確需要改變某個列族的壓縮編碼,直接做就可以。你需要更改表定義,設定新壓縮編碼。此后合并時,生成的HFile全部會采用新編碼壓縮。這個過程不需要創建新表和復制數據。但你要確保直到改變編碼后所有老HFile被合并后才能從集群中刪除老編碼函數庫。
7 單元時間版本
HBase在默認情況下每個單元維護三個時間版本。這個屬性是可以設置的。如果你只需要一個版本,推薦你在設置表時只維護一個版本。這樣系統就不會保留更新單元的多個時間版本。時間版本也是在列族級設置的,可以在表實例化時設定:
hbase(main):002:0> create 'mytable', {NAME => 'colfam1', VERSIONS => 1}
你可以在同一個create語句里為列族指定多個屬性,如下所示:
hbase(main):002:0> create 'mytable',
{NAME => 'colfam1', VERSIONS => 1, TTL => '18000'}
你也可以指定列族存儲的最少時間版本數,如下所示:
hbase(main):002:0> create 'mytable', {NAME => 'colfam1', VERSIONS => 5,
MIN_VERSIONS => '1'}
在列族上同時設定TTL也是遲早有用的。如果當前存儲的所有時間版本都早于TTL,至少MIN_VERSION個最新版本會保留下來。這樣確保在你的查詢以及數據早于TTL時有結果返回。
關于“HBase有哪些特性”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。