一.概述
HBase 是一个构建在 Hadoop 文件系统之上的面向列的数据库管理系统。
要想明白为什么产生 HBase,就需要先了解一下 Hadoop 存在的限制?Hadoop 可以通过 HDFS 来存储结构化、半结构甚至非结构化的数据,它是传统数据库的补充,是海量数据存储的最佳方法,它针对大文件的存储,批量访问和流式访问都做了优化,同时也通过多副本解决了容灾问题。
但是 Hadoop 的缺陷在于它只能执行批处理,并且只能以顺序方式访问数据,这意味着即使是最简单的工作,也必须搜索整个数据集,无法实现对数据的随机访问。实现数据的随机访问是传统的关系型数据库所擅长的,但它们却不能用于海量数据的存储。在这种情况下,必须有一种新的方案来解决海量数据存储和随机访问的问题,HBase 就是其中之一 (HBase,Cassandra,couchDB,Dynamo 和 MongoDB 都能存储海量数据并支持随机访问)。
基本概念
代码语言:javascript复制RowKey(行键)
相当于RDBMS中的主键 创建表时不需要指定行键,添加数据时指定
代码语言:javascript复制Column Family(列族)
创建表时需要指定列族,理论上列族的数量不受限制,实际开发中 建议不超过三个
代码语言:javascript复制Column(列)
建表时无需指定,添加数据时可以自动增删
代码语言:javascript复制cell(单元)
如何锁定HBase中的一条数据? 行键 列族 列 时间戳 每一条数据都在这个单元中 默认只获取最后一个版本的数据
代码语言:javascript复制namespace(名称空间)
相当于RDBMS中的数据库 建表时如果不指定名称空间则使用默认的defult名称空间
基本命令
代码语言:javascript复制#建立集群连接
start-hbase.sh
#创建客户端连接
hbase shell
#查看状态
status
#获取帮助
help
#查看版本
version
#创建person表(规定指定一个列族,理论上列族不限制数量)
create 'person' ,'basic' , 'other'
#向person表中添加name列值为jmy(添加数据需要指定行键)
put 'person','p1','basic:name','jmy'
#修改person表中p1的name值为jjj
put 'person','p1','basic:name','jjj'
#查看person表中p1的name值
get 'person','p1','basic:name'
#查看person表中所有数据
scan 'person'
#查看person表中basic和other列族中所有的值
scan 'person',{COLUMNS=>['basic','other']}
#查看person表中name和addr的值
scan 'person', {COLUMNS=>['basic:name','other:addr']}
#删除person表中行键为p1列族basic列name的值
delete 'person','p1','basic:name'
#删除person表中行键为p1的所有列
deleteall 'person','p1'
#禁用person表(删除表之前需要先禁用表)
disable 'person'
#删除person表
drop 'person'
#查看所有表
list
#查看所有名称空间
list_namespace
#创建person名称空间
create_namespace 'person'
#创建person名称空间下的teacher表
create 'person:teacher','name'
#查看person名称空间下的表
list_namespace_tables 'person'
#删除person名称空间(要求person名称空间为空)
drop_namespace person
基本理论
存储结构
- HBase中表的数据按行键分类存在不同的HRegion中
- HRegion和HDFS中的datanode处于同一个节点
- 因为行键的字典序排序规则,所以HRegion中的数据不会出现交叉
- 存在不同的HRegion中是为了分布式管理
- HRegion中存在多个HStore
- HStore的数量由列族的数量决定,一个HStore中存在一个列族的数据
- 一个HRegion如果超过指定大小(默认10G)则会进行切分
- 每一个HStore中都包含0~多个HFile/StoreFile,最终会落地到HDFS上所以HBase也具备副本策略
HMaster
- HBase也是主从结构
- HBase的主节点叫做HMaster
- HMaster中管理这HBase的元数据
HMaster不存在单点故障,是因为可以在任意一个节点上利用 sh hbase-daemon.sh start master启动一个HMasterZookeeper会监听HMaster的active和backup节点完成故障转移当出现多个HMaster时,启动顺序决定了他们的角色,先启动的是actice后启动的是backup节点。
- 虽然HMaster的数量不受限制,但是HMaster之间要进行热备,为了减少节点间的资源消耗,所以建议HMaster的数量不超过3个。
- HMaster通过向Zookeeper发送心跳传递节点状态,心跳间隔为180s.实际过程中会将这个时间缩短到10s-30s HMaster的职责: a.管理HRegionServer b.管理表结构(DDL而不是DML)
zookeeper的作用
HBase在第一次启动的时候会在zookeeper上注册一个持久节点/hbaseHMaster启动之后会在zookeeper上注册一个/hbase/master临时节点,后续的backup节点也会在被注册的/hbase/backup-masters节点管理起来。
zookeeper会监控/hbase/master节点的状态,如果Active节点宕机了,zookeeper会从/hbase/backup-masters节点中挑选一个节点成为Activezookeeper也会监控/hbase/backup-masters状态以确保热备数据。
HRegionServer在启动的时候也会在/hbase/rs节点下来注册临时子节点
代码语言:javascript复制HRegionServer
代码语言:javascript复制 HRegionServer是用来管理HRegion的,官方数据表明一个HRegionServer
可以管理个HRegion
HRegionServer和datanode部署在同一个节点
HRegionServer的构造
a.WAL(write ahead log)
HBase在进行写操作的时候会将写操作先记录到WAL上,记录成功之后才
会写入memStore中
WAL是维系在磁盘中的
b.blockcache(读缓存)
在进行读操作的时候会先读取blockcache,blockcache的默认大小是
128MB,维系在内存中
blockcache具有局限性
时间局限性:一条数据在被读取之后,HBase认为这条数据在下一次被
读取的概率大于其他数据,就会被放入到blockcache中。
空间局限性:一条数据被读取之后,他周围的数据HBase认为下次读取的
概率大于其他数据,周围的数据就会被放入到blockcache中
blockcache的清理采用LRU策略
c.HRegion
HRegion由memStore和到多个HFile/storeFile组成
memStore:memStore是一块写缓存,写入数据之后会先将数据保存到
写缓存中,默认大小为128MB并且维系在内存中。
memStore满足指定条件之后会冲刷成为HFile:
i.memStore达到指定容量
ii.WAL达到1G之后会冲刷memStore和产生新的HFile
iii.WAL和所有的memStore所占的内存超过了物理内存的%,会冲刷
较大的memStore。
代码语言:javascript复制HBase的读写流程
客户端第一次访问HBase,会先访问zookeeper获取.mate.的存储位置, 然后访问.mate.文件获取对应HRegion的HRegionServer,最后在访问HRegion 执行读写操作。(不同版本的读写操作不同,此为0.96之后的版本)