HBase简介

HBase是一个构建在HDFS上的、分布式的、面向列的开源数据库,它是Apache Hadoop生态系统中的重要一员。

 

与mysql、oracle等关系型数据库RDBMS基于行模式的存储不同,HBase是基于列模式进行存储的,这使得它非常适合于存储海量非结构化或者半结构化的数据。通常HBase 需要构建在HDFS之上,并将其内部管理的数据文件全部存储在HDFS中。

HBase与RDBMS比较

 

RDBMS

HBase

存储模式

面向行

面向列(族)

事务支持

多行ACID

单行

查询语言

SQL

提供简单的查询API,get/put/scan ...

索引支持

任意列可添加索引

Row key索引

数据规模

TB

PB

读写效率

1000/s

百万/s

表结构

数万行,上千列

数亿行,百万列

数据结构

每行的列完全相同

每行的列可以不同

数据布局

空列也占用存储空间,紧凑

空列不占用存储空间,稀疏

数据多版本

不支持

支持,默认以时间戳作为版本号

数据类型

多种类型

仅支持字符串(Byte array )

HBase与HDFS比较

相同点

HBase与HDFS都具有良好的容错性和扩展性,都可以扩展到成百上千个节点。

不同点

HDFS适合批处理场景,不支持数据随机查找、不适合增量数据处理、不支持数据更新。而这些HDFS不适用的这些场景刚好HBase都能满足。

Hbase数据模型

HBase是基于Google BigTable模型开发的,典型的key/value系统。

Row Key

Row Key 可以看作是表中每条记录的“主键”。

Column Family

Column Family 包含一个或者多个相关Column(列)。

Column

Column 属于某一个 Column Family,包含在某一列中: familyName:columnName。

Version Number

每个唯一的 Row Key 可以同时保存多个版本的记录,默认以系统时间戳作为版本号,类型为Long。Version Number也可由用户指定,无需以递增的顺序插入。

Hbase物理模型

每个Column Family存储在HDFS上的一个单独文件中,Row Key和 Version Number在每个 Column Family中均有一份。

例如,上例中的多版本数据在Hbase中其实是这么存储的。

HBase 为每个值维护了多级索引,即:<key, column family, column name, timestamp>。

物理存储

Hbase会将Table中的所有行都按照row key的字典序排列,并将Table 在行的方向上分割为多个Region。

Region会按大小进行分割,每个表开始只有一个Region,随着数据增多, Region不断增大,当增大到一个阀值的时候,Region就会等分成两个新的region,之后会有越来越多的Region。

Region是HBase中分布式存储和负载均衡的最小单元。不同Region分布到不同RegionServer上。

Region虽然是分布式存储的最小单元,但并不是存储的最小单元。

每个Region由一个或者多个Store组成,每个store保存一个Column Family,每个Strore又由一个memStore和0至多个StoreFile组成。memStore 存储在内存中, StoreFile存储在HDFS或者磁盘上。用户写入的数据最先会保存在memStore 中,当memStore 中存储的数据大小达到一定阈值的时候会将其写入到StoreFile。

HBase架构

Client

Client包含访问HBase的接口,并维护cache来加快对HBase的访问。

Zookeeper

HBase 使用 ZooKeeper 来实现 Master的高可用。Master与RegionServers启动时会向ZooKeeper进行注册。当Master不可用时,ZooKeeper 会自动选举一个RegionServer作为新的Master,避免Master单点故障。

在HBase中ZooKeeper 主要的职责如下:

  • 保证任何时候,集群中有且只有一个Master
  • 保存所有Region的寻址入口
  • 实时监控Region server的上线和下线信息,并实时通知给Master
  • 存储HBase的schema和table元数据

默认情况下, HBase 管理ZooKeeper 实例,比如, 启动或者停止ZooKeeper。

Master

  • 为Region server分配region
  • 负责Region server的负载均衡
  • 发现失效的Region server并重新分配其上的region
  • 管理用户对table的增删改查操作

Region Server

  • 维护region,处理对这些region的IO请求
  • 负责切分在运行过程中变得过大的region

Write-Ahead-Log( WAL)

WAL(Write-Ahead-Log)预写日志是Hbase的RegionServer在处理数据插入和删除的过程中用来记录操作内容的一种日志。

Client 向RegionServer提交数据的时候,RegionServer首先会将操作日志写入到HLog文件中去,只有当WAL日志写入成功的时候,客户端才会被告诉提交数据成功,然后再真正提交操作。这样做的好处是,即使数据写入Region失败,也能够根据WAL日志中的记录进行重试,防止数据丢失。

HBase容错性

Master容错

当Master不可用时,Zookeeper会重新选择一个新的Master。

  • 无Master过程中,数据读取仍照常进行;
  • 无master过程中, Region切分、负载均衡等无法进行;

RegionServer容错

RegionServer定时向Zookeeper汇报心跳,如果一段时间内未出现心跳,Master会将该RegionServer上的Region重新分配到其他RegionServer上,并将失效服务器上WAL“预写”日志由主服务器进行分割并派送给其他RegionServer。

Region定位

当用户通过 Row Key 检索某一条记录时,Hbase需要先定位到记录所在的Region,然后再进行查找。

  • 从 ZooKeeper 获取到 -ROOT- 表所在的Location,-ROOT-表包含.META.表所在的Region列表,这个表只会有一个Region;
  • 从.META.表中获取到要检索的记录所在的Region,.META.表包含所有的用户表的Region列表,以及RegionServer的服务器地址;
  • 在Region中检索出相应的数据;

Hbase支持的操作

Hbase所有操作均是基于Row Key的,支持CRUD( Create、 Read、 Update和Delete)和Scan。Hbase没有内置Join操作,可使用MapReduce解决。

单行操作:

  • Put
  • Get
  • Scan

多行操作:

  • Scan
  • MultiPut

 

 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐