HBase数据库 及 HappyBase库
HBase概念
HBase
是一个分布式的、面向列的开源数据库HBase
是Google BigTable
的开源实现HBase
不同于一般的关系数据库, 适合非结构化数据存储- 是用来处理海量数据(
PB级
)快速实时读写的一种非关系型的数据库 - 并发数据处理,效率极高;易于扩展,支持动态伸缩
HBase
整合了Hadoop
的水平扩展能力和实时数据服务两方面的优势
注意:HBase
没有复杂的数据类型,仅有字节型数据 Bytes
一种,因此在读写数据时注意只用encode 和 decode
HBase 数据模型
NameSpace
: 关系型数据库的"数据库"(database
)- 表(
table
):用于存储管理数据,具有稀疏的、面向列的特点。HBase
中的每一张表,就是所谓的大表(Bigtable
),可以有上亿行,上百万列。对于为值为空的列,并不占用存储空间,因此表可以设计的非常稀疏 - 区域(
Region
):当HBase表
太大时,可将表水平划分成的多个区域,划分的区域随着数据的增大而增多-
行(
Row
):在表里面,每一行代表着一个数据对象,每一行都是以一个行键(Row Key
)来进行唯一标识的, 行键并没有什么特定的数据类型, 以二进制的字节来存储- 行键(
RowKey
):类似于MySQL
中的主键,HBase
根据行键来快速检索数据,一个行键对应一条记录。与MySQL
主键不同的是,HBase
的行键是天然固有(创建表示不用指定RowKey列
,但填入数据是必须在列数据前写入RowKey
)的,每一行数据都存在行键
- 行键(
-
列(
Column
):HBase
的列由CF:CQ
组成- 列族(
ColumnFamily
简CF
):是列的集合。列族在表定义时需要指定,而列在插入数据时动态指定。列中的数据都是以二进制形式存在,没有数据类型。在物理存储结构上,每个表中的每个列族单独以一个文件存储。一个表可以有多个列簇。 - 列修饰符(
Column Qualifier
简CQ
) : 列族中的数据通过列标识来进行映射, 可以理解为一个键值对(key-value
), 列修饰符(CQ
) 就是key
对应关系型数据库的列 - 时间戳(
TimeStamp
):是列的一个属性,是一个64
位整数。由行键和列确定的单元格,可以存储多个数据,每个数据含有时间戳属性,数据具有版本特性。可根据版本(VERSIONS
)或时间戳来指定查询历史版本数据,如果都不指定,则默认返回最新版本的数据
- 列族(
-
HBase
表由RowKey
和一个或者多个列族( CF
)组成,一个列族又可包含很多列(包含列修饰符CQ
和列值)
在HBase
中,常用:行、列、键、单元格、值、行键、时间戳等术语描述
- 行由很多列组成,全部由相同的行键引用
- 列由列族和列修饰符组成,一个列族可以包含很多列
- 单元格:一个列和行键确认一个单元格
- 一个单元格可以有很多版本,由不同时间戳的版本来区分
HBase 原理
HMaster 服务器
HBase
的Master
服务器是集群的大脑,负责下面这些操作:
Region
分配- 负载均衡
Regionserver
恢复Region
分裂完成监控- 追踪处于活动和岩机状态的服务器
为了达到高可用性,单个集群可以有多master
。但是只能有一个master
处于活动状态,负责上面的操作
HBase Master
不会有很大的负载压力,可以安装在内存和处理器核数比较小的服务器上,但是必须稳定可靠,不宕机
RegionServer
RegionServer (RS )
是 托管并服务HBase region
以及HBase
数据的应用程序。
- 维护
region
并 处理region
的读写请求 - 决定井处理
region
的分裂和合井,同时将信息报告给Maste
尽管 一个物理机上运行多个RegionServer
在技术上是可行的,我们仍然建议在一个物理节点上运行一个RegionServer
,并为其提供在两个服务器之间共享的资源。
表储存
读数据流程
当客户端第一次尝试从HBase
卖取数据的时候,首先,它会连接zookeeper
寻找master
服务器,并在HBase: meta
定位出region
的信息(它要查找的region
的位置信息以及RegionServer
信息)。若后面同样的客户端请求同样的region
,所有这些连接zookeeper
的过程都会被跳过,客户端直接跳到相关的RegionServer
上获得数据。这就是为什么在可能的情况下,使用同一台机器执行多次操作的一个重要原因
REST Server
HBase
提供了REST Server API
,通过该API
客户端以及管理性操作能够被
执行。 Rest API
能够通过HTTP
请求直接被客户端应用或者命令行应用(如curl
)调用。通过指定HTTP
头文件中的Accept
字段,你可以让REST server
来返回不同格式
的结果。下面是相关格式:
text/plain (consult the warning note at the end of this chapter for more information)
text/xml
application/octet-stream
application/x-protobuf