1、什么是HBase?

HBase 是一个分布式,可扩展,面向列的适合存储海量数据的NoSQL数据库,其最主要的功能是解决海量数据下的实时随机读写的问题。 HBase 依赖 HDFS 做为底层分布式文件系统。

1、特性

  • 强读写一致,但是不是最终一致性的数据存储,这使得它非常适合高速的计算聚合
  • 自动分片,通过Region分散在集群中,当行数增长的时候,Region也会自动的切分和再分配
  • 自动的故障转移
  • Hadoop/HDFS集成,和HDFS开箱即用
  • 丰富、简洁、高效的API
  • 块缓存,布隆过滤器,可以高效的列查询优化
  • 操作管理,Hbase提供了内置的web界面来操作

2、什么时候用Hbase?

Hbase不适合解决所有的问题:

  • 首先数据库量要足够多,如果有十亿及百亿行数据,那么Hbase是一个很好的选择,如果只有几百万行甚至不到的数据量,RDBMS是一个很好的选择。因为数据量小的话,真正能工作的机器量少,剩余的机器都处于空闲的状态。
  • 其次,如果不需要辅助索引,静态类型的列,事务等特性,一个已经用RDBMS的系统想要切换到Hbase,则需要重新设计系统。
  • 最后,保证硬件资源足够,每个HDFS集群在少于5个节点的时候,都不能表现的很好。因为HDFS默认的复制数量是3,再加上一个NameNode。

3、HBase架构

  • zookeeper:开源分布式协调服务框架,主要解决分布式系统中的一致性和数据管理问题。本质上是分布式文件系统,做 HMaster 选举,关键信息如 meta-region 地址,Replication 进度,Regionserver 地址与端口等存储。
  • HMaster: 是一个轻量级进程,负责所有 DDL 操作,负载均衡, region 信息管理,并在宕机恢复中起主导作用。
  • HRegionServer: 管理 HRegion,与客户端点对点通信,负责实时数据的读写(DML操作)。RegionServer要实时的向HMaster报告信息。HMaster知道全局的RegionServer运行情况,可以控制RegionServer的故障转移和Region的切分。
  • HRegion:Hbase表的分片,HBase表会根据RowKey值被切分成不同的Region存储在RegionServer中,在一个RegionServer中可以有多个不同的Region。
  • Store:一个Store对应HBase表中的一个列族(Column Family)。
  • MemStore:内存存储,位于内存中,用来保存当前的数据操作。
  • HFile:在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。StoreFile是以Hfile的形式存储在HDFS的。
  • HDFS:Hbase运行的底层文件系统。
  • Write-Ahead logs:HBase的修改记录,当对HBase读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead logfile的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。

2、HBase工作流程

1、数据写流程

1、client—>zk 请求meta表所在的RegionServer机器地址

2、client<—zk 返回存放meta表的RegionServer机器地址

3、client—>RegionServer请求meta数据信息

4、RgionServer—>client返回meta,获取存放用户数据的RegionServer机器

5、将meta进行缓存,下一次查询先查询缓存

6、发送put请求到对应的RegionServer(反馈client写入成功)

7、对表加锁、更新时间戳、构建WAL,将操作追加到WAL中

8、将数据写到MemStore中,释放锁

9、将数据同步到StoreFile中(如果同步失败,清理Memstore中的数据)

meta表中存放用户表的信息

客户端访问zk中的 meta-region-server,返回对应机器

[root@test-194 bin]# ./zkCli.sh

[zk: localhost:2181(CONNECTED) 3] ls /hbase
[backup-masters, draining, flush-table-proc, hbaseid, master, master-maintenance, meta-region-server, namespace, online-snapshot, rs, running, splitWAL, switch, table]

[zk: localhost:2181(CONNECTED) 4] get /hbase/meta-region-server
�master:16000�<�ǂ���PBUF

test-194�}膃��.

查询到对应机器

hbase(main):001:0> scan 'hbase:meta'

test01,,1614519617795.e069935707 column=info:seqnumDuringOpen, timestamp=2021-02-28T21:40:18.339, value=\x00\x00\x00\x00\x00\x00\
 f5d924f222e2ff38b2cc8c.          x00\x02
 test01,,1614519617795.e069935707 column=info:server, timestamp=2021-02-28T21:40:18.339, value=test-194:16020
 f5d924f222e2ff38b2cc8c.
 test01,,1614519617795.e069935707 column=info:serverstartcode, timestamp=2021-02-28T21:40:18.339, value=1614217790312
 f5d924f222e2ff38b2cc8c.
 
 #数据表还小,没有分割,所以只有一台regionserver test-194,(rk0-xxx:regionserver)
 test01,,1614519617795.e069935707 column=info:sn, timestamp=2021-02-28T21:40:18.083, value=test-194,16020,1614217790312
 f5d924f222e2ff38b2cc8c.
 test01,,1614519617795.e069935707 column=info:state, timestamp=2021-02-28T21:40:18.339, value=OPEN
 f5d924f222e2ff38b2cc8c.

老版本的HBase可能存在-root-表,存放meta表的对应机器,作用:防止meta发生切分到不同的RegionServer。(版本0.9)

2、HBase的Flush

内存在一定条件下flush:时间、大小(将写入MemStore中的数据刷写入HFile中)

相关配置

当RegionServer中所有的MemStore中的大小超过内存的40%时flush(阻塞状态,client不可写入内存)

<property>
	<name>hbase.regionserver.global.memstore.size</name>
	<value></value>
</property>

当RegionServer中所有的Memstore中的大小超过内存的40%*95%时开始flush(client可以写入内存),刷写时会对memstore进行排序

<property>
	<name>hbase.regionserver.global.memstore.size.lower.limit</name>
	<value></value>
</property>

内存中的文件自动刷新之前能够存活的最长时间,默认1h(最后一次编辑时间,全部flush)

<property>
	<name>hbase.regionserver.optionalocacheflushinterval</name>
	<value>3600000</value>
</property>

单个Region中的Memstore中的缓存大小达到128M(默认),当前Region就会flush

<property>
	<name>hbase.hregion.memstore.flush.size</name>
	<value>134217728</value>
</property>

当WAL文件的数量超过hbase.regionserver.max.log时,Region会按照时间顺序一次进行刷写,直到WAL低于hbase.regionserver.max.log 以下,默认最大值为32(不暴露在用户配置文件中了)

hbase.regionserver.hlog.blocksize hlog(WAL)大小上限,达到128M flush(不暴露在用户配置文件中了)

3、HBase的Compact

以牺牲磁盘io来换取读性能的基本稳定

小合并(minor):一个Region下一个Store中的部分HFile合并成一个比较大的StoreFile。

大合并(major):一个Region下一个Store中的所有HFile合并成一个更大的HFile。会清理ttl过期,版本超限定,标记删除的数据。

Compact流程

1、触发条件(1、每次memstore在flush之后都会判断是否触发Compaction。2、后台线程周期性检查。3、手动触发)

2、分别读出待合并Hfile文件的数据(K,V),进行归并排序,之后写到./tmp临时文件中。

3、将临时文件移动到对应的Store的数据目录。

4、将Compaction的输入文件路径和输出路径封装成KV写入到HLog日志,并打上Compaction标记,最后强制执行sync。

5、将对应的Store数据目录下的Compaction输入文件全部删除。

相关配置

在Region下的所有hfile会进行合并,默认为7天,majorcompaction非常消耗资源,建议关闭(设置为0)

<property>
	<name>hbase.hregion.majorcompaction</name>
	<value>604800000</value>
</property>

合并是rewrite(重写),由于时间不确定,万一在负载较高的情况下,容易出现问题,选择合适时间进行手动合并。

合并数量限制,3 >= hfile(默认3个)触发合并

<property>
	<name>hbase.hstore.conpactionThreshold</name>
	<value>3</value>
</property>

4、HBase的split

根据rowkey进行切分,从rowkey中间进行切分。自动切分容易产生数据倾斜(所以建表的时候需要进行预分区)。官方建议使用1–3个列族(防止出现小文件)(使用多个列族需要数据量同步增长的情况下使用)。

Hfile最大10G(默认)

<property>
	<name>hbase.hregion.max.filesize</name>
	<value>10737418240</value>
</property>

5、数据读流程

1、client—>zk 请求meta表所在的RegionServer机器地址

2、client<—zk 返回存放meta表的RegionServer机器地址

3、client—>RegionServer请求meta数据信息

4、RgionServer—>client返回meta,获取存放用户数据的RegionServer机器

5、将meta进行缓存,下一次查询先查询缓存

6、访问存储用户的RegionServer中的 Memstore和StoreFile中的数据,进行对比返回最大时间戳的数据

3、Hbase 基础命令

名称

命令

创建表

create ‘表名’, ‘列族名1’,‘列族名2’,‘列族名X’

查看所有表

list

描述表

describe ‘表名’

判断表存在

exists ‘表名’

判断是否禁用启用表

is_enabled ‘表名’; is_disabled ‘表名’

添加记录

put ‘表名’, ‘rowKey’, ‘列族 : 列‘ ,‘值’

查看记录rowkey下的所有数据

get ‘表名’,‘rowKey’

查看表中的记录总数

count ‘表名’

获取某个列族

get ‘表名’,‘rowkey’,‘列族’

获取某个列族的某个列

get ‘表名’,‘rowkey’,'列族:列’

删除记录

delete ‘表名’ ,‘行名’ , ‘列族:列’

删除整行

deleteall ‘表名’,‘rowkey’

删除一张表

先要禁用该表,才能对该表进行删除。第一步 disable ‘表名’ ,第二步 drop ‘表名’

清空表

truncate ‘表名’

查看所有记录

scan “表名”

查看某个表某个列中所有数据

scan “表名” ,

更新记录

就是重写一遍,hbase没有修改,都是追加,时间戳不同