PRELOADER

当前文章 : 《认识hbase》

5/5/2019 —— 

Hbase是什么

hbase是一款数据库,mysql它也是数据库,但是我们称之为传统的关系型数据库。Hbase是适合大数据分析的数据库。我们考虑一下mysql是怎么存的?一条记录一行这种方式适合保存数据和提取数据。但是我们想象大数据情况下,我们要每条记录是没有意义的,我们往往都是找出某一列对所有记录进行分析,比如平均工资,我们不关心某个人的工资,但是我们需要整个列的工资。而hbase就是按列存储的数据库。

HBase的起源

HBase的原型是Google的BigTable论文,受到了该论文思想的启发,目前作为Hadoop的子项目来开发维护,用于支持结构化的数据存储。
官方网站:http://hbase.apache.org

  • 2006年Google发表BigTable白皮书
  • 2006年开始开发HBase
  • 2008年北京成功开奥运会,程序员默默地将HBase弄成了Hadoop的子项目
  • 2010年HBase成为Apache顶级项目
  • 现在很多公司二次开发出了很多发行版本,你也开始使用了

Hbase的特点

和传统数据库表相比hbase有如下不同:

  1. 巨大:一个表可以有数十亿行,上百万列,他不像传统数据库为了减少数据的冗余分很多表。
  2. 面向列:面向列(族)的存储和权限控制,列(族)独立检索;
  3. 稀疏:对于空(null)的列,并不占用存储空间,表可以设计的非常稀疏;
  4. 数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是时间戳;
  5. 数据类型单一:Hbase中的数据都是字符串,没有类型。

Hbase中的一些概念

Hbase中的表大概长这个样子和mysql表的概念是类似的。表中有行有列

认识hbase

列族

有意思的是表中有列但是多个列上面还有一个概念叫列族。列和列族的关系是一个列族内可以有多个列并且可以动态增减。这时非常奇怪的一个设计我们解释一下。
首先,hbase认为我们一般不会有全列查询就是类似于select * 的操作。这样的话每个列族有独立的存储单元可以提高查询效率。通过将列分成不同的列族hbase可以更少的访问磁盘。所以千万不要把经常查询的两个列放在不同的列族里,这样会导致hbase要访问两块磁盘区域。

rowkey

行键,非常关键类似mysq中的主键唯一标识一行记录。我们知道要想做到高效速度快就离不开索引,hbase就是真的使用rowkey做索引。而且会根据row可以进行排序,保证类似或相同的rowkey都集中在一起,以提高效率。

数据类型

hbase中存储的都是二进制信息,所以没啥数据类型的概念,操作时以字符串格式为基准。

cell

存储数据的单元格。

Timestamp

时间戳 hbase根据时间戳来区别相同rowkey记录。
总述:Hbase中存储数据的最基本的单位是列,一列或多列单元格数据形成一行,并由row key决定。一个表有若干行。每列可能有多个版本。

Hbase的基本工作原理

用户在表格中存储数据,每行都有一个可排序的主键和任意多的列。由于是稀松存储,所以同一张表里面的每行数据都可以有截然不同的列。
列名字的格式是“:”(<列族>:<限定符>),都是由字符串组成的。每一张表有一个列族(family)集合,这个集合是固定不变的,只能通过改变表结构来改变。
但是限定符(qualifier)的值相对于每一行来说都是可以改变的。HBase把同一个列族里面的数据存储在同一个目录底下,并且HBase的写操作是锁行的,每一行来说都是一个原子元素,都可以加锁。
HBase所有数据的更新都有一个时间戳标记,每个更新都是一个新的版本,HBase会保留一定数量的版本,这个值是可以设定的。客户端可以选择获取距离某个时间点最近的版本单元的值,或者一次获取所有版本单元的值。

HBase的环境角色

HMaster功能简述

  1. 监控RegionServer
  2. 处理RegionServer故障转移
  3. 处理元数据的变更
  4. 处理region的分配或移除
  5. 在空闲时间进行数据的负载均衡
  6. 通过Zookeeper发布自己的位置给客户端

RegionServer功能简述

  1. 负责存储HBase的实际数据
  2. 处理分配给它的Region
  3. 刷新缓存到HDFS
  4. 维护HLog
  5. 执行压缩
  6. 负责处理Region分片

组件简述

Write-Ahead logs

HBase的修改记录,当对HBase读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。如果机器突然原地爆炸,把数据保存在内存中会引起数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead logfile的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。

HFile

这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。

Store

HFile存储在Store中,一个Store对应HBase表中的一个列族

MemStore

顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在WAL中之后,RegsionServer会在内存中存储键值对。

Region

Hbase表的分片,HBase表会根据RowKey值被切分成不同的region存储在RegionServer中,在一个RegionServer中可以有多个不同的region

Hbase的架构

HBase 一种是作为存储的分布式文件系统,另一种是作为数据处理模型的 MR 框架。因为日常开发人员比较熟练的是结构化的数据进行处理,但是在 HDFS 直接存储的文件往往不具有结构化,所以催生出了 HBase 在 HDFS 上的操作。如果需要查询数据,只需要通过键值便可以成功访问。
架构图示:

认识hbase

HBase内置有zookeeper,但一般我们会有其他的Zookeeper集群来监管master和regionserver,Zookeeper通过选举,保证任何时候,集群中只有一个活跃的HMaster,HMaster与HRegionServer 启动时会向ZooKeeper注册,存储所有HRegion的寻址入口,实时监控HRegionserver的上线和下线信息。并实时通知给HMaster,存储HBase的schema和table元数据,默认情况下,HBase 管理ZooKeeper 实例,Zookeeper的引入使得HMaster不再是单点故障。一般情况下会启动两个HMaster,非Active的HMaster会定期的和Active HMaster通信以获取其最新状态,从而保证它是实时更新的,因而如果启动了多个HMaster反而增加了Active HMaster的负担。
一个RegionServer可以包含多个HRegion,每个RegionServer维护一个HLog,和多个HFiles以及其对应的MemStore。RegionServer运行于DataNode上,数量可以与DatNode数量一致。
参考架构图: