大数据之Hbase

HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库(NoSql)。另一个不同的是HBase基于列的而不是基于行的模式。

HBase利用Hadoop HDFS作为其文件存储系统利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为对应协调服务组件;

HBase位于结构化存储层,Hadoop HDFS为HBase提供了高可靠性的底层存储支持,Hadoop MapReduce为HBase提供了高性能的计算能力,

Zookeeper为HBase提供了稳定服务和failover(故障切换)机制。此外,Pig和Hive还为HBase提供了高层语言支持,使得在HBase上进行数据统计处理变的

非常简单。 Sqoop则为HBase提供了方便的RDBMS数据导入功能,使得传统数据库数据向HBase中迁移变的非常方便。


HBase数据模型Table & Column Family

Ø Row Key: 行键,Table的主键,Table中的记录默认按照Row Key升序排序
Ø Timestamp:时间戳,每次数据操作对应的时间戳,可以看作是数据的version number,timestamp时间戳默认的情况是最新的那个值;
Ø Column Family:列簇,Table在水平方向有一个或者多个Column Family组成,一个Column Family中可以由任意多个Column组成,
即Column Family支持动态扩展,无需预先定义Column的数量以及类型,所有Column均以二进制格式存储,用户需要自行进行类型转换。
Table & Region
当Table随着记录数不断增加而变大后,会逐渐分裂成多份splits,成为regions,一个region由[startkey,endkey)表示,
不同的region会被Master分配给相应的RegionServer进行管理;在建表的时候至少要指明一个列簇,可以不给字段;
-NAMESPACE- && .META. Table
HBase中有两张特殊的Table,-NAMESPACE-和.META.
.META.:记录了用户表的Region信息,.META.可以有多个regoin
-NAMESPACE-:直接从Zookeeper 中找到meta 表的位置,然后通过 meta 表定位到 region。 namespace表 中存储了 HBase 中的
所有 namespace 信息,包括预置的hbase 和 default;如果自定义一些 namespace 的话,就会再/hbase/data 目录下新建一个 namespace 文件夹
,该 namespace 下的表都将 flush 到该目录下。Client访问用户数据之前需要首先访问zookeeper,然后访问.META.的位置,最后才能找到
用户数据的位置去访问,中间需要多次网络操作,不过client端会做cache缓存。
MapReduce on HBase
在HBase系统上运行批处理运算,最方便和实用的模型依然是MapReduce,HBase Table和Region的关系,比较类似HDFS File和Block的关系,
HBase提供了配套的TableInputFormat和TableOutputFormat API,可以方便的将HBase Table作为Hadoop MapReduce的Source和Sink,
对于MapReduce Job应用开发人员来说,基本不需要关注HBase系统自身的细节。
HBase系统架构
ClientHBase Client使用HBase的RPC机制与HMaster和HRegionServer进行通信,对于管理类操作,Client与HMaster进行RPC;
对于数据读写类操作,Client与HRegionServer进行RPC。
1 Zookeeper
Zookeeper Quorum中除了存储了-META-表的地址和HMaster的地址,HRegionServer也会把自己以Ephemeral方式注册到Zookeeper中,
使得HMaster可以随时感知到各个HRegionServer的健康状态。此外,Zookeeper也避免了HMaster的单点问题,见下文描述:
HMaster
HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election(选举)机制保证总有一个Master运行,HMaster在功能上
主要负责Table和Region的管理工作:
1. 管理用户对Table的增、删、改、查操作
2. 管理HRegionServer的负载均衡,调整Region分布
3. 在Region Split后,负责新Region的分配
4. 在HRegionServer停机后,负责失效HRegionServer 上的Regions迁移
HRegionServer
HRegionServer主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。
HRegionServer内部管理了一系列HRegion对象,每个HRegion对应了Table中的一个Region,HRegion中由多个HStore组成。每个HStore对应了
Table中的一个Column Family的存储,可以看出每个Column Family其实就是一个集中的存储单元,因此最好将具备共同IO特性的column放在
一个Column Family中,这样最高效。
HStore存储是HBase存储的核心了,其中由两部分组成,一部分是MemStore,一部分是StoreFiles(一个memstore和0至多个storefile组成)。MemStore是Sorted Memory Buffer,
用户写入的数据首先会放入MemStore(内存),当MemStore满了以后会Flush成一个StoreFile(底层实现是HFile),当StoreFile文件数量增长到一定
阈值,会触发Compact合并操作,将多个StoreFiles合并成一个StoreFile,合并过程中会进行版本合并和数据删除,因此可以看出HBase其实
只有增加数据,所有的更新和删除操作都是在后续的compact过程中进行的,这使得用户的写操作只要进入内存中就可以立即返回,保证了
HBase I/O的高性能。当StoreFiles Compact后,会逐步形成越来越大的StoreFile,当单个StoreFile大小超过一定阈值后,会触发Split操作,
同时把当前Region Split成2个Region,父Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上(切分由regionserver完成,分配由master完成),使得原先1个Region的压力得以分流到2个Region上。
在理解了上述HStore的基本原理后,还必须了解一下HLog的功能,因为上述的HStore在系统正常工作的前提下是没有问题的,但是在
分布式系统环境中,无法避免系统出错或者宕机,因此一旦HRegionServer意外退出,MemStore中的内存数据将会丢失,这就需要引入HLog了
。每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每次用户操作写入MemStore的同时,也会写一份数据
到HLog文件中(HLog文件格式见后续),HLog文件定期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer
意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的 HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应
region的目录下,然后再将失效的region重新分配,领取 到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,
因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复

存储格式

HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,主要包括上述提出的两种文件类型:
1. HFile, HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile做了轻量级包装,即StoreFile底层就是HFile
2. HLog File,HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File
HFile
下图是HFile的存储格式:
首先HFile文件是不定长的,长度固定的只有其中的两块:Trailer和FileInfo。正如图中所示的,Trailer中有指针指向其他数据块的起始点。File Info中记录了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等。Data Index和Meta Index块记录了每个Data块和Meta块的起始点。
Data Block是HBase I/O的基本单元,为了提高效率,HRegionServer中有基于LRU的Block Cache机制。每个Data块的大小可以在创建一个Table的时候通过参数指定,大号的Block有利于顺序Scan,小号Block利于随机查询。每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成, Magic内容就是一些随机数字,目的是防止数据损坏。后面会详细介绍每个KeyValue对的内部构造。
HFile里面的每个KeyValue对就是一个简单的byte数组。但是这个byte数组里面包含了很多项,并且有固定的结构。我们来看看里面的具体结构:
开始是两个固定长度的数值,分别表示Key的长度和Value的长度。紧接着是Key,开始是固定长度的数值,表示RowKey的长度,紧接着是RowKey,然后是固定长度的数值,表示Family的长度,然后是Family,接着是Qualifier,然后是两个固定长度的数值,表示Time Stamp和Key Type(Put/Delete)。Value部分没有这么复杂的结构,就是纯粹的二进制数据了。
HLogFile
上图中示意了HLog文件的结构,其实HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是“写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequence number。
HLog Sequece File的Value是HBase的KeyValue对象,即对应HFile中的KeyValue,可参见上文描述。
注:hbase上的分区概念,根据rowkey存储在不同的region上,所有的表一开始只有一个region,region是唯一被一台
regionserver所管理
regionserver
|
region1 region2 region3
|
store
|
memstore&storefile

hbase HDFS目录结构
namespace -》 table -》 region -》 列簇(store) -》 storefile
-》只有初始的region是没有上下限的
-》master会将两个region分配到不同的regionserver上
-》虽然等分了,但是还是属于原来的表

-》WALs记录日志 ,预写日志,Hlog file,在写数据时会先往Hlog写一份,然后往内存写
-》避免内存丢失数据,可以从日志文件中恢复
squence file 序列化文件
-》 data是真正存储数据的

HBase数据存储
Hfile   <keyvalue>存储格式,是Hadoop的二进制文件,其实就是storefile
Hlog file  其实就是squence file序列化文件

当用户写入时候,先写入 Hlog file  再写入 memstore,当memstore满了以后会flush成一个storefile(就是底层的Hfile)
用户可以手动flush,将内存中的数据直接溢写到磁盘上,手动干预

storefile (64MB) storefile(128MB)
storefile (64MB) compactionstorefile(256MB) split
storefile (64MB) storefile(128MB)
storefile (64MB)

hbase:namespace表:存储hbase中所有namespace的信息
hbase:meta表:记录元数据,它的rowkey存储的是hbase中所有表的region名称全名
读取rowkey-》rowkey在哪个region上-》region被哪个regionserver所管理-》根据元数据记录查找
在zookeeper中可以找到meta表对应的regionserver,region信息
用户的发送的请求都会先去找到ZK,获取meta的region信息
读流程:
-》根据表名和rowkey找到对应的region
-》ZK中存储了meta表的region信息
-》从meta表中获取相应的region信息
-》找到对应的regionserver
-》找到对应的region












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值