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