HBase是Apache Hadoop的数据库,可以对大型数据提供随机、实时的读写访问。HBase的目标是存储并处理大型的数据。HBase是一个开源的,分布式的,多版本的,面向列的存储模型。它存储的是松散型数据。数据库
HBase特性:编程
1 高可靠性数组
2 高效性缓存
3 面向列网络
4 可伸缩架构
5 可在廉价PC Server搭建大规模结构化存储集群负载均衡
HBase是Google BigTable的开源实现,其相互对应以下:编程语言
Google HBase
文件存储系统 GFS HDFS
海量数据处理 MapReduce Hadoop MapReduce
协同服务管理 Chubby Zookeeper分布式
HBase关系图:oop
HBase位于结构化存储层,围绕HBase,各部件对HBase的支持状况:
Hadoop部件 做用
HDFS 高可靠的底层存储支持
MapReduce 高性能的计算能力
Zookeeper 稳定服务和failover机制
Pig&Hive 高层语言支持,便于数据统计
Sqoop 提供RDBMS数据导入,便于传统数据库向HBase迁移
访问HBase的接口
方式 特色 场合
Native Java API 最常规和高效 Hadoop MapReduce Job并行处理HBase表数据
HBase Shell 最简单接口 HBase管理使用
Thrift Gateway 利用Thrift序列化支持多种语言 异构系统在线访问HBase表数据
Rest Gateway 解除语言限制 Rest风格Http API访问
Pig Pig Latin六十编程语言处理数据 数据统计
Hive 简单,SqlLike
HBase 数据模型
组成部件说明:
Row Key: Table主键 行键 Table中记录按照Row Key排序
Timestamp: 每次对数据操做对应的时间戳,也即数据的version number
Column Family: 列簇,一个table在水平方向有一个或者多个列簇,列簇可由任意多个Column组成,列簇支持动态扩展,无须预约义数量及类型,二进制存储,用户需自行进行类型转换
Table&Region
1. Table随着记录增多不断变大,会自动分裂成多份Splits,成为Regions
2. 一个region由[startkey,endkey)表示
3. 不一样region会被Master分配给相应的RegionServer进行管理
两张特殊表:-ROOT- & .META.
.META. 记录用户表的Region信息,同时,.META.也能够有多个region
-ROOT- 记录.META.表的Region信息,可是,-ROOT-只有一个region
Zookeeper中记录了-ROOT-表的location
客户端访问数据的流程:
Client -> Zookeeper -> -ROOT- -> .META. -> 用户数据表
屡次网络操做,不过client端有cache缓存
HBase 系统架构图
组成部件说明
Client:
使用HBase RPC机制与HMaster和HRegionServer进行通讯
Client与HMaster进行通讯进行管理类操做
Client与HRegionServer进行数据读写类操做
Zookeeper:
Zookeeper Quorum存储-ROOT-表地址、HMaster地址
HRegionServer把本身以Ephedral方式注册到Zookeeper中,HMaster随时感知各个HRegionServer的健康情况
Zookeeper避免HMaster单点问题
HMaster:
HMaster没有单点问题,HBase中能够启动多个HMaster,经过Zookeeper的Master Election机制保证总有一个Master在运行
主要负责Table和Region的管理工做:
1 管理用户对表的增删改查操做
2 管理HRegionServer的负载均衡,调整Region分布
3 Region Split后,负责新Region的分布
4 在HRegionServer停机后,负责失效HRegionServer上Region迁移
HRegionServer:
HBase中最核心的模块,主要负责响应用户I/O请求,向HDFS文件系统中读写数据
HRegionServer管理一些列HRegion对象;
每一个HRegion对应Table中一个Region,HRegion由多个HStore组成;
每一个HStore对应Table中一个Column Family的存储;
Column Family就是一个集中的存储单元,故将具备相同IO特性的Column放在一个Column Family会更高效
HStore:
HBase存储的核心。由MemStore和StoreFile组成。
MemStore是Sorted Memory Buffer。用户写入数据的流程:
Client写入 -> 存入MemStore,一直到MemStore满 -> Flush成一个StoreFile,直至增加到必定阈值 -> 出发Compact合并操做 -> 多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除 -> 当StoreFiles Compact后,逐步造成愈来愈大的StoreFile -> 单个StoreFile大小超过必定阈值后,触发Split操做,把当前Region Split成2个Region,Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上
由此过程可知,HBase只是增长数据,有所得更新和删除操做,都是在Compact阶段作的,因此,用户写操做只须要进入到内存便可当即返回,从而保证I/O高性能。
HLog
引入HLog缘由:
在分布式系统环境中,没法避免系统出错或者宕机,一旦HRegionServer之外退出,MemStore中的内存数据就会丢失,引入HLog就是防止这种状况
工做机制:
每一个HRegionServer中都会有一个HLog对象,HLog是一个实现Write Ahead Log的类,每次用户操做写入Memstore的同时,也会写一份数据到HLog文件,HLog文件按期会滚动出新,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会经过Zookeeper感知,HMaster首先处理遗留的HLog文件,将不一样region的log数据拆分,分别放到相应region目录下,而后再将失效的region从新分配,领取到这些region的HRegionServer在Load Region的过程当中,会发现有历史HLog须要处理,所以会Replay HLog中的数据到MemStore中,而后flush到StoreFiles,完成数据恢复。
HBase存储格式
HBase中的全部数据文件都存储在Hadoop HDFS文件系统上,格式主要有两种:
1 HFile HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对HFile作了轻量级包装,即StoreFile底层就是HFile
2 HLog File,HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File
HFile
图片解释:
HFile文件不定长,长度固定的块只有两个:Trailer和FileInfo
Trailer中指针指向其余数据块的起始点
File Info中记录了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等
Data Index和Meta Index块记录了每一个Data块和Meta块的起始点
Data Block是HBase I/O的基本单元,为了提升效率,HRegionServer中有基于LRU的Block Cache机制
每一个Data块的大小能够在建立一个Table的时候经过参数指定,大号的Block有利于顺序Scan,小号Block利于随机查询
每一个Data块除了开头的Magic之外就是一个个KeyValue对拼接而成, Magic内容就是一些随机数字,目的是防止数据损坏
HFile里面的每一个KeyValue对就是一个简单的byte数组。这个byte数组里面包含了不少项,而且有固定的结构。
KeyLength和ValueLength:两个固定的长度,分别表明Key和Value的长度
Key部分:Row Length是固定长度的数值,表示RowKey的长度,Row 就是RowKey
Column Family Length是固定长度的数值,表示Family的长度
接着就是Column Family,再接着是Qualifier,而后是两个固定长度的数值,表示Time Stamp和Key Type(Put/Delete)
Value部分没有这么复杂的结构,就是纯粹的二进制数据
HLog File
HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是“写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequence number。HLog Sequece File的Value是HBase的KeyValue对象,即对应HFile中的KeyValue