起源
HBase的原型是Google Allo的BigTable论文,受到了该论文思想的启发,目前作为Hadoop的子项目来开发维护,用于支持结构化的数据存储。
什么是HBase
HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。HBase的目标是存储并处理大型的数据,更具体来说是仅需要使用普通的硬件配值,就能够处理成千上万的行和列所组成的大型数据。
HBase是Google Big大
与传统数据库对比
- 传统数据库遇到的问题
- 数据量很大的时候无法存储
- 没有很好的备份机制
- 数据达到一定数量开始缓慢,很大的话基本无法支撑
- HBase优势
- 线性扩展,随着数据量增多可以通过节点扩展进行支撑
- 数据存储在HDFS上,备份机制健全
- 通过Zookeeper协调查找数据,访问速度快
HBase集群中的角色(进程)
- 一个或多个主节点,HMaster
- 监控RegionServer
- 处理RegionServer故障转移
- 处理元数据的变更
- 处理region的分配或移除
- 在空闲时间进行数据的负载均衡
- 通过Zookeeper发布自己的位置给客户端
- 多个从节点,HregionServer
- 负责存储HBase的实际数据
- 处理分配给它的Region
- 刷新缓存到HDFS
- 维护HLog
- 执行压缩
- 负责处理Region分片
基本原理
HBase是一种作为存储的分布式文件系统,另一种是作为数据处理模型的MR框架。因为日常开发人员比较熟练的是结构化的数据处理,但是在HDFS直接存储的文件往往不具有结构化,所以催生出了HBase在HDFS上的操作。如果需要查询数据,只需要通过键值便可以成功访问。
HBase内置有Zookeeper,但我们一般会有其他的Zookeeper集群来监管master和RegionServer,Zookeeper通过选举,保证任何时候集群中只有一个活跃的HMaster,HMaster与HRegionServer启动时会向Zookeeper注册,存储所有HRegion的寻址入口,实时监控HRegionServer的上线和下线信息。并实时通知给HMaster,存储HBase的schema和table元数据,默认情况下,HBase管理Zookeeper实例,Zookeeper的引入使得HMaster不再是单点故障。一般情况下会启动两个Hmaster,非Active和HMaster会定期的和Active HMaster通信以获取其最新状态,从而保证它是实时更新的,因而如果启动了多个HMaster反而增加了Active HMaster的负担。
一个RegionServer可以包含多个HRegion,每个RegionServer维护一个HLog,和多个HFiles以及其对应的Memstore。RegionServer运行于DataNode上,数量可以与DataNode数量一致。
- Write-Ahead logs
HBase的修改记录,当对HBase读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead logfile的文件中,再写到内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
- HFile
这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。
- Store
HFile存储在Store中,一个Store对应HBase表中的一个列族。
- MemStore
内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在WAL中之后,RegionServer会在内存中存储键值对。
- Region
HBase表的分片,HBase表会根据RowKey值被切分成不同的Region存储在RegionServer中,在一个RegionServer中可以有多个不同的Region。
HBase的shell操作
[root@master apps]# hbase-daemon.sh start master[root@master apps]# hbase shell
HBase读写流程
- 读数据流程
- RegionServer保存着Meta表以及数据,要想访问数据,客户端必须先通过Zookeeper获取-ROOT-的位置
- 通过-ROOT-来获取Meta中的region的位置
- 客户端通过Meta获取数据的region位置
- 通过region的位置获取数据
- 写数据流程
- 客户端先访问Zookeeper,找到元数据信息
- 确定要写入的数据是在哪一个Region上
- 然后客户端向该RegionServer发送写数据的请求
- 客户端先把数据写入到HLog中,以及所需要的操作,防止数据的丢失
- 然后写如Memstore
- 如果HLog和Memstore均写入成功,则表示该数据写入成功,如果在这个过程中,Memstore的数据达到了阈值,就会将Memstore中数据刷新到storeflie
- storefile过多的时候,region就会越来越大,如果达到阈值,那么Region会被RegionServer一分为二
- storefile最后会不断溢出成Hfile
- 在RegionServer会再空闲的时候讲Hfile进行合并
若有收获,欢迎关注转发。