05 Hbase技术整理及应用Word格式.docx
《05 Hbase技术整理及应用Word格式.docx》由会员分享,可在线阅读,更多相关《05 Hbase技术整理及应用Word格式.docx(14页珍藏版)》请在冰点文库上搜索。
![05 Hbase技术整理及应用Word格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/1/4486e891-8455-405d-9c55-0aed3e4a18fe/4486e891-8455-405d-9c55-0aed3e4a18fe1.gif)
t1
r2
t5
content=每天…
t4
Ø
RowKey:
行键,Table的主键,Table中的记录按照RowKey排序
Timestamp:
时间戳,每次数据操作对应的时间戳,可以看作是数据的versionnumber
ColumnFamily:
列簇,Table在水平方向有一个或者多个ColumnFamily组成,一个ColumnFamily中可以由任意多个Column组成,即ColumnFamily支持动态扩展,无需预先定义Column的数量以及类型,所有Column均以二进制格式存储,用户需要自行进行类型转换。
Region
当Table随着记录数不断增加而变大后,会逐渐分裂成多份splits,成为regions,一个region由[startkey,endkey)表示,不同的region会被Master分配给相应的RegionServer进行管理:
-ROOT-&
&
.META.Table
HBase中有两张特殊的Table,-ROOT-和.META.
.META.:
记录了用户表的Region信息,.META.可以有多个regoin
-ROOT-:
记录了.META.表的Region信息,-ROOT-只有一个region
Zookeeper中记录了-ROOT-表的location
Client访问用户数据之前需要首先访问zookeeper,然后访问-ROOT-表,接着访问.META.表,最后才能找到用户数据的位置去访问,中间需要多次网络操作,不过client端会做cache缓存。
四、MapReduceonHBase
在HBase系统上运行批处理运算,最方便和实用的模型依然是MapReduce,如下图:
HBaseTable和Region的关系,比较类似HDFSFile和Block的关系,HBase提供了配套的TableInputFormat和TableOutputFormatAPI,可以方便的将HBaseTable作为HadoopMapReduce的Source和Sink,对于MapReduceJob应用开发人员来说,基本不需要关注HBase系统自身的细节。
五、HBase系统架构
Client
HBaseClient使用HBase的RPC机制与HMaster和HRegionServer进行通信,对于管理类操作,Client与HMaster进行RPC;
对于数据读写类操作,Client与HRegionServer进行RPC
Zookeeper
ZookeeperQuorum中除了存储了-ROOT-表的地址和HMaster的地址,HRegionServer也会把自己以Ephemeral方式注册到Zookeeper中,使得HMaster可以随时感知到各个HRegionServer的健康状态。
此外,Zookeeper也避免了HMaster的单点问题,见下文描述
HMaster
HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的MasterElection机制保证总有一个Master运行,HMaster在功能上主要负责Table和Region的管理工作:
1.
管理用户对Table的增、删、改、查操作
2.
管理HRegionServer的负载均衡,调整Region分布
3.
在RegionSplit后,负责新Region的分配
4.
在HRegionServer停机后,负责失效HRegionServer上的Regions迁移
HRegionServer
HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。
HRegionServer内部管理了一系列HRegion对象,每个HRegion对应了Table中的一个Region,HRegion中由多个HStore组成。
每个HStore对应了Table中的一个ColumnFamily的存储,可以看出每个ColumnFamily其实就是一个集中的存储单元,因此最好将具备共同IO特性的column放在一个ColumnFamily中,这样最高效。
HStore存储是HBase存储的核心了,其中由两部分组成,一部分是MemStore,一部分是StoreFiles。
MemStore是SortedMemoryBuffer,用户写入的数据首先会放入MemStore,当MemStore满了以后会Flush成一个StoreFile(底层实现是HFile),当StoreFile文件数量增长到一定阈值,会触发Compact合并操作,将多个StoreFiles合并成一个StoreFile,合并过程中会进行版本合并和数据删除,因此可以看出HBase其实只有增加数据,所有的更新和删除操作都是在后续的compact过程中进行的,这使得用户的写操作只要进入内存中就可以立即返回,保证了HBaseI/O的高性能。
当StoreFilesCompact后,会逐步形成越来越大的StoreFile,当单个StoreFile大小超过一定阈值后,会触发Split操作,同时把当前RegionSplit成2个Region,父Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上。
下图描述了Compaction和Split的过程:
在理解了上述HStore的基本原理后,还必须了解一下HLog的功能,因为上述的HStore在系统正常工作的前提下是没有问题的,但是在分布式系统环境中,无法避免系统出错或者宕机,因此一旦HRegionServer意外退出,MemStore中的内存数据将会丢失,这就需要引入HLog了。
每个HRegionServer中都有一个HLog对象,HLog是一个实现WriteAheadLog的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中(HLog文件格式见后续),HLog文件定期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)。
当HRegionServer意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应region的目录下,然后再将失效的region重新分配,领取到这些region的HRegionServer在LoadRegion的过程中,会发现有历史HLog需要处理,因此会ReplayHLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。
HBase存储格式
HBase中的所有数据文件都存储在HadoopHDFS文件系统上,主要包括上述提出的两种文件类型:
1.HFile,HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile
2.HLogFile,HBase中WAL(WriteAheadLog)的存储格式,物理上是Hadoop的SequenceFile
HFile
下图是HFile的存储格式:
首先HFile文件是不定长的,长度固定的只有其中的两块:
Trailer和FileInfo。
正如图中所示的,Trailer中有指针指向其他数据块的起始点。
FileInfo中记录了文件的一些Meta信息,例如:
AVG_KEY_LEN,AVG_VALUE_LEN,LAST_KEY,COMPARATOR,MAX_SEQ_ID_KEY等。
DataIndex和MetaIndex块记录了每个Data块和Meta块的起始点。
DataBlock是HBaseI/O的基本单元,为了提高效率,HRegionServer中有基于LRU的BlockCache机制。
每个Data块的大小可以在创建一个Table的时候通过参数指定,大号的Block有利于顺序Scan,小号Block利于随机查询。
每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成,Magic内容就是一些随机数字,目的是防止数据损坏。
后面会详细介绍每个KeyValue对的内部构造。
HFile里面的每个KeyValue对就是一个简单的byte数组。
但是这个byte数组里面包含了很多项,并且有固定的结构。
我们来看看里面的具体结构:
开始是两个固定长度的数值,分别表示Key的长度和Value的长度。
紧接着是Key,开始是固定长度的数值,表示RowKey的长度,紧接着是RowKey,然后是固定长度的数值,表示Family的长度,然后是Family,接着是Qualifier,然后是两个固定长度的数值,表示TimeStamp和KeyType(Put/Delete)。
Value部分没有这么复杂的结构,就是纯粹的二进制数据了。
HLogFile
上图中示意了HLog文件的结构,其实HLog文件就是一个普通的HadoopSequenceFile,SequenceFile的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括
sequencenumber和timestamp,timestamp是“写入时间”,sequencenumber的起始值为0,或者是最近一次存入文件系统中sequencenumber。
HLogSequeceFile的Value是HBase的KeyValue对象,即对应HFile中的KeyValue,可参见上文描述。
六、HBase接口shell常用命令
Hbase的shell操作命令:
名称
命令表达式
创建表
create'
表名称'
'
列名称1'
'
列名称2'
列名称N'
添加记录
put'
行名称'
列名称:
'
值'
查看记录
get'
查看表中的记录总数
count'
删除记录
delete'
表名'
'
'
列名称'
删除一张表
先要屏蔽该表,才能对该表进行删除,第一步disable'
第二步drop'
查看所有记录
scan"
表名称"
查看某个表某个列中所有数据
['
]
更新记录
就是重写一遍进行覆盖
Shell接口:
启动hbase:
$./bin/start-hbase.sh
startingMaster,loggingtologs/hbase-user-master-example.org.out
用shell连接你的Hbase
$./bin/hbaseshell
HBaseShell;
enter'
help<
RETURN>
forlistofsupportedcommands.
Type"
exit<
"
toleavetheHBaseShell
Version:
0.90.0,r1001068,FriSep2413:
55:
42PDT2010
hbase(main):
001:
0>
显示所有表:
list
015:
list
TABLE
student
1row(s)in0.0200seconds
=>
["
student"
016:
输入help然后<
可以看到一列shell命令。
1创建表操作:
创建表:
create'
student'
name'
address'
说明:
新建student表,该表有两列名称和地址,名称只有一个,address可以有多个。
2、插入操作:
插入一条记录,只能插入某列:
row1'
tom'
向student有中插入记录,记录的row值为row1,列name的值为tom
插入列簇
地址簇插入家庭地址:
address:
home'
ShiDaiStreet'
地址簇插入学校地址:
school'
BinAnStreet'
查询学生的家庭地址:
{COLUMN=>
}
3、更新操作:
根据row值查询一条记录:
根据row值更新name值(系统会直接更新):
put'
tom2'
再查询时,系统返回最新的值:
get'
根据timestamp查询更新之前的name值:
lsi
TIMESTAMP=>
1301473112875}
4、删除操作d
删除Id为temp的值的“info:
age”:
temp'
info:
age'
ls
删除整行:
deleteall'
将整张表清空:
truncate'
设置表不可用:
disable'
删除表:
drop'
5、查询操作
查询数据库中所有的表:
查询student表中所有数据:
scan'
查看student表中address列族的所有数据:
{COLUMNS=>
Get一行:
查询表是否存在:
exists'
查询表结构:
describe'
查询服务器状态:
status
如:
3servers,0dead,1.0000averageload
查询hbase版本:
version
0.90.4,r1150278,SunJul2415:
53:
29PDT2011
6、其他操作:
判断表是否enable或disable:
is_enabled'
或is_disabled'
关闭shell:
exit
七、Hbase基于Mapreduce的编程
将mapreduce的输出结果保存到大型分布式数据库中HBase中,一个例子,求各url的访问pv数据,由于用到rcfile格式需要导入hive-exce包,还需要加载hbase包,如果这两个包都已经被集群管理员放到各节点的hadoop/lib下那就可以省去这一步
八、GN话单入Hbase库
通过MapReduce程序进行入库,在Map函数内调用HBaseApi进行put,在入库前先检查表是否创建,没有就先建表。
程序调起:
hadoopjar/home/boco/lq/lq.jarcom.boco.lq.load.gn.GN2HBaseDriver11120140312/user/boco/lq
导入报文:
D:
\01技术资料\00Hadoop技术掌握过程及度量\支付类热点业务分析\支付类热点业务分析\CDR-20140312010104.139_1.txt
存储(Hbase)结果
013:
0*scan'
GN_20140312'
ROWCOLUMN+CELL
360781897201403120163665column=f:
c,timestamp=1394557234000,value=CMNET\x09460001064759021\x093519390571475046\x09Nokia\x09Nokia900Nokia900\x09WH-EBSC-
810-D1\x090.0.0.0\x090.0.0.0\x09221.177.166.16\x09221.177.162.22\x09SGSN06\x09GGSN09\x0910.67.34.71\x0965.55.42.196\x092\x091\x0986
\x0918\x091802\x095\x0912\x091210\x0912\x091210\x094\x09112\x090\x090\x090\x090\x0928971\x0964901\x09701\x092014-03-1201:
00:
34\x09
2014-03-1201:
01:
02\x0928720.7188\x097742.0000\x095397.0000\x09\x09Service:
1802
d,timestamp=1394557234000,value=09679F3BF2AFEBCEEAF9758DD91E13E4
889382221201403120019862column=f:
c,timestamp=1394557164000,value=\xEF\xBB\xBFCMWAP\x09460001804766329\x098602550101877401\x09Xima\x09GilDC9\x09XN-EBSC-8
10BSC-12\x09221.177.160.219\x09221.177.162.225\x09221.177.160.219\x09221.177.162.245\x09SGSN23\x09GGSN07\x0910.200.219.101\x0910.0.
0.172\x092\x091\x0986\x0912\x091203\x091\x0912\x091212\x0912\x091212\x094\x091\x090\x09460\x090\x09255\x0929143\x094502\x09602\x092
014-03-1200:
59:
24\x092014-03-1200:
48\x0924202.6758\x092257.0000\x0960.0000\x09\x09
_480_A6-hsdroid_3-0-3-44_p-a1-3-61&
uid=bd_747781010552068&
from=1671a&
rid=5286339655&
pm=8TKn9D2C42HTtfwanfSar9r3DmD6sqAEQJSzj-14I6UE
fWObqcr9FlRjOW1PqG00ATyWxH9OKiG1tPgQaZLUmoLLpiAEC
d,timestamp=1394557164000,value=CF5996B3CEF7E5DFC405858418CC5795
2row(s)in0.0560seconds