(一)HBase基础

(一)HBase基础
一、介绍

官网

1、基本概念

​ hbase是bigtable的开源java版本,是建立在hdfs之上。提供高可靠性、高性能、列存储、可伸缩、实时读写nosql 的数据库系统。它介于nosql和RDBMS之间,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务(可通
过hive支持来实现多表join等复杂操作)。主要用来存储结构化和半结构化的松散数据。Hbase查询数据功能很简单,不支持join等复杂操作,不支持复杂的事务(行级的事务),Hbase中支持的数据类型:byte[]与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。

2、特点
大:一个表可以有上十亿行,上百万列
面向列:面向列(族)的存储和权限控制,列(族)独立检索。
稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。

二、Hbase表结构
Row KeyTime StampColumnFamily contentsColumnFamily anchorColumnFamily people
“com.cnn.www”t9anchor:cnnsi.com = “CNN”
“com.cnn.www”t8anchor:my.look.ca = “CNN.com”
“com.cnn.www”t6contents:html = “…”
“com.cnn.www”t5contents:html = “…”
“com.cnn.www”t3contents:html = “…”
“com.example.www”t5contents:html = “…”people:author = “John Doe”

命名空间(Name Space):类似于关系型数据库的 DatabBase 概念,每个命名空间下有多个表。HBase有两个自带的命名空间,分别是 hbase 和 default,hbase 中存放的是 HBase 内置的表,default 表是用户默认使用的命名空间。

表(table):用于存储管理数据,具有稀疏的、面向列的特点。HBase中的每一张表,就是所谓的大表
(Bigtable),可以有上亿行,上百万列。对于为值为空的列,并不占用存储空间,因此表可以设计的非常稀
疏。
行键(RowKey):类似于MySQL中的主键,HBase根据行键来快速检索数据,一个行键对应一条记录。与
MySQL主键不同的是,HBase的行键是天然固有的,每一行数据都存在行键。
列族(ColumnFamily):是列的集合。列族在表定义时需要指定,而列在插入数据时动态指定。列中的数据都
是以二进制形式存在,没有数据类型。在物理存储结构上,每个表中的每个列族单独以一个文件存储(参见图
1.2)。
时间戳(TimeStamp):是列的一个属性,是一个64位整数。由行键和列确定的单元格,可以存储多个数据,
每个数据含有时间戳属性,数据具有版本特性。可根据版本(VERSIONS)或时间戳来指定查询历史版本数据,
如果都不指定,则默认返回最新版本的数据。
区域(Region):HBase自动把表水平划分成的多个区域,划分的区域随着数据的增大而增多。

Cell由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定的单元。cell 中的数
据是没有类型的,全部是字节码形式存贮。

三、架构

架构图

1、Client
①使用HBase RPC机制与HMaster和HRegionServer进行通信;
②Client与HMaster进行通信进行管理类操作;
③Client与HRegionServer进行数据读写类操作。
2、Zookeeper
①保证任何时候,集群中只有一个running master,避免单点问题;
②存贮所有Region的寻址入口,包括-ROOT-表地址、HMaster地址;
③实时监控Region Server的状态,将Region server的上线和下线信息,实时通知给Master;
④存储Hbase的schema,包括有哪些table,每个table有哪些column family。
3、HMaster
可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行。角色功能
①为Region server分配region;
②负责region server的负载均衡;
③发现失效的region serve并重新分配其上的region;
④GFS上的垃圾文件回收;
⑤处理用户对标的增删改查操作。
4、HRegionServer
HBase中最核心的模块,主要负责响应用户I/O请求,向HDFS文件系统中读写数据。
作用:
①维护Master分配给它的region,处理对这些region的IO请求;
②负责切分在运行过程中变得过大的region。
此外,HRegionServer管理一些列HRegion对象,每个HRegion对应Table中一个Region,HRegion由多个 HStore组 成,每个HStore对应Table中一个Column Family的存储,Column Family就是一个集中的存储单元,故将具有相同IO特性的Column放在一个Column Family会更高效。
5、HStore
HBase存储的核心,由MemStore和StoreFile组成。用户写入数据的流程为:client写入 -> 存入MemStore,一直到MemStore满 -> Flush成一个StoreFile,直至增长到一定阈值 -> 触发Compact合并操作 -> 多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除 -> 当StoreFiles Compact后,逐步形成越来越大的StoreFile -> 单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split成2个Region,Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上,如图所示。

6、HRegion
一个表最开始存储的时候,是一个region。
一个Region中会有个多个store,每个store用来存储一个列簇。如果只有一个column family,就只有一个store。
region会随着插入的数据越来越多,会进行拆分。默认大小是10G一个。
7、HLog
在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer意外退出,MemStore中的内存数据就会
丢失,引入HLog就是防止这种情况。
工作机制:每个HRegionServer中都会有一个HLog对象,HLog是一个实现Write Ahead Log的类,每次用户操作写入Memstore的同时,也会写一份数据到HLog文件,HLog文件定期会滚动出新,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知,HMaster首先处理遗留的HLog文件,将不同region的log数据拆分,分别放到相应region目录下,然后再将失效的region重新分配,领取到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。

四、读写流程

1、写流程

1)Client 先访问 zookeeper,获取 hbase:meta 表位于哪个 Region Server。
2)访问对应的 Region Server,获取 hbase:meta 表,根据读请求的 namespace:table/rowkey,查询出目标数据位于哪个 Region Server 中的哪个 Region 中。并将该 table 的 region 信息以及 meta 表的位置信息缓存在客户端metacache方便下次访问。
3)与目标 Region Server 进行通讯;
4)将数据顺序写入(追加)到 WAL;
5)将数据写入对应的 MemStore,数据会在 MemStore 进行排序;
6)向客户端发送 ack;
7)等达到 MemStore 的刷写时机后,将数据刷写到 HFile。

2、读流程

1)Client 先访问 zookeeper,获取 hbase:meta 表位于哪个 Region Server。
2)访问对应的 Region Server,获取 hbase:meta 表,根据读请求的 namespace:table/rowkey,
查询出目标数据位于哪个 Region Server 中的哪个 Region 中。并将该 table 的 region 信息以
及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问。
3)与目标 Region Server 进行通讯;
4)分别在 Block Cache(读缓存),MemStore 和 Store File(HFile)中查询目标数据,并将
查到的所有数据进行合并。此处所有数据是指同一条数据的不同版本(time stamp)或者不
同的类型(Put/Delete)。
5) 将从文件中查询到的数据块(Block,HFile 数据存储单元,默认大小为 64KB)缓存到
Block Cache。
6)将合并后的最终结果返回给客户端。

3、 MemStore Flush

MemStore 刷写时机:
当某个 memstroe 的大小达到了 hbase.hregion.memstore.flush.size (默认值 128M ),
其所在 region 的所有 memstore 都会刷写。当 memstore 的大小达到了

hbase.hregion.memstore.flush.size (默认值 128M )

hbase.hregion.memstore.block.multiplier (默认值 4 )时,会阻止继续往该 memstore 写数据。

当 region server 中 memstore 的总大小达到
java_heapsize*hbase.regionserver.global.memstore.size (默认值 0.4 )
hbase.regionserver.global.memstore.size.lower.limit (默认值 0.95 ),
region 会按照其所有 memstore 的大小顺序(由大到小)依次进行刷写。直到 region server中所有 memstore 的总大小减小到上述值以下。当 region server 中 memstore 的总大小达到
java_heapsize
hbase.regionserver.global.memstore.size (默认值 0.4 )
时,会阻止继续往所有的 memstore 写数据。

到达自动刷写的时间,也会触发 memstore flush。自动刷新的时间间隔由该属性进行
配置 hbase.regionserver.optionalcacheflushinterval (默认 1 小时)。
当 WAL 文件的数量超过 hbase.regionserver.max.logs,region 会按照时间顺序依次进
行刷写,直到 WAL 文件数量减小到 hbase.regionserver.max.log 以下(该属性名已经废弃,
现无需手动设置,最大值为 32)。

4、StoreFile Compaction
由于memstore每次刷写都会生成一个新的HFile,且同一个字段的不同版本(timestamp)和不同类型(Put/Delete)有可能会分布在不同的HFile中,因此查询时需要遍历所有的HFile。为了减少 HFile 的个数,以及清理掉过期和删除的数据,会进行 StoreFile Compaction。Compaction 分为两种,分别是 Minor Compaction 和 Major Compaction。Minor Compaction会将临近的若干个较小的 HFile 合并成一个较大的 HFile,但 不会清理过期和删除的数据。Major Compaction 会将一个 Store 下的所有的 HFile 合并成一个大 HFile,并且 会清理掉过期和删除的数据。

5、Region Split
默认情况下,每个 Table 起初只有一个 Region,随着数据的不断写入,Region 会自动进
行拆分。刚拆分时,两个子 Region 都位于当前的 Region Server,但处于负载均衡的考虑,
HMaster 有可能会将某个 Region 转移给其他的 Region Server。
Region Split 时机:
当1个region中的某个Store下所有StoreFile的总大小超过hbase.hregion.max.filesize,
该 Region 就会进行拆分(0.94 版本之前)。

​ 当 1 个 region 中 的某 个 Store 下所有 StoreFile 的总 大 小超过 Min(R^2 *
“hbase.hregion.memstore.flush.size”,hbase.hregion.max.filesize"),该 Region 就会进行拆分,其
中 R 为当前 Region Server 中属于该 Table 的个数(0.94 版本之后)。

当1个region中的某个Store下所有StoreFile的总大小超过" hbase.hregion.max.filesize " ,该region就会进行
拆分(0.94版之前)
当1个region中的某个Store下所有StoreFile的总大小超过Min(R^2 * “hbase.hregion.memstore.flush.size”,
" hbase.hregion.max.filesize ") 就会拆分,其中R为当前RegionServer中属于该table的region个数(0.94版之后)
扫一扫关注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值