




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
3.4.2HBase簡介,數(shù)據(jù)模型,架構,安
裝,shell操作,原理深入(讀寫流程),
機制(刷寫,合并,拆分,),API操作,協(xié)
處理器,RK設計原貝?。?,熱點,二級索引,
布隆過濾器
目錄
第一部分初識HBase
第1節(jié)HBase簡介
1.1HBase是什么
1.2HBase的特點
1.3HBase的應用
第2節(jié)IIBase數(shù)據(jù)模型
HBase邏輯架構
HBase物理存儲
第3節(jié)HBase整體架構
Zookeeper
IMaster(Master)
HRegionServer(RegionServer)
Region
第4節(jié)HBase集群安裝部署
第5節(jié)HBaseshell基本操作
3、查看表list
4、創(chuàng)建表操作create
5、添加數(shù)據(jù)操作put
6、查詢數(shù)據(jù)get
6.1通過rowkey進行查詢
6.2查看rowkey下面的某個列族的信息
6.3查看rowkey指定列族指定字段的值
6.4查看rowkey指定多個列族的信息
6.5指定rowkey與列值查詢
6.6指定rowkey與列值模糊查詢
6.7查詢所有數(shù)據(jù)scan
6.8列族查詢scan
6.9指定多個列族與按照數(shù)據(jù)值模糊查詢
6.10rowkey的范圍值查詢scan(非常重要)
6.11指定rowkey模糊查詢
7、更新數(shù)據(jù)put
7.1更新數(shù)據(jù)值
8、刪除數(shù)據(jù)和表delete
8.1指定rowkey以及列名進行刪除
8.2指定rowkey,列名以及字段值進行刪除
8.3刪除列族alter
8.4清空表數(shù)據(jù)truncate
8.5刪除表disable+drop
第二部分IIBase原理深入
第1節(jié)HBase讀數(shù)據(jù)流程
第2節(jié)HBase寫數(shù)據(jù)流程
第3節(jié)HBase的flush(刷寫)及compact(合并)機制
Flush機制
阻塞機制
Compact合并機制
第4節(jié)Region拆分機制
4.1拆分策略
1)ConstantSizeRegionSplitPolicy
2)IncreasingToUpperBoundRegionSplitPolicy
3)SteppingSplitPolicy
4)KeyPrefixRegionSplitPolicy
5)DelimitedKeyPrefixRegionSplitPolicy
6)DisabledRegionSplitPolicy
4.2RegionSplitPolicy的應用
1)通過hbase-site.xml全局統(tǒng)一配置(對hbase所有表生
效)
2)通過JavaAPI為單獨的表指定Region拆分策略
3)通過HBaseShell為單個表指定Region拆分策略
第5節(jié)HBase表的預分區(qū)(region)
5.1為何要預分區(qū)
第6節(jié)Region合并
6.1Region合并說明
6.2如何進行Region合并
通過Merge類冷合并Region
通過online_merge熱合并Region
第三部分HBaseAPI應用和優(yōu)化
第1節(jié)HBaseAPI客戶端操作
初始化及釋放資源方法
創(chuàng)建表:
插入數(shù)據(jù)
刪除數(shù)據(jù):
查詢某個列族數(shù)據(jù)
通過Scan全表掃描
通過startRowKey和endRowKey進行掃描
第2節(jié)Hbase協(xié)處理器
2.1協(xié)處理器概述
2.2協(xié)處理器類型
Observer
Endpoint
Endpoint?!跤猛?/p>
2.3協(xié)處理器Observer案例
第4節(jié)HBase表的RowKey設計
RowKey的基本介紹
RowKey□度原則
RowKey散列原則
RowKey唯一原則
RowKey排序原則
第5節(jié)HBase表的熱點
5.1什么是熱點
5.2熱點的解決方案
第6節(jié)HBase的二級索引
第7節(jié)布隆過濾器在hbase的應用
布隆過濾器應用
布隆過濾器的原理
BloomFilter案例
第一部分初識HBase
第1節(jié)HBase簡介
1.1HBase是什么
HBase基于Google的BigTable論文而來,是一個分布式海量列式非
關系型數(shù)據(jù)庫系統(tǒng),可以提供超大規(guī)模數(shù)據(jù)集的實時隨機讀寫。
接下來,通過一個場景初步認識HBase列存儲
如下MySQL存儲機制,空值字段浪費存儲空間
如果是列存儲的話,可以這么玩
rowkey:1name:小明
rowkey:1age:23
rowkey:1job:學生
rowkey:2name:小紅
rowkey:2salary:lOw
rowkey:2job:律師
列存儲的優(yōu)點:
1)減少存儲空間占用。
2)支持好多列
1.2HBase的特點
?海量存儲:底層基于HDFS存儲海量數(shù)據(jù)
?列式存儲:HBase表的數(shù)據(jù)是基于列族進行存儲的,一個列族包含
若干列
?極易擴展:底層依賴HDFS,當磁盤空間不足的時候,只需要動態(tài)增
加DataNode服務節(jié)點就可以
?高并發(fā):支持高并發(fā)的讀寫請求
?稀疏:稀疏主要是針對HBase列的靈活性,在列族中,你可以指定
任意多的列,在列數(shù)據(jù)為空的情況下,是不會占用存儲空間的。
?數(shù)據(jù)的多版本:HBase表中的數(shù)據(jù)可以有多個版本值,默認情況下
是根據(jù)版本號去區(qū)分,版本號就是插入數(shù)據(jù)的時間戳
?數(shù)據(jù)類型單一:所有的數(shù)據(jù)在HBase中是以字節(jié)數(shù)組進行存儲
1.3HBase的應用
?交通方面:船舶GPS信息,每天有上千萬左右的數(shù)據(jù)存儲。
?金融方面:消費信息、貸款信息、信用卡還款信息等
?電商方面:電商網(wǎng)站的交易信息、物流信息、游覽信息等
?電信方面:通話信息
總結:HBase適合海量明細數(shù)據(jù)的存儲,并且后期需要有很好的查詢性
能(單表超千萬、上億,且并發(fā)要求高)
第2節(jié)HBase數(shù)據(jù)模型
HBase的數(shù)據(jù)也是以表(有行有列)的形式存儲
HBase邏輯架構
HBase物理存儲
\\
概描
念述
命
na名
me空
sp間
ac類
e似
于
關
系
型
數(shù)
據(jù)
庫
的
da
ta
ba
se
概
念
每
個
命
名
空
間
下
有
多
個
表
O
HB
as
e
兩
個
自
帶
的
命
名
空
間
?
分
別
是
hb
as
e
和
de
fa
ul
t
9
hb
as
e
中
存
放
的
是
HB
as
e
內
置
的
表
de
fa
ul
t
表
是
用
戶
默
認
使
用
的
命
名
空
間
個
表
可
以
自
由
選
擇
是
否
有
命
名
空
間
如
果
創(chuàng)
建
表
的
時
候
加
上
了
命
名
空
間
后
這
個
表
名
字
以
作
為
區(qū)
分
類
似
于
關
%系
bl型
e數(shù)
據(jù)
庫
的
表
概
念
不
同
的
是
HB
as
e
定
義
表
時
□
聲
要
聲
明
列
族
即
可
9
數(shù)
據(jù)
屬
性
比
如
超
時
時
間
(
TT
L
)
9
壓
箝
算
法
(
CO
MP
RE
SS
10
\
)
等
9
都
在
列
族
的
定
義
中
定
義
?
不
S
要
聲
明
具
體
的
列
HB
as
e
表
中
的
Ro
每
w
行
(
_數(shù)
據(jù)
行
都
邏由
輯_
數(shù)
個
據(jù)
Ro
)
wK
ey
和
多
個
Co
lu
mn
(
列
)
組
成
個
行
包
含
T
多
個
列
這
些
列
通
過
列
族
來
分
關
?
行
中
的
數(shù)
據(jù)-
所
屬
列
族
只
能
從
該
表
所
定
義
的
列
族
中
選
取
?
不
能
定
義
這
個
表
中
不
存
在
的
列
族
?
否
則
報
錯
No
Su
ch
Co
lu
mn
Fa
mi
ly
Ex
ce
Pt
io
n
Ro
Ro
wk
wK
ey
ey
由
(
用
每
戶
行
指
數(shù)
定
據(jù)
的
主
鍵串
)不
重
復
的
字
符
串
定
義
1
是
行
的
唯
標
識
I
數(shù)
據(jù)
是
按
照
Ro
wK
ey
的
字
典
順
序
存
儲
的
并
且
查
洵
數(shù)
據(jù)
時
只
能
根
-據(jù)
Ro
wK
ey
進
行
檢
索
所
以
Ro
wK
ey
的
設
計
十
分
重
要
O
如
果
使
用
T
之
前
已
經(jīng)
定
義
的
Ro
wK
ey
?
那
么
會
將
之
前
的
數(shù)
據(jù)
更
新
掉
列
族
是
多
個
列
的
集
Co
lu合
mn
Fa
mi個
ly列
(族
列郁
族以
,[苗
態(tài)
地
靈
活
定
義
多
個
列
O
表
的
相
關
屬
性
大
部
分
都
定
義
在
列
族
上
?
同
個
表
里
的
不
同
列
族
可
以
有
完
全
不
同
的
屬
性
配
置
1
但
是
同
個
列
族
內
的
所
有
列
都
會
有
相
同
的
屬
性
O
列
族
存
在
的
意
義
是
HB
as
e
會
把
相
同
列
族
的
列
盡
放
在
同
臺
機
器
上
所
以
說
如
果
想
讓
某
幾
個
列
被
放
到
起
*
你
就
給
他
們
定
義
相
同
的
列
族
o
lib
as
e
中
的
Co列
lu是
mn可
Qu以
al隨
if意
ie定
r義
(
的
列
)
個
行
中
的
列
不
限
名
字
不
限
數(shù)
量
1
只
限
定
列
族
O
因
此
列
必
須
依
賴
于
列
族
存
在
I
列
的
名
稱
前
必
須
帶
著
其
所
屬
的
列
族
!
例
如
in
fo
na
me
in
fo
ag
用
Ti于
me標
st識
am數(shù)
P據(jù)
(的
時不
間同
戳版
-A
本
版(
本
ve
)rs
io
n
)
o
時
間
戳
默
認
由
系
統(tǒng)
指
定
9
也
可
以
由
用
戶
顯
式
指
定
在
讀
取
單
元
格
的
數(shù)
據(jù)
時
?
版
本
可
以
省
略
?
如
果
不
指
定
rib
as
e
默
認
會
獲
取
最
后
個
版
本
的
數(shù)
據(jù)
返
回
個
11
列
中
可
以
存
儲
多
個
版
本
的
數(shù)
據(jù)
O
而
每
個
版
本
就
稱
為
個
單
元
格
(
Ce
11
)
Re
gi
on
由
Re
gi
個
on
表
(
的
表
若
的
干
分
行
區(qū)
)組
成
I
在
Re
gi
on
中
行
的
排
序
按
照
行
鍵
(
ro
wk
ey
)
字
典
排
序
O
Re
gi
on
不
能
跨
Re
gi
on
Se
ve
r
?
且
當
數(shù)
據(jù)
量
大
的
時
候
?
HB
as
e
會
拆
分
Re
gi
on
第3節(jié)HBase整體架構
Zookeeper
實現(xiàn)了HMaster的高可用
?保存了HBase的元數(shù)據(jù)信息,是所有HBase表的尋址入口
對HMaster和IIRegionServer實現(xiàn)了監(jiān)控
HMaster(Master)
為IIRegionServer分配Region
?維護整個集群的負載均衡
維護集群的元數(shù)據(jù)信息
發(fā)現(xiàn)失效的Region,并將失效的Region分配到正常的HRegionServer
上
HRegionServer(RegionServer)
負責管理Region
接受客戶端的讀寫數(shù)據(jù)請求
切分在運行過程中變大的Region
Region
每個HRegion由多個Store構成,
每個Store保存一個列族(ColumnsFamily),表有幾個列族,則有
幾個Store,
每個Store由一個MemStore和多個StoreFile組成,MemStore是
Store在內存中的內容,寫到文件后就是StoreFile。StoreFile底層
是以HFile的格式保存。
第4節(jié)HBase集群安裝部署
(1)下載安裝包
http://archive,apache,org/dist/hbase/1.3.1/
hbase-1.3.l-bin.tar.gz
(2)規(guī)劃安裝目錄
/opt/lagou/servers/
(3)上傳安裝包到服務器
(4)解壓安裝包到指定的規(guī)劃目錄
tar-zxvfhbase-1.3.l-bin.tar.gz-C/opt/lagou/servers
(5)修改配置文件
需要把hadoop中的配置core-site,xml、hdfs-site.xml拷口到
hbase安裝目錄下的conf文件夾中
In-s/opt/lagou/servers/hadoop-2.9.2/etc/hadoop/core-site.xml
/opt/lagou/servers/hbase-1.3.1/conf/core-site.xml
In-s/opt/lagou/servers/hadoop-2.9.2/etc/hadoop/hdfs-site.xml
/opt/lagou/servers/hbase-1.3.1/conf/hdfs-site.xml
修改conf目錄下配置文件
修改hbase-env.sh
#添加java環(huán)境變量
exportJAVA110ME=/opt/1agou/servers/jdk1.8.0231
#指定使用外部的zk集群
exportHBASEMANAGES-ZK=FALSE
修改hbase-site.xml
<configuration>
<!—指定hbase在HDFS上存儲的路徑—>
<property>
<name>hbase.rootdir</name>
<value>hdfs://linuxl21:9000/hbase</value>
</property>
<!一指定hbase是分布式的一>
<property>
<name>hbase.cluster.distributed</name>
<va]ue>true</value>
</property>
<!—指定zk的地址,多個用分割一〉
<property>
<name>hbase.zookeeper.quorum</name>
<value>linux121:2181,linux122:2181,linuxl23:2181</value>
</property>
</configuraion>
修改regionservers文件
#指定regionserver節(jié)點
linuxl21
linuxl22
linuxl23
hbase的conf目錄下創(chuàng)建文件backup-masters(StandbyMaster)
linuxl22
(6)配置hbase的環(huán)境變量
exportHBASEHOME=/opt/lagou/servers/hbase-1.3.1
exportPATH=$PATH:$HBASEHOME/bin
(7)分發(fā)hbase目錄和環(huán)境變量到其他節(jié)點
rsync-script/opt./lagou/servers/hbase-1.3.1/
rsync-script/etc/profile
(8)讓所有節(jié)點的hbase環(huán)境變量生效
在所有節(jié)點執(zhí)行source/etc/profile
HBase集群的啟動和停止
前提條件:先啟動hadoop和zk集群
啟動HBase:start-hbase.sh
停止HBase:stop-hbase.sh
HBase集群的web管理界面
啟動好DBase集群之后,可以訪問地址:HMaster的主機名:16010
第5節(jié)HBaseshell基本操作
1、進入Hbase客戶端命令操作界面
hbaseshell
2、查看幫助命令
hbase(main):001:0>help
3、查看表list
hbase(main):006:0>list
4、創(chuàng)建表操作create
創(chuàng)建一張lagou表,包含base_info、extra_info兩個列族
hbase(main):001:0>create'lagou','baseinfo','extrainfo'
或者(Hbase建表必須指定列族信息)
create'lagou',{NAME=>'base_info',VERSIONS=>'3'},{NAME=>
'extra_info'.VERSIONS=>'3'}
VERSIONS是指此單元格內的數(shù)據(jù)可以保留最近的3個版本
5、添加數(shù)據(jù)操作put
向lagou表中插入信息,rowkey為rkl,列族base_info中添加
name列標示符,值為wang
hbase(main):001:0>put*lagou*,1rkl*,1baseinfo:name*,1wang1
向lagou表中插入信息,rowkey為rkl,列族base_info中添加age
列標示符,值為30
hbase(main):001:0>put1lagou*,1rkl*,1baseinfo:agef,30
向lagou表中插入信息,rowkey為rkl,列族extra_info中添加
address列標示符,值為shanghai
hbase(main):001:0>put1lagou1,'rkl',1extra_info:address1,
1shanghai*
6、查詢數(shù)據(jù)get
6.1通過rowkey進行查詢
獲取表中rowkey為rkl的所有信息
hbase(main):001:0>get1lagou*,1rkl,
6.2查看rowkey下面的某個列族的信息
獲取lagou表中rowkey為rkl,base_info列族的所有信息
hbase(main):001:0>get1lagou1,'rkl',rbaseinfo,
6.3查看rowkey指定列族指定字段的值
獲取表中rowkey為rkl,base_info列族的name、age列標示符的信
自
hbase(main):008:0>get1lagou','rkl1,'base_info:name’,
'base_info:age'
6.4查看rowkey指定多個列族的信息
獲取lagou表中rowkey為rkl,base_info,extra_info列族的信息
hbase(main):010:0>get*lagou1,1rkl1,'baseinfo',1extra_info1
或者
hbase(main):Oil:0>getflagou1,1rkl1,{COLUMN=>「base_info',
'extra_info']}
或者
hbase(main):012:0>get1lagou*,'rkl',{COLUMN=>[!base_info:name*,
1extra,info:address1]}
6.5指定rowkey與列值查詢
獲取表中rowkey為rkl,cell的值為wang的信息
hbase(main):001:0>get1lagou*,*rkl*,{FILTER=>MValueFilter(=,
'binary:wang')"}
6.6指定rowkey與列值模糊查詢
獲取表中rowkey為rkl,列標示符中含有a的信息
hbase(main):001:0>get'lagou','rkl',{FILTER=>
"(QualifierFilter(=,'substring:a'))"}
6.7查詢所有數(shù)據(jù)scan
查詢lagou表中的所有信息
hbase(main):000:0>scan'lagou'
6.8列族查詢scan
查詢表中列族為base_info的信息
hbase(main):001:0>scan'lagou',{COLUMNS=>'base_info'}
hbase(main):002:0>scan'lagou',{COLUMNS=>'base_info',RAW=>
true,VERSIONS=>3}
##Scan時可以設置是否開啟Raw模式,開啟Raw模式會返回包括已添加刪除標
記但是未實際刪除的數(shù)據(jù)
##VERSIONS指定查詢的最大版本數(shù)
6.9指定多個列族與按照數(shù)據(jù)值模糊查詢
查詢lagou表中列族為base_info和extra_info且列標示符中含有
a字符的信息
hbase(main):001:0>scan'lagou',{COLUMNS=>['base_info',
'extra_info'],FILTER=>"(QualifierFilter(=,'substring:a'))"}
6.10rowkey的范圍值查詢scan(非常重要)
?查詢lagou表中列族為base_info,rk范圍是[rkl,rk3)的數(shù)據(jù)
(rowkey底層存儲是字典序)
?按rowkey順序存儲。
hbase(main):001:0>scan'lagou',{COLUMNS=>'base_info',STARTROW=>
'rkl',ENDROW=>'rk3'}
6.11指定rowkey模糊查詢
查詢lagou表中rowkey以rk字符開頭的
hbase(main):001:0>scan'lagou',{FILTER=>"PrefixFilter('rk')"}
7、更新數(shù)據(jù)put
更新操作同插入操作一模一樣,只不過有數(shù)據(jù)就更新,沒數(shù)據(jù)就添加
7.1更新數(shù)據(jù)值
把lagou表中rowkey為rkl的base_info列族下的列name修改為
liang
hbase(main):030:0>put'lagou','rkl','base_info:name','liang'
8、刪除數(shù)據(jù)和表delete
8.1指定rowkey以及列名進行刪除
刪除lagou表rowkey為rkl,列標示符為base_info:name的數(shù)據(jù)
hbase(main):002:0>delete*lagou1,‘rkl',1baseinfo:name,
8.2指定rowkey,列名以及字段值進行刪除
刪除lagou表rowkey為rkl,列標示符為base_info:name的數(shù)據(jù)
hbase(main):033:0>delete'lagou','rkl','base_info:name','liang'
8.3刪除列族alter
刪除base_info列族
hbase(main):035:0>alter'lagou','delete'=>'baseinfo'
8.4清空表數(shù)據(jù)truncate
刪除lagou表數(shù)據(jù)
hbase(main):001:0>truncate1lagou1
8.5刪除表disable+drop
刪除lagou表
#先disable再drop
hbase(main):036:0>disable1lagou1
hbase(main):037:0>drop1lagou,
#如果不進行disable,直接drop會報錯
ERROR:Tableuserisenabled.Disableitfirst.
第二部分HBase原理深入
第1節(jié)HBase讀數(shù)據(jù)流程
HBase讀操作
1)首先從zk找到meta表的region位置,然后讀取meta表中的數(shù)
據(jù),meta表中存儲了用戶表的region信息
2)根據(jù)要查詢的namespace、表名和rowkey信息。找到寫入數(shù)據(jù)對應
的region信息
3)找到這個region對應的regionServer,然后發(fā)送請求
4)查找對應的region
5)先從memstore查找數(shù)據(jù),如果沒有,再從BlockCache上讀取
HBase上Regionserver的內存分為兩個部分
?一部分作為Memstore,主要用來寫;
?另夕I'一部分作為BlockCache,主要用于讀數(shù)據(jù);
6)如果BlockCache中也沒有找到,再到StoreFile上進行讀取
從storeFile中讀取到數(shù)據(jù)之后,不是直接把結果數(shù)據(jù)返回給客戶
端,而是把數(shù)據(jù)先寫入到BlockCache中,目的是為了加快后續(xù)的查
詢;然后在返回結果給客戶端。
第2節(jié)HBase寫數(shù)據(jù)流程
HBase寫操作
1)首先從zk找到meta表的region位置,然后讀取meta表中的數(shù)
據(jù),meta表中存儲了用戶表的region信息
2)根據(jù)namespace、表名和rowkey信息。找到寫入數(shù)據(jù)對應的
region信息
3)找到這個region對應的regionServer,然后發(fā)送請求
4)把數(shù)據(jù)分別寫到HLog(writeaheadlog)和memstore各一份
5)memstore達到閾值后把數(shù)據(jù)刷到磁盤,生成storeFile文件
6)刪除HLog中的歷史數(shù)據(jù)
第3節(jié)HBase的flush(刷寫)及compact(合并)機
制
Flush機制
(1)當memstore的大小超過這個值的時候,會flush到磁盤,默認為
128M
<property>
<name>hbase.hregion.memstore,flush.size</name>
<value>134217728</value>
</property>
(2)當memstore中的數(shù)據(jù)時間超過1小時,會flush到磁盤
<property>
<name>hbase.regionserver,optionalcacheflushinterval</name>
<value>3600000</value>
</property>
(3)UregionServer的全局memstore的大小,超過該大小會觸發(fā)
flush到磁盤的操作,默認是堆大小的40%
<property>
<name>hbase.regionserver,global.memstore.size</name>
<value>0.4</value>
</property>
(4)手動flush
flushtabieName
阻塞機制
以上介紹的是Store中memstore數(shù)據(jù)刷寫磁盤的標準,但是Hbase中
是周期性的檢查是否滿足以上標準滿足則進行刷寫,但是如果在下次
檢查到來之前,數(shù)據(jù)瘋狂寫入Memstore中,會出現(xiàn)什么問題呢?
會觸發(fā)阻塞機制,此時無法寫入數(shù)據(jù)到呢mstore,數(shù)據(jù)無法寫入
Hbase集群。
■memstore中數(shù)據(jù)達到512MB
計算公式:
hbase.hregion.memstore,flush.size*hbase.hregion.memstore..bio
ck.multiplier
hbase.hregion.memstore,flush.size刷寫的閥值,默認是
134217728,即128MB。
hbase.hregion.memstore,block,multiplier一個倍數(shù),默認是4。
?RegionServer全部memstore達到規(guī)定值
hbase.regionserver,global,memstore,size,lower,limit是0.95,
hbase.regionserver,global,memstore,size是0.4,
堆內存總共是16G,
觸發(fā)刷寫的閾值是:6.08GB觸發(fā)阻塞的閾值是:6.4GB
Compact合并機制
在hbase中主要存在兩種類型的compac合并
?minorcompact小合并
O在將Store中多個HFile(StoreFile)合并為一個HFile
這個過程中,刪除和更新的數(shù)據(jù)僅僅只是做了標記,并沒有物理移除,這種合
并的觸發(fā)頻率很高。
Ominorcompact文件選擇標準由以下幾個參數(shù)共同決定:
。一待合并文件數(shù)據(jù)必須大于等于下面這個值一>
<property>
<name>hbase.hstore.compaction.min</name>
<value>3</value>
</property>
<!一待合并文件數(shù)據(jù)必須小于等于下面這個值一〉
<property>
<name>hbase.hstore.compaction.max</name>
<value>10</value>
</property>
<!--默認值為128nl,表示文件大小,小于該值的storefile一定會加?到minor
compaction的storefile
—>
<property>
<name>hbase.hstore.compaction,min.size</name>
<value>134217728</value>
</property>
<!--默認值為LONG.MAX__VALUE,表示文件大小,大于該值的storefile一定會被minor
compaction排除一>
<property>
<name>hbase.hstore.compaction,max.size</name>
<value>9223372036854775807</value>
</property>
觸發(fā)條件
?memstoreflush
在進行memstoreflush前后都會進行判斷是否觸發(fā)compact
?定期檢查線程
周期性檢查是否需要進行compaction操作,由參數(shù):
hbase.server.thread,wakefrequency決定,默認值是10000
milIseconds
?majorcompact大合并
O合并Store中所有的IIFi1e為一個HFile
這個過程有刪除標記的數(shù)據(jù)會被真正移除,同時超過單元格
maxVersion的版本記錄也會被刪除。合并頻率比較低,默認7天執(zhí)行
一次,并且性能消耗非常大,建議生產關閉(設置為0),在應用空閑
時間手動觸發(fā)。一般可以是手動控制進行合并,防止出現(xiàn)在業(yè)務高峰
期。
?majorcompaction觸發(fā)時間條件
。一默認值為7天進行一次大合并,一>
<property>
<name>hbase.hregion.majorcompaction</name>
<value>604800000</value>
</property>
?手動觸發(fā)
##使用majorcompact命令
major_compacttabieName
第4節(jié)Region拆分機制
Region中存儲的是大量的rowkey數(shù)據(jù),當Region中的數(shù)據(jù)條數(shù)過多
的時候,直接影響查詢效率.當Region過大的時候.HBase會拆分
Region,這也是Hbase的一個優(yōu)點
4.1拆分策略
HBase的RegionSplit策略一共有以下幾種:
1)ConstantSizeRegionSplitPolicy
0.94版本前默認切分策略
當region大小大于某個閾值(hbase.hregion.max.filesize=10G)之后就會觸發(fā)
切分,一個region等分為2個region。
但是在生產線上這種切分策略卻有相當大的弊端:切分策略對于大表和小表沒
有明顯的區(qū)分。閾值(hbase.hregion.max.filesize)設置較大對大表比較友
好,但是小表就有可能不會觸發(fā)分裂,極端情況下可能就1個,這對業(yè)務來說
并不是什么好事。如果設置較小則對小表友好,但一個大表就會在整個集群產
生大量的region,這對于集群的管理、資源使用、failover來說都不是一件好
事。
2)Increasing!oUpperBoundRegionSplitPolicy
0.94版本?2.0版本默認切分策略
切分策略稍微有點復雜,總體看和ConstantSizeRegionSplitPolicy思路相
同,一個region大小大于設置閾值就會觸發(fā)切分。但是這個閾值并不像
ConstantSizeRegionSplitPolicy是一個固定的值,而是會在一定條件下不斷
調整,調整規(guī)則和region所屬表在當前regionserver上的region個數(shù)有關
系.
regionsplit的計算公式是:
regioncount*3*128M*2,當region達到該size的時候進行split
例如:
第一次split:1*3*256=256MB
第二次split:2*3*256=2048MB
第三次split:3'3*2566912MB
第四次split:4"3*25616384MB>10GB,因此取較小的值10GB
后面每次split的size都是10GB了
3)SteppingSplitPolicy
2.0版本默認切分策略
這種切分策略的切分閾值又發(fā)生了變化,相比
IncreasingToUpperBoundRegionSplitPolicy簡單了一些,依然和待分裂
region所屬表在當前
regionserver上的region個數(shù)有關系,如果region個數(shù)等于1,
切分閾值為flushsize*2,否則為MaxRegionFileSize。
這種切分策略對于大集群中的大表、小表會比
IncreasingToUpperBoundRegionSplitPolicy更加友好,小表不會再產生大量
的小region,而是適可而止。
4)KeyPrefixRegionSplitPo1icy
根據(jù)rowKey的前綴對數(shù)據(jù)進行分組,這里是指定rowKey的前多少位作為前
綴,比如rowKey都是16位的,指定前5位是前綴,那么前5位相同的rowKey
在進行regionsplit的時候會分到相同的region中。
5)DelimitedKeyPrefixRegionSplitPolicy
保證相同前綴的數(shù)據(jù)在同一個region中,例如rowKey的格式為:
userid_eventtype_eventid,指定的delimiter為_,則split的的時候會確
保userid相同的數(shù)據(jù)在同一個region中。
6)DisabledRegionSplitPolicy
不啟用自動拆分,需要指定手動拆分
4.2RegionSplitPolicy的應用
Region拆分策略可以全局統(tǒng)一配置,也可以為單獨的表指定拆分策
略。
1)通過hbase-site.xml全局統(tǒng)一配置(對hbase所有表生效)
<property>
<name>hbase.regionserver,region,split.policy</name>
<value>org.apache,hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPo
licy</value>
</property>
2)通過JavaAPI為單獨的表指定Region拆分策略
HTab1eDescriptortableDesc=newHTableDescriptor(^testl'1);
tableDesc.setValue(HTableDescriptor.SPLIT_POLICY,
IncreasingToUpperBoundRegionSplitPolicy.class.getName());
tableDesc.addFamily(newHCo]umnDescriptor(Bytes.toBytes(Mcf1M)));
admin.createTable(tableDesc);
3)通過HBaseShell為單個表指定Region拆分策略
hbase>create,test2,,{METADATA=>{fSPLIT_POLICY(=>
1org.apache,hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSpl
itPolicy1}},{NAME=>*cfl
第5節(jié)HBase表的預分區(qū)(region)
5.1為何要預分區(qū)
當一個table剛被創(chuàng)建的時候,Hbase默認的分配一個region給
table。也就是說這個時候,所有的讀寫請求都會訪問到同一個
regionServer的同一個region中,這個時候就達不到負載均衡的效果
了,集群中的其他regionServer就可能會處于比較空閑的狀態(tài)。解決
這個問題可以用pre-splitting,在創(chuàng)建table的時候就配置好,生成
多個regiono
?增加數(shù)據(jù)讀寫效率
?負載均衡,防止數(shù)據(jù)傾斜
?方便集群容災調度region
每一個region維護著startRow與endRowKey,如果加入的數(shù)據(jù)符合某
個region維護的rowKey范圍,則該數(shù)據(jù)交給這個region維
5.2手動指定預分區(qū)
create'person','infol','info2',SPLITS=>['1000','2000','3000']
也可以把分區(qū)規(guī)則創(chuàng)建于文件中
vimsplit,txt
文件內容
aaa
bbb
ccc
ddd
執(zhí)行
createfstudent1!info*,SPLITSFILE=>Vroot/hbase/split.txt
第6節(jié)Region合并
6.1Region合并說明
Region的合并不是為了性能,而是出于維護的目的。
6.2如何進行Region合并
通過Merge類冷合并Region
?需要先關閉hbase集群
需求:需要把student表中的2個region數(shù)據(jù)進行合并:
?student,,1593244870695.10c2df60e567e73523a633f20866b4b5.
?student,1000,1593244870695.0a4c3ff30a98f79ff6cle4cc927b3d0d
這里通過org.apache,hadoop.hbase.util.Merge類來實現(xiàn),不需要進
入hbaseshell,直接執(zhí)行(需要先關閉hbase集群):
hbaseorg.apache,hadoop.hbase.util.Mergestudent\
student,,1595256696737.fc3eff4765709e66a8524d3c3ab42d59.\
student,aaa,1595256696737.ld53d6clce0clbed269bl6b6514131d0.
通過online_merge熱合并Region
不需要關閉hbase集群,在線進行合并
與冷合并不同的是,onlinemerge的傳參是Region的hash值,而Region的
hash值就是Region名稱的最后那段在兩個.之間的字符串部分。
需求:需要把lagou_s表中的2個region數(shù)據(jù)進行合并:
student,,1587392159085.9ca8689901008946793b8d5fa5898e06.\
student,aaa,1587392159085.601d5741608cedb677634f8f7257e000.
需要進入hbaseshell:
merge_region
'c8bc666507d9e45523aebaffa88ffdd6','02a9dfdf6ff42ae9f0524a3d8f4c7777'
成功后觀察界面
第三部分HBaseAPI應用和優(yōu)化
第1節(jié)HBaseAPI客戶端操作
創(chuàng)建Maven工程,添加依賴
<dependencies>
<dopendency>
<groupld>org.apache.hbase</groupld>
<artifactld>hbase-client</artifactld>
<version>l.3.K/version>
</dependency>
<dependency>
<groupld>junit</groupld>
<artifactld>junit</artifactld>
<version>4.12</version>
<scope>test</scope>
〈/dependency〉
<dopendency>
<groupld>org.testng</groupld>
<artifactld>testng</artifactld>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
</dependencies>
初始化及釋放資源方法
packagecom.1agou.hbase.client;
importorg.apache,hadoop.conf.Configuration;
importorg.apache,hadoop.hbase.*;
importorg.apache,hadoop.hbase.client.*;
importorg.apache,hadoop.hbase.util.Bytes;
importorg.junit.After;
importorg.junit.Before;
importjava.io.lOException;
publicclassHbaseClientDemo{
Configurationconf=null;
Connectionconn=null;
?Before
publicvoidinit()throwslOException{
〃獲取一個配置文件對象
conf=HBaseConfiguration.create();
conf,set("hbase.zookeeper,quorumHlinuxl21,linuxl22M);
conf,set("hbase.zookeeper,property.clientPort","2181”);
〃通過conf獲取到hbase集群的連接
conn=ConnectionFactory.createConnection(conf);
)
〃釋放連接
?After
publicvoidrealseO{
if(conn!=null){
try{
conn,close();
)catch(lOExceptione){
e.printStackTrace();
)
)
)
}
創(chuàng)建表:
〃創(chuàng)建一張hbase表
?Test
publicvoidcreateTableOthrowslOException{
〃獲取HbaseAdmin對象用來創(chuàng)建表
IIBaseAdminadmin=(HBaseAdmin)conn.getAdminO;
〃創(chuàng)建Htabledesc描述器,表描述器
finalHTableDescriptorworker=new
HTableDescriptor(TableName.valueOf(Mworker°));
〃指定列族
worker.addFamily(newIIColumnDescriptor(Minfo**));
admin.createTable(worker);
System,out.printIn(Hworker表創(chuàng)建成功!!");
}
插入數(shù)據(jù)
〃插入一條數(shù)據(jù)
?Test
publicvoidputDataOthrowslOException{
〃需要獲取一個table對象
finalTableworker=conn.getTable(TableName.valueOf("worker**));
〃準備put對象
finalPutput=newPut(Bytes.toBytes("110"));//指定rowkey
put.addColumn(Bytes.toBytes(Hinfo,r),Bytes.toBytes(naddr,f),
Bytes.toBytes(,fbeijingM));
〃插入數(shù)據(jù),參數(shù)類型是put
worker,put(put);
〃準備list〈puts〉,可以執(zhí)行批量插入
〃關閉table對象
worker,close();
System,out.printin("插入數(shù)據(jù)到worker表成功!!w);
}
刪除數(shù)據(jù):
//刪除一條數(shù)據(jù)
?Test
publicvoiddeleteDataOthrowslOException{
〃需要獲取一個table對象
finalTableworker=conn.getTable(TableName.valueOf(^worker**));
〃準備delete對象,傳入rowkey
finalDeletedelete=newDelete(Bytes.toBytes(^^110^^));
〃執(zhí)行刪除
worker,delete(delete);
〃關閉table對象
worker,close0;
System,out.printIn("刪除數(shù)據(jù)成功!!");
查詢某個列族數(shù)據(jù)
〃查詢數(shù)據(jù)
?Test
publicvoidgetDataOthrowslOException(
〃準備table對象
finalTableworker=conn.getTable(TabieName.valueOf(,fworkerM));
〃準備get對象,傳入rowkey
finalGetget=newGet(Bytes.toBytes(,,110n));
〃指定查詢某個列族或者列
get.addFamily(Bytes.toBytes("info"));
〃執(zhí)行查詢
finalResultresult=worker,get(get);
〃獲取到result中所有cell對象
finalCell[]cells=result.rawCells();
〃遍歷打印
for(Cellcell:cells){
finalStringrowkey=Bytes.toString(CellUtil.cloneRow(cell));
finalStringf=Bytes.toString(CellUtil.cloneFamily(cell));
finalStringcolumn=
Bytes.toString(CellUtil.cloneQualifier(cell));
finalStringvalue=Bytes.toString(CellUtil.cloneValue(cel1));
System.out.println(Mrowkey->"+rowkey+”-;cf->"+f+"-
column—>"+column+“-;value->n+value);
}
worker,close();
通過Scan全表掃描
〃全表掃描
?Test
publicvoidscanDataOthrowslOException{
〃準備table對象
finalTableworkerconn.getTable(TableName.valueOf(^worker"));
〃準備scan對象
finalScanscan=newScan();
〃執(zhí)行掃描
finalResultScannerresultScanner=worker.getScanner(scan);
for(Resultresult:resultScanner){
〃獲取到result中所有cell對象
finalCell[]cells=result.rawCells();
〃遍歷打印
for(Cellcell:cells){
finalStringrowkey=Bytes.toString(CellUtil.cloneRow(cel1));
finalStringf=Bytes.toString(CellUtil.cloneFamily(cell));
finalStringcolumn=
Bytes.toString(Cell(Jtil.cloneQualifier(cell));
finalStringvalue=Bytes.toString(CellUti1.cloneValue(cel1));
System,out.printin(Mrowkey-->"+rowkey+”--;cf-->"+f+
column--->"+column+0-;value—>M+value);
)
}
worker.closeO;
}
log4j:WARNNoappenderscouldbefoundforlogger(org.apache.hadoop.security.Groups)
log4j:WARNPleaseinitializethelog4jsystemproperly.
Iog4j:WARNSeehttD://logging?aD/log4j/I?2/faa.html#noconfigformoreinfo.
rowkey-->110--;cf-->info—;column—>addr--;value-->beijing
通過startRowKey和endRo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030電熱板行業(yè)投資機會及風險投資運作模式研究報告
- 2025-2030電動車用電動機行業(yè)發(fā)展分析及前景趨勢與投資研究報告
- 2025-2030生物制藥行業(yè)風險投資發(fā)展分析及投資融資策略研究報告
- 2025-2030瓶裝水產品行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 2025-2030玻璃彩繪漆行業(yè)市場深度調研及前景趨勢與投資研究報告
- 2025-2030特色蛋糕市場發(fā)展分析及行業(yè)投資戰(zhàn)略研究報告
- 2025-2030熱鍍鋅圓鋼市場發(fā)展現(xiàn)狀分析及行業(yè)投資戰(zhàn)略研究報告
- 2025-2030港口設備行業(yè)發(fā)展分析及投資價值研究咨詢報告
- 2025-2030消費金融產業(yè)政府戰(zhàn)略管理與區(qū)域發(fā)展戰(zhàn)略研究咨詢報告
- 2025-2030汽車整車產業(yè)規(guī)劃專項研究報告
- pet薄膜生產工藝
- 中學生如何預防網(wǎng)絡詐騙
- 市集活動策劃方案
- 學校食堂設備安全操作規(guī)程
- 橋梁美學與景觀設計
- 2023屆上海市虹口區(qū)高三年級上冊一模英語試題(解析版)
- 液壓式打包機安全操作規(guī)程范本
- (新版)首席質量官認證考試復習題庫-上(單選題匯總)
- 建筑施工中小型施工機具驗收記錄表
- 4.3 TIA博途軟件的調試
- 新時代背景下婦產科課程思政的構建與探索
評論
0/150
提交評論