HBASE数据库
简介
base 是 bigtable 的开源 java 版本。是建立在 hdfs 之上,提供高可靠性、高性能、列存储、
可伸缩、实时读写 nosql 的数据库系统。
它介于 nosql 和 RDBMS 之间,仅能通过主键(row key)和主键的 range 来检索数据,仅支持单行事务(可通过 hive 支持来实现多表 join 等复杂操作)。
主要用来存储结构化和半结构化的松散数据。
结构化:数据结构字段含义确定,清晰,典型的如数据库中的表结构.
半结构化:具有一定结构,但语义不够确定,典型的如 HTML 网页,有些字段是确定的(title),有些不确定(table)
非结构化:杂乱无章的数据,很难按照一个概念去进行抽取,无规律性
Hbase 查询数据功能很简单,不支持 join 等复杂操作,不支持复杂的事务(行级的事务)
Hbase 中支持的数据类型: byte[]
与 hadoop 一样, Hbase 目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。
HBase 中的表一般有这样的特点:
1、 大:一个表可以有上十亿行,上百万列
2、 面向列:面向列(族)的存储和权限控制,列(族)独立检索。
3、 稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
表结构逻辑视图
Rowkey
访问 hbase table 中的行,只有三种方式:
1、 通过单个 row key 访问
2、 通过 row key 的 range
3、 全表扫描
Row key 行键 (Row key)可以是任意字符串(最大长度是 64KB,实际应用中长度一般为10-100bytes,在 hbase 内部, row key 保存为字节数组。 Hbase 会对表中的数据按照 rowkey排序(字典顺序)
[推荐8或者16位]
存储时,数据按照 Row key 的字典序(byte order)排序存储。设计 key 时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。 (位置相关性)
行的一次读写是原子操作 (不论一次读写多少列)。
列簇( Column Family
hbase 表中的每个列,都归属与某个列族。列族是表的 schema 的一部分(而列不是),必须在使用表之前定义。
名都以列族作为前缀。例如 courses:history courses:math 都属于 courses 这个列族。

访问控制、磁盘和内存的使用统计都是在列族层面进行的。
[不要设置很多的列簇]
时间戳
HBase 中通row columns 确定的为一个存贮单元称为 cell每个 cell 都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64 位整型。时间戳可以由 hbase(在数据写入时自动 )赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个 cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担, hbase 提供了两种数据版本回收方式:
保存数据的最后 n 个版本
保存最近一段时间内的版本(设置数据的生命周期 TTL)。
用户可以针对每个列族进行设置。
Cell
由{row key, column( =<family> + <label>), version} 唯一确定的单元。
cell 中的数据是没有类型的,全部是字节码形式存
Hbase集结构
Hbase基本概念
RowKey:是Byte array,是表中每条记录的“主键”,方便快速查,Rowkey的设计非常重要。
Column Family:列族,拥有一个名称(string),包含一个或者多个相关列
Column:属于某一个columnfamily,familyName:columnName,每条记录可动态添加
Version Number:类型为Long,默认值是系统时间戳,可由用户自定义
Value(Cell):Byte arra
Hbase物理模型
每个column family存储在HDFS上的一个单独文件中,空值不会被保存
Key 和 Version number在每个 column family中均有一份;
HBase 为每个值维护了多级索引,即:<key, column family, column name, timestamp>
物理存储:
1、Table中所有行都按照row key的字典序排列;
2、Table在行的方向上分割为多个Region;
3、Region按大小分割的,每个表开始只有一个region,随着数据增多,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region,之后会有越来越多的region;
4、Region是Hbase中分布式存储和负载均衡的最小单元,不同Region分布到不同RegionServer上。
5、Region虽然是分布式存储的最小单元但并不是存储的最小单元
Region由一个或者多个Store组成,每个store保存一个columns family
每个Strore又由一个memStore和0至多个StoreFilehbase属于什么数据库组成,StoreFile包含HFile
memStore存储在内存中,StoreFile存储在HDFS上。
HBase架构及基本组件
Hbase基本组件说明:
Client
包含访问HBase的接口,并维护cache来加快对HBase的访问,比如region的位置信息
Master
为Region server分配region
负责Region server的负载均衡
现失效的Region server并重新分配其上的region
管理用户对table的增删改查操作
Region Server
Regionserver维护region,处理对这些region的IO请求
Regionserver负责切分在运行过程中变得过大的region
Zookeeper作用
通过选举,保证任何时候,集中只有一个master,Master与RegionServers 启动时会向ZooKeeper注册
存贮所有Region的寻址入口
实时监控Region server的上线和下线信息。并实时通知给Master
存储HBase的schema和table元数据
默认情况下,HBase 管理ZooKeeper 实例,比如, 启动或者停止ZooKeeper
Zookeeper的引入使得Master不再是单点故障
Write-Ahead-Log(WAL)
该机制用于数据的容错和恢复:
每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每
次用户操作写入MemStore的同时也会写一份数据到HLog文件中(HLog文件格式见后续),HLog文件定期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的 HLog文件将其中不同Region的Log数据进行拆分,分别放到相应region的目录下然后再将失效的region重新分配,领取到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复