版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3.4.2HBase简介,数据模型,架构,安
装,shell操作,原理深入(读写流程),
机制(刷写,合并,拆分,),API操作,协
处理器,RK设计原贝!],热点,二级索引,
布隆过滤器
目录
第一部分初识HBase
第1节HBase简介
1.1HBase是什么
1.2HBase的特点
1.3HBase的应用
第2节IIBase数据模型
HBase逻辑架构
HBase物理存储
第3节HBase整体架构
Zookeeper
IMaster(Master)
HRegionServer(RegionServer)
Region
第4节HBase集群安装部署
第5节HBaseshell基本操作
3、查看表list
4、创建表操作create
5、添加数据操作put
6、查询数据get
6.1通过rowkey进行查询
6.2查看rowkey下面的某个列族的信息
6.3查看rowkey指定列族指定字段的值
6.4查看rowkey指定多个列族的信息
6.5指定rowkey与列值查询
6.6指定rowkey与列值模糊查询
6.7查询所有数据scan
6.8列族查询scan
6.9指定多个列族与按照数据值模糊查询
6.10rowkey的范围值查询scan(非常重要)
6.11指定rowkey模糊查询
7、更新数据put
7.1更新数据值
8、删除数据和表delete
8.1指定rowkey以及列名进行删除
8.2指定rowkey,列名以及字段值进行删除
8.3删除列族alter
8.4清空表数据truncate
8.5删除表disable+drop
第二部分IIBase原理深入
第1节HBase读数据流程
第2节HBase写数据流程
第3节HBase的flush(刷写)及compact(合并)机制
Flush机制
阻塞机制
Compact合并机制
第4节Region拆分机制
4.1拆分策略
1)ConstantSizeRegionSplitPolicy
2)IncreasingToUpperBoundRegionSplitPolicy
3)SteppingSplitPolicy
4)KeyPrefixRegionSplitPolicy
5)DelimitedKeyPrefixRegionSplitPolicy
6)DisabledRegionSplitPolicy
4.2RegionSplitPolicy的应用
1)通过hbase-site.xml全局统一配置(对hbase所有表生
效)
2)通过JavaAPI为单独的表指定Region拆分策略
3)通过HBaseShell为单个表指定Region拆分策略
第5节HBase表的预分区(region)
5.1为何要预分区
第6节Region合并
6.1Region合并说明
6.2如何进行Region合并
通过Merge类冷合并Region
通过online_merge热合并Region
第三部分HBaseAPI应用和优化
第1节HBaseAPI客户端操作
初始化及释放资源方法
创建表:
插入数据
删除数据:
查询某个列族数据
通过Scan全表扫描
通过startRowKey和endRowKey进行扫描
第2节Hbase协处理器
2.1协处理器概述
2.2协处理器类型
Observer
Endpoint
Endpoint常□用途
2.3协处理器Observer案例
第4节HBase表的RowKey设计
RowKey的基本介绍
RowKey□度原则
RowKey散列原则
RowKey唯一原则
RowKey排序原则
第5节HBase表的热点
5.1什么是热点
5.2热点的解决方案
第6节HBase的二级索引
第7节布隆过滤器在hbase的应用
布隆过滤器应用
布隆过滤器的原理
BloomFilter案例
第一部分初识HBase
第1节HBase简介
1.1HBase是什么
HBase基于Google的BigTable论文而来,是一个分布式海量列式非
关系型数据库系统,可以提供超大规模数据集的实时随机读写。
接下来,通过一个场景初步认识HBase列存储
如下MySQL存储机制,空值字段浪费存储空间
如果是列存储的话,可以这么玩
rowkey:1name:小明
rowkey:1age:23
rowkey:1job:学生
rowkey:2name:小红
rowkey:2salary:lOw
rowkey:2job:律师
列存储的优点:
1)减少存储空间占用。
2)支持好多列
1.2HBase的特点
・海量存储:底层基于HDFS存储海量数据
・列式存储:HBase表的数据是基于列族进行存储的,一个列族包含
若干列
・极易扩展:底层依赖HDFS,当磁盘空间不足的时候,只需要动态增
加DataNode服务节点就可以
・高并发:支持高并发的读写请求
・稀疏:稀疏主要是针对HBase列的灵活性,在列族中,你可以指定
任意多的列,在列数据为空的情况下,是不会占用存储空间的。
・数据的多版本:HBase表中的数据可以有多个版本值,默认情况下
是根据版本号去区分,版本号就是插入数据的时间戳
・数据类型单一:所有的数据在HBase中是以字节数组进行存储
1.3HBase的应用
・交通方面:船舶GPS信息,每天有上千万左右的数据存储。
・金融方面:消费信息、贷款信息、信用卡还款信息等
・电商方面:电商网站的交易信息、物流信息、游览信息等
・电信方面:通话信息
总结:HBase适合海量明细数据的存储,并且后期需要有很好的查询性
能(单表超千万、上亿,且并发要求高)
第2节HBase数据模型
HBase的数据也是以表(有行有列)的形式存储
HBase逻辑架构
HBase物理存储
\\
概描
念述
命
na名
me空
sp间
ac类
e似
于
关
系
型
数
据
库
的
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
表
是
用
户
默
认
使
用
的
命
名
空
间
个
表
可
以
自
由
选
择
是
否
有
命
名
空
间
如
果
创
建
表
的
时
候
加
上
了
命
名
空
间
后
这
个
表
名
字
以
作
为
区
分
类
似
于
关
%系
bl型
e数
据
库
的
表
概
念
不
同
的
是
HB
as
e
定
义
表
时
□
声
要
声
明
列
族
即
可
9
数
据
属
性
比
如
超
时
时
间
(
TT
L
)
9
压
箝
算
法
(
CO
MP
RE
SS
10
\
)
等
9
都
在
列
族
的
定
义
中
定
义
»
不
S
要
声
明
具
体
的
列
HB
as
e
表
中
的
Ro
每
w
行
(
_数
据
行
都
逻由
辑_
数
个
据
Ro
)
wK
ey
和
多
个
Co
lu
mn
(
列
)
组
成
个
行
包
含
T
多
个
列
这
些
列
通
过
列
族
来
分
关
»
行
中
的
数
据-
所
属
列
族
只
能
从
该
表
所
定
义
的
列
族
中
选
取
»
不
能
定
义
这
个
表
中
不
存
在
的
列
族
»
否
则
报
错
No
Su
ch
Co
lu
mn
Fa
mi
ly
Ex
ce
Pt
io
n
Ro
Ro
wk
wK
ey
ey
由
(
用
每
户
行
指
数
定
据
的
主
键串
)不
重
复
的
字
符
串
定
义
1
是
行
的
唯
标
识
I
数
据
是
按
照
Ro
wK
ey
的
字
典
顺
序
存
储
的
并
且
查
洵
数
据
时
只
能
根
-据
Ro
wK
ey
进
行
检
索
所
以
Ro
wK
ey
的
设
计
十
分
重
要
O
如
果
使
用
T
之
前
已
经
定
义
的
Ro
wK
ey
»
那
么
会
将
之
前
的
数
据
更
新
掉
列
族
是
多
个
列
的
集
Co
lu合
mn
Fa
mi个
ly列
(族
列郁
族以
,[苗
态
地
灵
活
定
义
多
个
列
O
表
的
相
关
属
性
大
部
分
都
定
义
在
列
族
上
»
同
个
表
里
的
不
同
列
族
可
以
有
完
全
不
同
的
属
性
配
置
1
但
是
同
个
列
族
内
的
所
有
列
都
会
有
相
同
的
属
性
O
列
族
存
在
的
意
义
是
HB
as
e
会
把
相
同
列
族
的
列
尽
放
在
同
台
机
器
上
所
以
说
如
果
想
让
某
几
个
列
被
放
到
起
*
你
就
给
他
们
定
义
相
同
的
列
族
o
lib
as
e
中
的
Co列
lu是
mn可
Qu以
al随
if意
ie定
r义
(
的
列
)
个
行
中
的
列
不
限
名
字
不
限
数
量
1
只
限
定
列
族
O
因
此
列
必
须
依
赖
于
列
族
存
在
I
列
的
名
称
前
必
须
带
着
其
所
属
的
列
族
!
例
如
in
fo
na
me
in
fo
ag
用
Ti于
me标
st识
am数
P据
(的
时不
间同
戳版
-A
本
版(
本
ve
)rs
io
n
)
o
时
间
戳
默
认
由
系
统
指
定
9
也
可
以
由
用
户
显
式
指
定
在
读
取
单
元
格
的
数
据
时
»
版
本
可
以
省
略
»
如
果
不
指
定
rib
as
e
默
认
会
获
取
最
后
个
版
本
的
数
据
返
回
个
11
列
中
可
以
存
储
多
个
版
本
的
数
据
O
而
每
个
版
本
就
称
为
个
单
元
格
(
Ce
11
)
Re
gi
on
由
Re
gi
个
on
表
(
的
表
若
的
干
分
行
区
)组
成
I
在
Re
gi
on
中
行
的
排
序
按
照
行
键
(
ro
wk
ey
)
字
典
排
序
O
Re
gi
on
不
能
跨
Re
gi
on
Se
ve
r
»
且
当
数
据
量
大
的
时
候
»
HB
as
e
会
拆
分
Re
gi
on
第3节HBase整体架构
Zookeeper
实现了HMaster的高可用
«保存了HBase的元数据信息,是所有HBase表的寻址入口
对HMaster和IIRegionServer实现了监控
HMaster(Master)
为IIRegionServer分配Region
・维护整个集群的负载均衡
维护集群的元数据信息
发现失效的Region,并将失效的Region分配到正常的HRegionServer
上
HRegionServer(RegionServer)
负责管理Region
接受客户端的读写数据请求
切分在运行过程中变大的Region
Region
每个HRegion由多个Store构成,
每个Store保存一个列族(ColumnsFamily),表有几个列族,则有
几个Store,
每个Store由一个MemStore和多个StoreFile组成,MemStore是
Store在内存中的内容,写到文件后就是StoreFile。StoreFile底层
是以HFile的格式保存。
第4节HBase集群安装部署
(1)下载安装包
http://archive,apache,org/dist/hbase/1.3.1/
hbase-1.3.l-bin.tar.gz
(2)规划安装目录
/opt/lagou/servers/
(3)上传安装包到服务器
(4)解压安装包到指定的规划目录
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环境变量
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节点
linuxl21
linuxl22
linuxl23
hbase的conf目录下创建文件backup-masters(StandbyMaster)
linuxl22
(6)配置hbase的环境变量
exportHBASEHOME=/opt/lagou/servers/hbase-1.3.1
exportPATH=$PATH:$HBASEHOME/bin
(7)分发hbase目录和环境变量到其他节点
rsync-script/opt./lagou/servers/hbase-1.3.1/
rsync-script/etc/profile
(8)让所有节点的hbase环境变量生效
在所有节点执行source/etc/profile
HBase集群的启动和停止
前提条件:先启动hadoop和zk集群
启动HBase:start-hbase.sh
停止HBase:stop-hbase.sh
HBase集群的web管理界面
启动好DBase集群之后,可以访问地址:HMaster的主机名:16010
第5节HBaseshell基本操作
1、进入Hbase客户端命令操作界面
hbaseshell
2、查看帮助命令
hbase(main):001:0>help
3、查看表list
hbase(main):006:0>list
4、创建表操作create
创建一张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是指此单元格内的数据可以保留最近的3个版本
5、添加数据操作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、查询数据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查询所有数据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模式会返回包括已添加删除标
记但是未实际删除的数据
##VERSIONS指定查询的最大版本数
6.9指定多个列族与按照数据值模糊查询
查询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)的数据
(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、更新数据put
更新操作同插入操作一模一样,只不过有数据就更新,没数据就添加
7.1更新数据值
把lagou表中rowkey为rkl的base_info列族下的列name修改为
liang
hbase(main):030:0>put'lagou','rkl','base_info:name','liang'
8、删除数据和表delete
8.1指定rowkey以及列名进行删除
删除lagou表rowkey为rkl,列标示符为base_info:name的数据
hbase(main):002:0>delete*lagou1,‘rkl',1baseinfo:name,
8.2指定rowkey,列名以及字段值进行删除
删除lagou表rowkey为rkl,列标示符为base_info:name的数据
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清空表数据truncate
删除lagou表数据
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节HBase读数据流程
HBase读操作
1)首先从zk找到meta表的region位置,然后读取meta表中的数
据,meta表中存储了用户表的region信息
2)根据要查询的namespace、表名和rowkey信息。找到写入数据对应
的region信息
3)找到这个region对应的regionServer,然后发送请求
4)查找对应的region
5)先从memstore查找数据,如果没有,再从BlockCache上读取
HBase上Regionserver的内存分为两个部分
•一部分作为Memstore,主要用来写;
•另夕I'一部分作为BlockCache,主要用于读数据;
6)如果BlockCache中也没有找到,再到StoreFile上进行读取
从storeFile中读取到数据之后,不是直接把结果数据返回给客户
端,而是把数据先写入到BlockCache中,目的是为了加快后续的查
询;然后在返回结果给客户端。
第2节HBase写数据流程
HBase写操作
1)首先从zk找到meta表的region位置,然后读取meta表中的数
据,meta表中存储了用户表的region信息
2)根据namespace、表名和rowkey信息。找到写入数据对应的
region信息
3)找到这个region对应的regionServer,然后发送请求
4)把数据分别写到HLog(writeaheadlog)和memstore各一份
5)memstore达到阈值后把数据刷到磁盘,生成storeFile文件
6)删除HLog中的历史数据
第3节HBase的flush(刷写)及compact(合并)机
制
Flush机制
(1)当memstore的大小超过这个值的时候,会flush到磁盘,默认为
128M
<property>
<name>hbase.hregion.memstore,flush.size</name>
<value>134217728</value>
</property>
(2)当memstore中的数据时间超过1小时,会flush到磁盘
<property>
<name>hbase.regionserver,optionalcacheflushinterval</name>
<value>3600000</value>
</property>
(3)UregionServer的全局memstore的大小,超过该大小会触发
flush到磁盘的操作,默认是堆大小的40%
<property>
<name>hbase.regionserver,global.memstore.size</name>
<value>0.4</value>
</property>
(4)手动flush
flushtabieName
阻塞机制
以上介绍的是Store中memstore数据刷写磁盘的标准,但是Hbase中
是周期性的检查是否满足以上标准满足则进行刷写,但是如果在下次
检查到来之前,数据疯狂写入Memstore中,会出现什么问题呢?
会触发阻塞机制,此时无法写入数据到呢mstore,数据无法写入
Hbase集群。
■memstore中数据达到512MB
计算公式:
hbase.hregion.memstore,flush.size*hbase.hregion.memstore..bio
ck.multiplier
hbase.hregion.memstore,flush.size刷写的阀值,默认是
134217728,即128MB。
hbase.hregion.memstore,block,multiplier一个倍数,默认是4。
•RegionServer全部memstore达到规定值
hbase.regionserver,global,memstore,size,lower,limit是0.95,
hbase.regionserver,global,memstore,size是0.4,
堆内存总共是16G,
触发刷写的阈值是:6.08GB触发阻塞的阈值是:6.4GB
Compact合并机制
在hbase中主要存在两种类型的compac合并
•minorcompact小合并
O在将Store中多个HFile(StoreFile)合并为一个HFile
这个过程中,删除和更新的数据仅仅只是做了标记,并没有物理移除,这种合
并的触发频率很高。
Ominorcompact文件选择标准由以下几个参数共同决定:
。一待合并文件数据必须大于等于下面这个值一>
<property>
<name>hbase.hstore.compaction.min</name>
<value>3</value>
</property>
<!一待合并文件数据必须小于等于下面这个值一〉
<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>
触发条件
♦memstoreflush
在进行memstoreflush前后都会进行判断是否触发compact
♦定期检查线程
周期性检查是否需要进行compaction操作,由参数:
hbase.server.thread,wakefrequency决定,默认值是10000
milIseconds
•majorcompact大合并
O合并Store中所有的IIFi1e为一个HFile
这个过程有删除标记的数据会被真正移除,同时超过单元格
maxVersion的版本记录也会被删除。合并频率比较低,默认7天执行
一次,并且性能消耗非常大,建议生产关闭(设置为0),在应用空闲
时间手动触发。一般可以是手动控制进行合并,防止出现在业务高峰
期。
♦majorcompaction触发时间条件
。一默认值为7天进行一次大合并,一>
<property>
<name>hbase.hregion.majorcompaction</name>
<value>604800000</value>
</property>
♦手动触发
##使用majorcompact命令
major_compacttabieName
第4节Region拆分机制
Region中存储的是大量的rowkey数据,当Region中的数据条数过多
的时候,直接影响查询效率.当Region过大的时候.HBase会拆分
Region,这也是Hbase的一个优点
4.1拆分策略
HBase的RegionSplit策略一共有以下几种:
1)ConstantSizeRegionSplitPolicy
0.94版本前默认切分策略
当region大小大于某个阈值(hbase.hregion.max.filesize=10G)之后就会触发
切分,一个region等分为2个region。
但是在生产线上这种切分策略却有相当大的弊端:切分策略对于大表和小表没
有明显的区分。阈值(hbase.hregion.max.filesize)设置较大对大表比较友
好,但是小表就有可能不会触发分裂,极端情况下可能就1个,这对业务来说
并不是什么好事。如果设置较小则对小表友好,但一个大表就会在整个集群产
生大量的region,这对于集群的管理、资源使用、failover来说都不是一件好
事。
2)Increasing!oUpperBoundRegionSplitPolicy
0.94版本〜2.0版本默认切分策略
切分策略稍微有点复杂,总体看和ConstantSizeRegionSplitPolicy思路相
同,一个region大小大于设置阈值就会触发切分。但是这个阈值并不像
ConstantSizeRegionSplitPolicy是一个固定的值,而是会在一定条件下不断
调整,调整规则和region所属表在当前regionserver上的region个数有关
系.
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版本默认切分策略
这种切分策略的切分阈值又发生了变化,相比
IncreasingToUpperBoundRegionSplitPolicy简单了一些,依然和待分裂
region所属表在当前
regionserver上的region个数有关系,如果region个数等于1,
切分阈值为flushsize*2,否则为MaxRegionFileSize。
这种切分策略对于大集群中的大表、小表会比
IncreasingToUpperBoundRegionSplitPolicy更加友好,小表不会再产生大量
的小region,而是适可而止。
4)KeyPrefixRegionSplitPo1icy
根据rowKey的前缀对数据进行分组,这里是指定rowKey的前多少位作为前
缀,比如rowKey都是16位的,指定前5位是前缀,那么前5位相同的rowKey
在进行regionsplit的时候会分到相同的region中。
5)DelimitedKeyPrefixRegionSplitPolicy
保证相同前缀的数据在同一个region中,例如rowKey的格式为:
userid_eventtype_eventid,指定的delimiter为_,则split的的时候会确
保userid相同的数据在同一个region中。
6)DisabledRegionSplitPolicy
不启用自动拆分,需要指定手动拆分
4.2RegionSplitPolicy的应用
Region拆分策略可以全局统一配置,也可以为单独的表指定拆分策
略。
1)通过hbase-site.xml全局统一配置(对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节HBase表的预分区(region)
5.1为何要预分区
当一个table刚被创建的时候,Hbase默认的分配一个region给
table。也就是说这个时候,所有的读写请求都会访问到同一个
regionServer的同一个region中,这个时候就达不到负载均衡的效果
了,集群中的其他regionServer就可能会处于比较空闲的状态。解决
这个问题可以用pre-splitting,在创建table的时候就配置好,生成
多个regiono
・增加数据读写效率
・负载均衡,防止数据倾斜
•方便集群容灾调度region
每一个region维护着startRow与endRowKey,如果加入的数据符合某
个region维护的rowKey范围,则该数据交给这个region维
5.2手动指定预分区
create'person','infol','info2',SPLITS=>['1000','2000','3000']
也可以把分区规则创建于文件中
vimsplit,txt
文件内容
aaa
bbb
ccc
ddd
执行
createfstudent1!info*,SPLITSFILE=>Vroot/hbase/split.txt
第6节Region合并
6.1Region合并说明
Region的合并不是为了性能,而是出于维护的目的。
6.2如何进行Region合并
通过Merge类冷合并Region
•需要先关闭hbase集群
需求:需要把student表中的2个region数据进行合并:
・student,,1593244870695.10c2df60e567e73523a633f20866b4b5.
・student,1000,1593244870695.0a4c3ff30a98f79ff6cle4cc927b3d0d
这里通过org.apache,hadoop.hbase.util.Merge类来实现,不需要进
入hbaseshell,直接执行(需要先关闭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数据进行合并:
student,,1587392159085.9ca8689901008946793b8d5fa5898e06.\
student,aaa,1587392159085.601d5741608cedb677634f8f7257e000.
需要进入hbaseshell:
merge_region
'c8bc666507d9e45523aebaffa88ffdd6','02a9dfdf6ff42ae9f0524a3d8f4c7777'
成功后观察界面
第三部分HBaseAPI应用和优化
第1节HBaseAPI客户端操作
创建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();
)
)
)
}
创建表:
〃创建一张hbase表
©Test
publicvoidcreateTableOthrowslOException{
〃获取HbaseAdmin对象用来创建表
IIBaseAdminadmin=(HBaseAdmin)conn.getAdminO;
〃创建Htabledesc描述器,表描述器
finalHTableDescriptorworker=new
HTableDescriptor(TableName.valueOf(Mworker°));
〃指定列族
worker.addFamily(newIIColumnDescriptor(Minfo**));
admin.createTable(worker);
System,out.printIn(Hworker表创建成功!!");
}
插入数据
〃插入一条数据
©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));
〃插入数据,参数类型是put
worker,put(put);
〃准备list〈puts〉,可以执行批量插入
〃关闭table对象
worker,close();
System,out.printin("插入数据到worker表成功!!w);
}
删除数据:
//删除一条数据
©Test
publicvoiddeleteDataOthrowslOException{
〃需要获取一个table对象
finalTableworker=conn.getTable(TableName.valueOf(^worker**));
〃准备delete对象,传入rowkey
finalDeletedelete=newDelete(Bytes.toBytes(^^110^^));
〃执行删除
worker,delete(delete);
〃关闭table对象
worker,close0;
System,out.printIn("删除数据成功!!");
查询某个列族数据
〃查询数据
©Test
publicvoidgetDataOthrowslOException(
〃准备table对象
finalTableworker=conn.getTable(TabieName.valueOf(,fworkerM));
〃准备get对象,传入rowkey
finalGetget=newGet(Bytes.toBytes(,,110n));
〃指定查询某个列族或者列
get.addFamily(Bytes.toBytes("info"));
〃执行查询
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();
〃执行扫描
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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026一例梅花针治疗妊娠剧吐的个案护理
- 信号设备组调工操作评估考核试卷含答案
- 织布上轴工操作知识能力考核试卷含答案
- 通信固定终端设备装调工创新实践能力考核试卷含答案
- 26年诱导期随访频率优化要点
- 医学26年:嗜酸粒细胞增多症诊疗 查房课件
- 智慧水利未来-智慧水利共创新章程
- 2019年高中工作队驻村扶贫工作总结
- 高中历史-选修四中外历史人物评说大唐盛世的奠基人唐太宗
- 医学26年:PET-MRI神经应用解读 查房课件
- 湖南 2026 政府采购评审专家续聘考试(3) 真题
- 2026年pcb维修主管测试题及答案
- 2025年芯片测试岗笔试题目及答案
- 2026年无人机植保技术考试题库及答案
- 2026-2030中国摩洛哥坚果油行业市场发展分析及竞争格局与投资前景研究报告
- 电梯施工临时用电安全方案
- TSG 08-2026 特种设备使用管理规则
- GB/T 32381-2015全地形车辆轮胎
- 最全品质管理手法-第8章 其他方法简介课件
- 股骨头坏死的诊断与治疗及预防
- CNAS-CV01-2022 合格评定审定与核查机构通用原则和要求
评论
0/150
提交评论