溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

hbase建表create高級(jí)屬性 //hbase 表預(yù)分區(qū)也就是手動(dòng)分區(qū) 這個(gè)很重要

發(fā)布時(shí)間:2020-08-05 13:40:18 來(lái)源:網(wǎng)絡(luò) 閱讀:4873 作者:馬吉輝 欄目:大數(shù)據(jù)

2019/2/19 星期二

hbase建表create高級(jí)屬性 //hbase 表預(yù)分區(qū)也就是手動(dòng)分區(qū) 這個(gè)很重要

下面幾個(gè)shell 命令在后續(xù)的hbase 操作中可以起到很到的作用,且主要體現(xiàn)在建表的過(guò)程中,看下面幾個(gè)create 屬性
1、BLOOMFILTER 默認(rèn)是NONE 是否使用布隆過(guò)慮使用何種方式
布隆過(guò)濾可以每列族單獨(dú)啟用。使用HColumnDescriptor.setBloomFilterType(NONE |ROW | ROWCOL) 對(duì)列族單獨(dú)啟用布隆。Default = NONE 沒(méi)有布隆過(guò)濾。對(duì)ROW,行鍵的哈希在每次插入行時(shí)將被添加到布隆。對(duì)ROWCOL,行鍵+ 列族+ 列族修飾的哈希將在每次插入行時(shí)添加到布隆
使用方法: create 'table',{BLOOMFILTER =>'ROW'}
啟用布隆過(guò)濾可以節(jié)省必須讀磁盤(pán)過(guò)程,可以有助于改進(jìn)讀取延遲

2、VERSIONS 默認(rèn)是3 這個(gè)參數(shù)的意思是數(shù)據(jù)保留三個(gè)版本,如果我們認(rèn)為我們的數(shù)據(jù)沒(méi)有這么大的必要保留這么多,隨時(shí)都在更新,而老版本的數(shù)據(jù)對(duì)我們毫無(wú)價(jià)值,那將此參數(shù)設(shè)為1 能節(jié)約2/3 的空間
使用方法: create 'table',{VERSIONS=>'2'}

3、COMPRESSION 默認(rèn)值是NONE 即 不使用壓縮
這個(gè)參數(shù)意思是該列族是否采用壓縮,采用什么壓縮算法
使用方法: create 'table',{NAME=>'info',COMPRESSION=>'SNAPPY'}
我建議采用SNAPPY 壓縮算法,個(gè)壓縮算法的比較網(wǎng)上比較多,我從網(wǎng)上摘抄一個(gè)表格作為參考,具體的snappy 的安裝后續(xù)會(huì)以單獨(dú)章節(jié)進(jìn)行描述。
這個(gè)表是Google 幾年前發(fā)布的一組測(cè)試數(shù)據(jù),實(shí)際測(cè)試Snappy 和下表所列相差無(wú)幾。HBase 中,在Snappy 發(fā)布之前(Google 2011 年對(duì)外發(fā)布Snappy),采用的LZO 算法,
目標(biāo)是達(dá)到盡可能快的壓縮和解壓速度,同時(shí)減少對(duì)CPU 的消耗;在Snappy 發(fā)布之后,建議采用Snappy 算法(參考《HBase: The Definitive Guide》),具體可以根據(jù)實(shí)際情況對(duì)LZO 和Snappy 做過(guò)更詳細(xì)的對(duì)比測(cè)試后再做選擇。
Algorithm(算法) % remaining(剩余) Encoding(編碼) Decoding(解碼)
GZIP 13.4% 21 MB/s 118 MB/s
LZO 20.5% 135 MB/s 410 MB/s
Zippy/Snappy 22.2% 172 MB/s 409 MB/s
如果建表之初沒(méi)有壓縮,后來(lái)想要加入壓縮算法,怎么辦hbase 有另外的一個(gè)命令alter

4、alter
使用方法:
如修改壓縮算法
disable 'table'
alter 'table',{NAME=>'info',COMPRESSION=>'snappy'}
enable 'table'
刪除列族
disable 'table'
alter 'table',{NAME=>'info',METHOD=>'delete'}
enable 'table'
但是這樣修改之后發(fā)現(xiàn)表數(shù)據(jù)還是那么大,并沒(méi)有發(fā)生多大變化。怎么辦
major_compact 'table' 命令之后才會(huì)做實(shí)際的操作。

5、TTL 默認(rèn)是2147483647 即:Integer.MAX_VALUE 值大概是68 年
這個(gè)參數(shù)是說(shuō)明該列族數(shù)據(jù)的存活時(shí)間也就是數(shù)據(jù)的生命周期單位是s 默寫(xiě)文章寫(xiě)的單位是ms 是錯(cuò)誤的。
這個(gè)參數(shù)可以根據(jù)具體的需求對(duì)數(shù)據(jù)設(shè)定存活時(shí)間,超過(guò)存過(guò)時(shí)間的數(shù)據(jù)將在表中不在顯示,待下次major compact 的時(shí)候再?gòu)氐讋h除數(shù)據(jù)
為什么在下次major compact 的時(shí)候刪除數(shù)據(jù),后面會(huì)具體介紹到。
注意的是TTL 設(shè)定之后MIN_VERSIONS=>'0' 這樣設(shè)置之后,TTL 時(shí)間戳過(guò)期后,將全部徹底刪除該family 下所有的數(shù)據(jù),如果MIN_VERSIONS 不等于0 那將保留最新的MIN_VERSIONS 個(gè)版本的數(shù)據(jù),其它的全部刪除,比如MIN_VERSIONS=>'1' 屆時(shí)將保留一個(gè)最新版本的數(shù)據(jù),其它版本的數(shù)據(jù)將不再保存。

6、describe 'table' 這個(gè)命令查看了create table 的各項(xiàng)參數(shù)或者是默認(rèn)值。

7、disable_all 'toplist.*' disable_all 支持正則表達(dá)式,并列出當(dāng)前匹配的表的如下:
toplist_a_total_1001
toplist_a_total_1002
toplist_a_total_1008
toplist_a_total_1009
toplist_a_total_1019
toplist_a_total_1035
...
Disable the above 25 tables (y/n)? 并給出確認(rèn)提示

8、drop_all 這個(gè)命令和disable_all 的使用方式是一樣的

9、hbase 表預(yù)分區(qū)也就是手動(dòng)分區(qū)
默認(rèn)情況下,在創(chuàng)建HBase 表的時(shí)候會(huì)自動(dòng)創(chuàng)建一個(gè)region 分區(qū),當(dāng)導(dǎo)入數(shù)據(jù)的時(shí)候,所有的HBase 客戶端都向這一個(gè)region 寫(xiě)數(shù)據(jù),直到這個(gè)region 足夠大了才進(jìn)行切分。一種可以加快批量寫(xiě)入速度的方法是通過(guò)預(yù)先創(chuàng)建一些空的regions,這樣當(dāng)數(shù)據(jù)寫(xiě)入HBase時(shí),會(huì)按照region 分區(qū)情況,在集群內(nèi)做數(shù)據(jù)的負(fù)載均衡
使用方法:create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
也可以使用api 的方式
hbase org.apache.hadoop.hbase.util.RegionSplitter test_table HexStringSplit -c 10 -f info
參數(shù)很容易看懂test_table 是表名HexStringSplit 是split 方式 -c 是分10 個(gè)region -f 是family(列族)

這樣就可以將表預(yù)先分為10個(gè)區(qū),減少數(shù)據(jù)達(dá)到storefile 大小的時(shí)候自動(dòng)分區(qū)的時(shí)間消耗,并且還有以一個(gè)優(yōu)勢(shì),就是合理設(shè)計(jì)rowkey 能讓各個(gè)region 的并發(fā)請(qǐng)求平均分配(趨于均勻) 使IO 效率達(dá)到最高,但是預(yù)分區(qū)需要將filesize 設(shè)置一個(gè)較大的值,設(shè)置哪個(gè)參數(shù)呢hbase.hregion.max.filesize 這個(gè)值默認(rèn)是10G 也就是說(shuō)單個(gè)region 默認(rèn)大小是10G
這個(gè)值發(fā)生從0.90 到0.92 到0.94.3 從256M--1G--10G 這個(gè)根據(jù)自己的需求將這個(gè)值修改。

但是如果MapReduce Input 類型為T(mén)ableInputFormat 使用hbase 作為輸入的時(shí)候,就要注意了,每個(gè)region 一個(gè)map,如果數(shù)據(jù)小于10G 那只會(huì)啟用一個(gè)map 造成很大的資源浪費(fèi),這時(shí)候可以考慮適當(dāng)調(diào)小該參數(shù)的值,或者采用預(yù)分配region 的方式,并將
hbase.hregion.max.filesize 設(shè)為一個(gè)相對(duì)比較大的值,不容易達(dá)到的值比如1000G,檢測(cè)如果達(dá)到這個(gè)值,再手動(dòng)分配region。

前面說(shuō)到了compact 為什么設(shè)置了TTL 超過(guò)存活時(shí)間的數(shù)據(jù)就消失了,是如何消失的呢?是刪除了嗎?通過(guò)哪些參數(shù)刪除的。
后面將要說(shuō)到hbase compact

例如建表語(yǔ)句為: //生產(chǎn)上,可以用于這樣去創(chuàng)建hbase表
hbase(main):009:0> create 'NewsClickFeedback',{NAME=>'Toutiao',VERSIONS=>1,BLOCKCACHE=>true,BLOOMFILTER=>'ROW',COMPRESSION=>'SNAPPY',TTL => 2592000 },{SPLITS => ['1','2','a','b']}

提示:NAME=>'Toutiao' 列族為 Toutiao ;VERSIONS=>1 版本號(hào)為1 ;是否開(kāi)啟block cache緩存,默認(rèn)開(kāi)啟。;
BLOOMFILTER=>'ROW' 布隆過(guò)濾器,優(yōu)化HBase的隨機(jī)讀取性能,可選值NONE|ROW|ROWCOL,默認(rèn)為NONE,該參數(shù)可以單獨(dú)對(duì)某個(gè)列簇啟用。COMPRESSION=>'SNAPPY' 壓縮;過(guò)期時(shí)間 TTL => 2592000 為30天
{SPLITS => ['1','2','a','b']} 分區(qū);一般采用hash + partition的方式預(yù)分配region,比如示例中rowkey首先使用md5 hash,然后再按照首字母partition為4份,就可以預(yù)分配4個(gè)region。

插入數(shù)據(jù)
put 'NewsClickFeedback', '1', 'Toutiao:name', 'zhangsan'
put 'NewsClickFeedback', '01', 'Toutiao:name', 'lisi'
put 'NewsClickFeedback', '100', 'Toutiao:name', 'wangwu'
put 'NewsClickFeedback', '4', 'Toutiao:name', 'liuliu'

IN_MEMORY
數(shù)據(jù)是否常駐內(nèi)存,默認(rèn)為false。HBase為頻繁訪問(wèn)的數(shù)據(jù)提供了一個(gè)緩存區(qū)域,緩存區(qū)域一般存儲(chǔ)數(shù)據(jù)量小、訪問(wèn)頻繁的數(shù)據(jù),常見(jiàn)場(chǎng)景為元數(shù)據(jù)存儲(chǔ)。默認(rèn)情況,該緩存區(qū)域大小等于Jvm Heapsize 0.2 0.25 ,假如Jvm Heapsize = 70G,存儲(chǔ)區(qū)域的大小約等于3.2G。需要注意的是HBase Meta元數(shù)據(jù)信息存儲(chǔ)在這塊區(qū)域,如果業(yè)務(wù)數(shù)據(jù)設(shè)置為true而且太大會(huì)導(dǎo)致Meta數(shù)據(jù)被置換出去,導(dǎo)致整個(gè)集群性能降低,所以在設(shè)置該參數(shù)時(shí)需要格外小心。
//
IN_MEMORY表示常駐內(nèi)存,用戶如果在列族設(shè)置該參數(shù)為true,表示該列族對(duì)應(yīng)的數(shù)據(jù)會(huì)常駐內(nèi)存,一般建議如果是業(yè)務(wù)元數(shù)據(jù),可以設(shè)置為常駐內(nèi)存,另外,hbase:meta數(shù)據(jù)是常駐內(nèi)存的。至于hbase:meta能不能執(zhí)行split,本人在實(shí)際環(huán)境實(shí)際執(zhí)行命令:split ‘hbase:meta’,結(jié)果還是一個(gè)region,并沒(méi)有出現(xiàn)多個(gè)region,目前還是認(rèn)為hbase:meta不能執(zhí)行split。
HBase BlockCache系列 – 走進(jìn)BlockCache http://hbasefly.com/2016/04/08/hbase-blockcache-1/ 在此鏈接中提到了IN_MEMORY=true
//而in-memory區(qū)表示數(shù)據(jù)可以常駐內(nèi)存,一般用來(lái)存放訪問(wèn)頻繁、數(shù)據(jù)量小的數(shù)據(jù),比如元數(shù)據(jù),用戶也可以在建表的時(shí)候通過(guò)設(shè)置列族屬性IN-MEMORY= true將此列族放入in-memory區(qū)。

blocksize
HFile會(huì)被切分為多個(gè)大小相等的block塊,每個(gè)block的大小可以在創(chuàng)建表列簇的時(shí)候通過(guò)參數(shù)blocksize => ‘65535’進(jìn)行指定,默認(rèn)為64k,大號(hào)的Block有利于順序Scan,小號(hào)Block利于隨機(jī)查詢,因而需要權(quán)衡。
//如果業(yè)務(wù)請(qǐng)求以Get請(qǐng)求為主,可以考慮將塊大小設(shè)置較??;如果以Scan請(qǐng)求為主,可以將塊大小調(diào)大;默認(rèn)的64K塊大小是在Scan和Get之間取得的一個(gè)平衡

參考鏈接為:HBase - 建表語(yǔ)句解析 http://hbasefly.com/2016/03/23/hbase_create_table/
HBase(八): 表結(jié)構(gòu)設(shè)計(jì)優(yōu)化:https://www.cnblogs.com/tgzhu/archive/2016/09/11/5862299.html

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI