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 “表名” , {COLUMNS=>‘列族名:列名’} |
更新记录 | 就是重写一遍,hbase没有修改,都是追加,时间戳不同 |