一发笔、簡(jiǎn)介
1.1組成:
Rowkey盟萨、列簇、列和列的value(單元格)
1了讨、Rowkey
每一行的唯一標(biāo)識(shí)捻激。
不能直接用業(yè)務(wù)主鍵制轰,會(huì)導(dǎo)致數(shù)據(jù)不平衡。
一般通用設(shè)計(jì)模式是加鹽鍵胞谭,給鍵加上二進(jìn)制字節(jié)作為前綴垃杖。
2、列簇
1)一張表通常有一個(gè)單獨(dú)的列簇丈屹,1張表中的列簇不會(huì)超過(guò)5個(gè)(HBase作為Janusgraph的后端存儲(chǔ)调俘,有9個(gè)列簇)。
2)列簇必須在創(chuàng)建表時(shí)候定義泉瞻,列只有在插入后才會(huì)存在脉漏,空值并不保存。
3)每一個(gè)列簇都會(huì)保存在自己的文件集合中袖牙,所有存儲(chǔ)設(shè)置都需要在列簇級(jí)別指定侧巨。
HBase默認(rèn)的塊大小是64KB,版本數(shù)默認(rèn)為3個(gè)版本鞭达,TTL可設(shè)置司忱,一旦到底過(guò)期時(shí)間可自動(dòng)刪除舊行。
4)多重列簇類(lèi)似于以Rowkey為連接條件的連接查詢(xún)畴蹭。
3坦仍、單元格:
列和行的交集,單元格是版本化的叨襟,最新版本號(hào)排咋最前面繁扎,所有單元格都會(huì)根據(jù)版本號(hào)降序排列。
1.2壓縮
壓縮是分區(qū)中HFile文件合并的過(guò)程糊闽,壓縮過(guò)程分為2種梳玫,小量和全量。
XH 小量壓縮閾值=3右犹,如果分區(qū)HFile文件超過(guò)了預(yù)設(shè)值提澎,就會(huì)啟動(dòng)小量壓縮,壓縮期間念链,不會(huì)發(fā)生持久化盼忌,如果Memsore寫(xiě)滿(mǎn),與該分區(qū)服務(wù)器交互的客戶(hù)端就會(huì)被堵塞掂墓,直至壓縮過(guò)程執(zhí)行完畢谦纱。(BS連接HBase超時(shí)原因)
XH 全量壓縮設(shè)置為7天一次。
二梆暮、相關(guān)操作
2.1hbase shell
進(jìn)入HBase命令行頁(yè)面
list:列出所有表
2.2namespace
HBase中沒(méi)有database的概念服协,這里的namespace命名空間指對(duì)一組表的邏輯分組,類(lèi)似RDBMS中的database啦粹;
HBase系統(tǒng)默認(rèn)定義了兩個(gè)缺省的namespace
hbase:系統(tǒng)內(nèi)建表偿荷,包括namespace和meta表
default:用戶(hù)建表時(shí)未指定namespace的表都創(chuàng)建在此
1)創(chuàng)建namespace
hbase>create_namespace 'test_ns'
2)列出所有namespace
hbase>list_namespace
3)查看namespace
hbase>describe_namespace 'test_ns'
4)在namespace下創(chuàng)建表
hbase>create 'test_ns:testtable', 'fm1'
5)查看namespace下的表
hbase>list_namespace_tables 'test_ns'
6)刪除namespace ----必須空的namespace才能刪除 要?jiǎng)h除掉里面的表
hbase>disable 'test_ns:testtable'
hbase>drop 'test_ns:testtable'
hbase>drop_namespace 'test_ns'
2.3table DML
1窘游、創(chuàng)建表
hbase>create 't_demo_tbl','f1','f2','f3' #-------t_demo_tbl是表名,f1跳纳,f2忍饰,f3是列簇名
2、查看表的結(jié)構(gòu):
hbase>describe 't_demo_tbl'
3寺庄、禁用艾蓝,啟用表
hbase>disable 't_demo_tbl'
hbase>enable 't_demo_tbl'
4、查看表結(jié)構(gòu)是否啟用【允許修改】 因?yàn)閱⒂玫谋聿辉试S修改:
hbase>is_enabled 't_demo_tbl'
5斗塘、增加一個(gè)列族:
hbase>disable 't_demo_tbl'
hbase>alter 't_demo_tbl', NAME=>'f1', VERSIONS=>3
hbase>enable 't_demo_tbl'
6赢织、刪除某個(gè)列族:
hbase>disable 't_demo_tbl'
hbase>alter 't_demo_tbl', NAME=>'f1', METHOD=>'delete' #--------注意大小寫(xiě)(簡(jiǎn)寫(xiě):alter 't_demo_tbl', 'delete'=>'f1')
hbase>enable 't_demo_tbl'
7、查看所有的表
hbase>list
8馍盟、查看某一表是否存在:
hbase>exists 't_demo_tbl'
9于置、清空表:
hbase>truncate 't_demo_tbl'
10、刪除某張表:
hbase>disable 't_demo_tbl'
hbase>drop 't_demo_tbl'
2.4table DDL
1贞岭、向表中插入數(shù)據(jù):
hbase>put 't_demo_tbl', 'r1', 'f1:c1', 'value' #--------列族的列可以不存在八毯,修改數(shù)據(jù)也是put,只需行健[rowkey]和列相同即可
2瞄桨、刪除某行數(shù)據(jù)的列[值]:
hbase>delete 't_demo_tbl', 'r1', 'c1', 'ts1' #--------刪除t_demo_tbl表话速,行健為r1的c1列中,時(shí)間戳為ts1的值芯侥,如果不指定ts1就刪除所有列值[默認(rèn)保持三個(gè)版本]
3泊交、刪除某行數(shù)據(jù):
hbase>deleteall 't_demo_tbl', 'r1'
注:刪除并不會(huì)物理刪除HBase中的記錄,它會(huì)被標(biāo)記被刪除的記錄柱查。真正的物理刪除在壓縮過(guò)程中執(zhí)行活合。
4、獲取某個(gè)行健的所有列族的列值:
hbase>get 't_demo_tbl', 'r1'
5物赶、獲取某個(gè)行健的所有某個(gè)列族的列值:
hbase>get 't_demo_tbl', 'r1','f1'
6、獲取某個(gè)行健的某兩個(gè)列族的列值:
hbase>get 't_demo_tbl', 'r1','f1','f2'
7留晚、獲取某個(gè)行健的某個(gè)列族的某個(gè)列值:
hbase>get 't_demo_tbl', 'r1', 'f1:c1'
8酵紫、獲取某個(gè)表的所有行健值:
hbase>scan 't_demo_tbl'
9、獲取某個(gè)表的前3行:
hbase>scan 't_demo_tbl', {LIMIT=>3}
10错维、獲取某個(gè)表的從指定位置開(kāi)始的行:
hbase>scan 't_demo_tbl', {STARTROW=>'rowKey', LIMIT=>3}
11奖地、獲取某個(gè)表的指定列的所有行數(shù)據(jù):
hbase>scan 'heroes', {COLUMNS =>'f1:c1'}
12、統(tǒng)計(jì)表的行數(shù):
hbase>count 't_demo_tbl'
INTERVAL=>100000000 統(tǒng)計(jì)間隔
或者h(yuǎn)base org.apache.hadoop.hbase.mapreduce.RowCounter 't_demo_tbl'
比hbase shell 統(tǒng)計(jì)快一些
13赋焕、清空表:truncate ‘tablename’
14参歹、移除整張表:drop ‘tablename’
以上兩步驟,必須先禁用表(disable)隆判。
2.5HBase API
Get類(lèi)
Put類(lèi)
Delete類(lèi)
Scan類(lèi)
過(guò)濾器
三犬庇、hbase 2.0及以上版本的優(yōu)化:
1.flush和compaction支持到列簇級(jí)別
四僧界、HBase 不同namespace下表的轉(zhuǎn)移
1、disable 'TableName'
2臭挽、snapshot 'TableName', TableNameSnapshot1'
3捂襟、clone_snapshot 'TableNameSnapshot1', 'NewNameSpace:TableName'
4、delete_snapshot 'TableNameSnapshot1'
-------------------------------------分割線(xiàn)----------------------
一:hbase的存儲(chǔ)形式
hbase的內(nèi)部使用KeyValue的形式存在欢峰,其key是有rowkey:family:column:logTime葬荷,value是其存儲(chǔ)的內(nèi)容。
其在region的是大多以升序的形式排列纽帖,唯一的是logtime是以降序的形式進(jìn)行排列宠漩。
所以,按照越靠近左邊的信息越容易被檢索到懊直。其設(shè)計(jì)時(shí)扒吁,要考慮把重要的信息放左邊,不重要的信息放到右邊吹截。這樣可以提高查詢(xún)數(shù)據(jù)的速度瘦陈。這樣,最重要的提高索引速度的就是設(shè)計(jì)合適的rowkey波俄。
二:rowkey的設(shè)計(jì)原則
1:長(zhǎng)度原則晨逝,最短越好,最大不能超過(guò)64K懦铺。太長(zhǎng)的影響有兩點(diǎn)捉貌,一是極大影響了HFile的存儲(chǔ)效率。二是緩存memstore不能得到有效利用冬念,緩存不能存放太多的信息趁窃,造成檢索效率的降低。
2:唯一原則
保證rowkey的唯一性急前,這條沒(méi)有什么要講的醒陆。
3:自己一條原則
盡量保證經(jīng)常一起用的rowkey存儲(chǔ)在同一個(gè)region上,有助于提升檢索效率裆针。但要避免熱點(diǎn)問(wèn)題刨摩。
4:對(duì)于常用的檢索的rowkey,盡量使用高表(行多列少)世吨,二部選擇寬表(列多行少)澡刹。
三:rowkey引起熱點(diǎn)問(wèn)題的集中解決方法
1-加鹽:在rowkey前面加一個(gè)冗余信息,這樣可以把數(shù)據(jù)分散到不同的region中耘婚。
優(yōu)點(diǎn):可以有效的防止rowkey集中分配到一個(gè)或多個(gè)region中罢浇。有效避免了熱點(diǎn)問(wèn)題;
缺點(diǎn):無(wú)形中增加了rowkey的長(zhǎng)度;范圍檢索得不到有效使用嚷闭。
2-字段交換攒岛,提升權(quán)重:如果rowkey中含有幾個(gè)信息字段,可以調(diào)整信息字段的順序凌受。
缺點(diǎn):對(duì)于單個(gè)信息字段阵子,或者無(wú)論怎么調(diào)整都會(huì)遇到region熱點(diǎn)的rowkey是解決不了的。
3-隨機(jī)鍵:把rowkey進(jìn)行hash化胜蛉,在分配到不同的服務(wù)器上挠进。和加鹽的方式相似;
以下是順序讀的性能排行(由高到低誊册,寫(xiě)性能與讀性能相反):順序鍵 -> 使用加鹽鍵 -> 提升字段鍵 -> 隨機(jī)鍵
強(qiáng)加幾個(gè)知識(shí)點(diǎn):
1-盡量使用范圍查詢(xún)代替前綴查詢(xún)领突;
2-數(shù)據(jù)多時(shí),用分頁(yè)查詢(xún)案怯;