什么是hbase
HBASE是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBASE技术可在廉价PC Server上搭建起大规模结构化存储集群。
HBASE的目标是存储并处理大型的数据,更具体来说是仅需使用普通的硬件配置,就能够处理由成千上万的行和列所组成的大型数据。
HBASE是Google Bigtable的开源实现,但是也有很多不同之处。比如:Google Bigtable利用GFS作为其文件存储系统,HBASE利用Hadoop HDFS作为其文件存储系统;Google运行MAPREDUCE来处理Bigtable中的海量数据,HBASE同样利用Hadoop MapReduce来处理HBASE中的海量数据;Google Bigtable利用Chubby作为协同服务,HBASE利用Zookeeper作为对应。
MapReduce:离线计算
HBASE:可看做缓存(列式)数据库(内存中)

与传统数据库的对比
1、传统数据库遇到的问题:
1)数据量很大的时候无法存储
2)没有很好的备份机制
3)数据达到一定数量开始缓慢,很大的话基本无法支撑
2、HBASE优势:
1)线性扩展,随着数据量增多可以通过节点扩展进行支撑
2)数据存储在hdfs上,备份机制健全
3)通过zookeeper协调查找数据,访问速度块。
RDBMS:关系型数据库管理系统
hbase集群中的角色
1、一个或者多个主节点,Hmaster
2、多个从节点,HregionServer
hbase依赖zookeeper
保存Hmaster的地址和backup-master地址
- hmaster:
管理HregionServer
做增删改查表的节点
管理HregionServer中的表分配
保存表-ROOT-的地址
hbase默认的根表,检索表。
- HRegionServer列表
表的增删改查数据。
和hdfs交互,存取数据。
过滤器的种类
过滤器的种类:
列植过滤器—SingleColumnValueFilter
过滤列植的相等、不等、范围等
列名前缀过滤器—ColumnPrefixFilter
过滤指定前缀的列名
多个列名前缀过滤器—MultipleColumnPrefixFilter
过滤多个指定前缀的列名
rowKey过滤器—RowFilter
通过正则,过滤rowKey值。
列植过滤器—SingleColumnValueFilter
SingleColumnValueFilter 列值判断
相等 (CompareOp.EQUAL ),
不等(CompareOp.NOT_EQUAL),
范围 (e.g., CompareOp.GREATER)…………
下面示例检查列值和字符串’values’ 相等…
SingleColumnValueFilter f = new SingleColumnValueFilter(
Bytes.toBytes(“cFamily”) Bytes.toBytes(“column”), CompareFilter.CompareOp.EQUAL,
Bytes.toBytes(“values”));
s1.setFilter(f);
注意:如果过滤器过滤的列在数据表中有的行中不存在,那么这个过滤器对此行无法过滤。
列名前缀过滤器—ColumnPrefixFilter
过滤器—ColumnPrefixFilter
ColumnPrefixFilter 用于指定列名前缀值相等
ColumnPrefixFilter f = new ColumnPrefixFilter(Bytes.toBytes(“values”));
s1.setFilter(f);
多个列值前缀过滤器—MultipleColumnPrefixFilter
MultipleColumnPrefixFilter 和 ColumnPrefixFilter 行为差不多,但可以指定多个前缀
byte[][] prefixes = new byte[][] {Bytes.toBytes(“value1”),Bytes.toBytes(“value2”)};
Filter f = new MultipleColumnPrefixFilter(prefixes);
s1.setFilter(f);
rowKey过滤器—RowFilter
RowFilter 是rowkey过滤器
通常根据rowkey来指定范围时,使用scan扫描器的StartRow和StopRow方法比较好。
Filter f = new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator(“^1234”)); //匹配以1234开头的rowkey
s1.setFilter(f);
hbase原理
体系图
写流程
client向hregionserver发送写请求。
hregionserver将数据写到hlog(write ahead log)。为了数据的持久化和恢复。
hregionserver将数据写到内存(memstore)
反馈client写成功。
- Client通过zookeeper的调度,向HRegionServer发送写数据的请求,在HRegion中写数据。
2. 数据写入到HRegion的MemStore,直到MemStore达到预定的阈值。
3. MEMStore中的数据会被flush成一个StoreFile。
4. 随着storeFile的数量的增多,当达到一定的阈值会触发Compact合并操作,将多个StoreFile合成一个storeFile,同时把版本更新数据删除。
5. StoreFile通过不断的compact合并,逐渐形成越来越多越大的StoreFile。
6. 单个的StoreFile大小超过一定的阈值,会触发一个split操作,把当前HRegion Split成两个新的HRegion,老的HRegion就会下线,新生成的2个HRegion会被Hmaster分配到其他的HRegionServer上,使得一个HRegion的 压力分到2个HRegion上。数据flush过程
当memstore数据达到阈值(默认是64M),将数据刷到硬盘,将内存中的数据删除,同时删除Hlog中的历史数据。
并将数据存储到hdfs中。
在hlog中做标记点。
数据合并过程
当数据块达到4块,hmaster将数据块加载到本地,进行合并
当合并的数据超过256M,进行拆分,将拆分后的region分配给不同的hregionserver管理
当hregionser宕机后,将hregionserver上的hlog拆分,然后分配给不同的hregionserver加载,修改.META.
注意:hlog会同步到hdfs
hbase的读流程
通过zookeeper和-ROOT- .META.表定位hregionserver。
数据从内存和硬盘合并后返回给client
数据块会缓存
- Client访问zookeeper,查看ROOT表,获取META表的信息
2. 从META表中查找,获取存放目标数据的HRegion信息,从而找到HRegionserver的信息。
3. 通过HRegionServer找到相应的数据信息。
4. HRegionServer的内存分为两部分:1.MemStore 2.blockcache MemStore主要用于写操作,blockcache主要用于读操作 ,请求先到Memstore读取数据,如果没有再到blockcache中读取,再没有就会到StoreFile中读取。并把读取的数据放入到blockcache中。hmaster的职责
1、管理用户对Table的增、删、改、查操作;
2、记录region在哪台Hregion server上
3、在Region Split后,负责新Region的分配;
4、新机器加入时,管理HRegion Server的负载均衡,调整Region分布
5、在HRegion Server宕机后,负责失效HRegion Server 上的Regions迁移。
6、管理namespace和table的元数据
7、权限控制(ACL)hregionserver的职责
- HRegion Server主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBASE中最核心的模块。
- HRegion Server管理了很多table的分区,也就是region。
- HRegionserver负责切分在运行过程中变得过大的Hregion
- HRegionServer维护HRegion,处理对这些HRegion的IO请求
Client直接通过HRegionServer读写数据(从HMaster中获取元数据,找到RowKey所在的HRegion/HRegionServer后)
client职责
Client 包含访问HBase的接口,并维护cache来加快对HBase的访问,比如HRegion的位置信息。
HBASE Client使用HBASE的RPC机制与HMaster和RegionServer进行通信
管理类操作:Client与HMaster进行RPC;
数据读写类操作:Client与HRegionServer进行RPC。Hbase读写操作总结:
Client访问HBase上的数据的过程并不需要master参与(寻址访问zookeeper和region server)。
Master仅仅维护table和region的元数据信息,负载比较低。
Hbase的物理存储HRegion1
Table中所有行都按照row key的字典序排列
Table在行的方向上分割为多个HRegion(地区)
HRegion按大小分割的,每个表开始只有一个HRegion,随着数据增多,HRegion不断增大,当增大到一个阈值的时候,HRegion就会等分成两个新的HRegion,之后会有越来越多的Region。
HRegion是Hbase中分布式存储和负载均衡的最小单元,不同HRegion分布到不同HRegionSer上。
HFile是最小的存储单元。
HRegion由一个或者多个Store(存储)组成,每个Store保存一个columns family(列族)。每个columns family存储在HDFS上的一个单独文件中,空值不会被保存。
每个HRtrore又由一个MemStore和0至多个StoreFile组成,StoreFile包含HFile。
MemStore存储在内存中,StoreFile存储在HDFS上。
一个HRegionServer可以存放1000个HRegion
Hbase基本组件 Zookeeper1
通过选举,保证任何时候,集群中只有一个master,Master与RegionServers启动时会向Zookeeper注册。
存贮所有Region的寻址入口
实时监控Region server的上线和下线信息。并实时通知给Master
存储HBase的schema(概要)和table元数据。
Hbase基本组件 协同工作
HBase Client通过RPC方式和HMaster、HRegionServer通信。
一个HRegionServer可以存放1000个HRegion。
底层Table数据存储于HDFS中,而HRegion所处理的数据尽量和数据所在的DataNode在一起,实现数据的本地化。 数据本地化并不是总能实现,比如在HRegion移动(如因Split( 分裂))时,需要等下一次Compact才能继续回到本地化。
Hbase的数据恢复 HLog
每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类。
在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中。
HLog文件定期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)。
优点:减少文件个数,降低磁盘的寻址次数。缺点:恢复数据时需要拆分log。
Hbase的数据恢复 恢复过程
当HRegionServer意外终止后,HMaster会通过Zookeeper感知到。
HMaster首先会处理遗留的HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应region的目录下。
然后再将失效的region重新分配,领取到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理。 因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复。
Hbase的容错 HRegionServer
HRegionServer定时向Zookeeper汇报心跳。
如果一旦时间内未出现心跳,HMaster将该RegionServer上的Region重新分配到其他RegionServer上。
失效服务器上“预写”日志由主服务器进行分割并派送给新的HRegionServer。
Hbase的容错 HMaster
当现有Hmaster出现灾难无法运转,Zookeeper会重新选择一个新的Master,从而保障Master不再是单点故障。
无Master过程中,数据读取仍照常进行。
无master过程中,region切分、负载均衡等无法进行。
Hbase的容错 Zookeeper
Zookeeper是一个可靠地服务,一般配置3或5个Zookeeper实例。
Region定位流程:ZooKeeper—> -ROOT-(单Region)—> .META.—> 用户表
总结:
Hbase的物理存储包含:Region、RegionServer、 Store、 memStore和StoreFile
Hbase的基本组件包括:Client、Master、Region Server、Zookeeper
HRegionServer出现错误后,HMaster可以通过Zookeeper感知到,并通过Hlog恢复数据。
HRegionServer宕机可以通过HMaster重新恢复数据,HMaster宕机可以通过Zookeeper分配新的HMaster, Zookeeper可以配置多个保证安全可用。

