HBase简介:数据库
HBase---Hadoop DataBase,是一个高可靠、高性能、面向列、可存储、实时读写的分布式数据库apache
利用HBase HDFS做为其文件存储系统数组
HBase数据模型:缓存
(1)RowKey:架构
决定一行数据,按照字典顺序排序,RowKey只能存储64K字节数据app
(2)Column Family列族 & qualifier列:负载均衡
HBase表中某个列都归属某个列族,列族必须做为表模式(schema)定义的一部分预先给出。分布式
列名以列族做为前缀,每一个列族均可以有多个列成员(cloumn)oop
HBase把同一列族里面的数据存储在统一目录下,由几个文件保存性能
(3)Timestamp时间戳
在HBase每一个cell存储单元对同一份数据有多个版本,根据惟一的时间戳来区分每一个版本之间的差别,不一样版本的数据按照时间倒序排序,最新的数据版本排在最前面;
时间戳的类型是64位整型
时间戳能够由HBase(在数据写入时自动赋值)此时时间戳是精确到毫秒的当前系统时间
时间戳也能够由客户显示赋值,若是应用程序之间要避免数据版本冲突,就必须本身生成具备惟一性的时间戳
(4)Cell单元格
由行和列的坐标交叉决定;单元格是有版本的;单元格的内容是未解析的字节数组
(5)HLog(WAL Log)
HLog文件就是一个普通的Hadoop Sequence File,Sequence File的key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了Table和Region名字外,同时还包括sequence number和timestamp,“timestamp”是写入时间;
sequence number的起始值为0,或者是最近一次存入文件系统中sequence number
HLog SequenceFile的Value是HBase的keyValue是HBase的KeyValue对象,即对应HFile中的KeyValue
HBase体系架构
(1)Client
包含访问HBase的接口并维护cache来加快对HBase的访问
(2)Zookeeper
保证任什么时候候,集群中只有一个Master处于active状态
存储全部Region的寻址入口
实时监控Region Server的上下线信息,并实时通知Master
存储HBase的schema和table元数据信息
(3)Master
为Region Server分配region
负责Region Server的负载均衡
发现失效的Region Server,并从新分配失效Region Server上的Region
管理用户对table的增删改操做
(6)Region Server
Region Server维护region,处理对这些region的IO请求
Region Server负责切分在运行过程当中变得过大的Region
(7)Memstore和storefile
一个region由多个store组成,一个store对应一个CF;
store包括内存中的memstore和位于磁盘的storefile,写操做先写入memstore,当memstore中的数据达到某个阈值时,hregionserver会启动flushcache进程写入storefile,每次写入造成一个单独的storefile
当storefile文件数量增加到必定阈值的时候,系统会进行minor、major compaction,在合并过程当中会进行版本合并和删除工做,造成更大的storefile
当一个region中全部storefile的大小和数量超过必定阈值的时候,会把当前的region分割为两个,并由hmaster分配到相应的regionserver上,实现负载均衡
客户端检索数据,先在memstore上找,找不到再去storefile中找
HRegion是HBase中分布式存储和负载均衡的最小单元。最小单元就表示不一样HRegion能够分布在不一样HRegion Server上面
HBase读写流程:
读流程: 1、Client先访问zookeeper,从meta表读取region的位置,而后读取meta表中的数据。meta中又存储了用户表的region信息。 2、根据namespace、表名和rowkey在meta表中找到对应的region信息 3、找到这个region对应的regionserver 4、查找对应的region 5、先从MemStore找数据,若是没有,再到StoreFile上读(为了读取的效率)。
写流程: 1、Client先访问zookeeper,从meta表获取相应region信息,而后找到meta表的数据 2、根据namespace、表名和rowkey根据meta表的数据找到写入数据对应的region信息 3、找到对应的regionserver 4、把数据分别写到HLog和MemStore上一份 5、MemStore达到一个阈值后则把数据刷成一个StoreFile文件。(若MemStore中的数据有丢失,则能够总HLog上恢复) 6、当多个StoreFile文件达到必定的大小后,会触发Compact合并操做,合并为一个StoreFile,(这里同时进行版本的合并和数据删除。) 7、当Storefile大小超过必定阈值后,会把当前的Region分割为两个(Split),并由Hmaster分配到相应的HRegionServer,实现负载均衡
HBase Compaction
主要有Minor Compaction和Major Compaction
Minor Compaction:指选取一些小的、相邻的storefile将他们合并成更大的StoreFile,在这个过程不会处理Delete或者Expired的Cell
Major Compaction:指将全部的StoreFile合并成一个StoreFile,在这个过程当中会有清理三类无心义数据:被删除的数据,TTL过时的数据,版本号超过设定版本的数据,整个过程会消耗大量的系统资源
Compaction就是使用短期的IO消耗以及带宽消耗换取后续查询的低延迟
Compaction流程:
Compaction出发时机始于特定的触发条件,好比flush、周期性的Compaction检查操做或手动触发,一旦触发,HBase会将该Compaction交由一个单独的线程去操做
Memstore Flush:memstore flush 会产生一个hfile文件,文件愈来愈多就须要compact,一旦文件数大于设定值就会进行compact
后台线程周期性检查:手动触发,通常不会作过多的检查,直接执行合并
sanpshort流程:
主要分为如下几个步骤:
(1)加一把全局锁,此时不容许任何数据写入更新以及删除操做
(2)将memstore中缓存的数据flush(可选)
(3)为全部hfile文件分别新建引用指引,这些指针元数据就是snapshort
功能:
(1)全量/增量的备份
(2)对重要数据业务进行快照,若是发生错误后可回滚以前的快照点
(3)数据迁移,使用ExportSnapshot功能将快照到另外一个集群
snapshort使用:
(1)为表'sourceTable'打一个快照'snapshotName',快照并不涉及数据移动,能够在线完成
hbase> snapshot 'sourceTable','snapshotName'
(2)恢复指定快照,恢复过程会替代原有数据,将表还原到快照点,快照点以后的全部更新数据将会丢失,须要注意的是原有表须要先disable,而后才能恢复操做
hbase> restore_snapshot 'snapshotName'
(3)根据快照恢复出一个新表,恢复过程不涉及数据移动,能够在秒级完成
hbase> clone_snapshot 'snapshotName','tableName'
使用ExportSnapshot命令能够将A集群的快照数据迁移到B集群,ExportSnapshot是HDFS层面的操做,会使用MR进行数据的并行迁移,所以须要在开启MR的机器上进行迁移。HMaster和HRegionServer并不参与这个过程,所以不会带来额外的内存开销以及GC开销。惟一的影响是DN在拷贝数据的时候须要额外的带宽以及IO负载,ExportSnapshot也针对这个问题设置了参数-bandwidth来限制带宽的使用。
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot \ -snapshot MySnapshot -copy-from hdfs://srv2:8082/hbase \ -copy-to hdfs://srv1:50070/hbase -mappers 16 -bandwidth 1024\
HBase优化:
(1)表的设计:
(2)写表操做:
(3)读表操做