文章目录

  • 一、简介
  • 二、HBase相关概念
  • 列式存储
  • Row Key (行键)
  • Column Family(列族)
  • Column Qualifier (列限定符)
  • Column(列)
  • Cell
  • Timestamp(时间戳)
  • Region
  • Region Server
  • 三、HBase系统架构
  • Zookeeper
  • Master
  • Region Server
  • 四、操作HBase
  • Phoenix
  • 五、Hbase 协处理器
  • 协处理器类型
  • 1.Observer协处理器
  • 2.Endpoint协处理器
  • 参考


一、简介

HBase 是一个构建在 Hadoop 文件系统之上的面向列的数据库管理系统。

HBASE peer hbase peers_mysql


Hadoop 的缺陷在于它只能执行批处理,并且只能以顺序方式访问数据,这意味着即使是最简单的工作,也必须搜索整个数据集,无法实现对数据的随机访问。

实现数据的随机访问是传统的关系型数据库所擅长的,但它们却不能用于海量数据的存储。在这种情况下,必须有一种新的方案来解决海量数据存储和随机访问的问题,HBase 就是其中之一。

二、HBase相关概念

HBase中最核心的是表,表结构是与我们常见的SQL数据库是不太一样的,HBase是列式存储的

HBASE peer hbase peers_数据库_02


图片引用自 : HBase 是列式存储数据库吗 https://www.iteblog.com/archives/2498.html

Hbase 的表具有以下特点:

  • 容量大:一个表可以有数十亿行,上百万列;
  • 面向列:数据是按照列存储,每一列都单独存放,数据即索引,在查询时可以只访问指定列的数据,有效地降低了系统的 I/O 负担;
  • 稀疏性:空 (null) 列并不占用存储空间,表可以设计的非常稀疏 ;
  • 数据多版本:每个单元中的数据可以有多个版本,按照时间戳排序,新的数据在最上面;
  • 存储类型:所有数据的底层存储格式都是字节数组 (byte[])。

列式存储

  • 在行式存储中,一行一行的数据是连续存储的
  • 在列式存储中,是一列一列的数据连续存储的
  • 这样的好处在于如果只需要查询某一列的数据,是没必要把连续的一整行数据加载并查找的。

HBASE peer hbase peers_java_03

Row Key (行键)

Row Key 是用来检索记录的主键。想要访问 HBase Table 中的数据,只有以下三种方式:

  • 通过指定的 Row Key 进行访问;
  • 通过 Row Key 的 range 进行访问,即访问指定范围内的行;
  • 进行全表扫描。

Row Key 可以是任意字符串,存储时数据按照 Row Key 的字典序进行排序。这里需要注意以下两点:

  • 因为字典序对 Int 排序的结果是1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。如果你使用整型的字符串作为行键,那么为了保持整型的自然序,行键必须用 0 作左填充。
  • 行的一次读写操作时原子性的 (不论一次读写多少列)。

Column Family(列族)

HBase 表中的每个列,都归属于某个列族。列族是表的 Schema 的一部分,所以列族需要在创建表时进行定义。列族的所有列都以列族名作为前缀,例如 courses:historycourses:math 都属于 courses 这个列族。

例如在下图中,basic dataproperty data就是列族

HBASE peer hbase peers_数据库_04

Column Qualifier (列限定符)

列限定符,你可以理解为是具体的列名,例如 courses:historycourses:math 都属于 courses 这个列族,它们的列限定符分别是 historymath。需要注意的是列限定符不是表 Schema 的一部分,你可以在插入数据的过程中动态创建列。

Column(列)

Column并不是一个新概念,HBase 中的列由列族和列限定符组成,它们由 :(冒号) 进行分隔,即一个完整的列名应该表述为 列族名 :列限定符

Cell

Cell 是行,列族和列限定符的组合,并包含值和时间戳。你可以等价理解为关系型数据库中由指定行和指定列确定的一个单元格,但不同的是 HBase 中的一个单元格是由多个版本的数据组成的,每个版本的数据用时间戳进行区分。

Timestamp(时间戳)

HBase 中通过 row keycolumn 确定的为一个存储单元称为 Cell。每个 Cell 都保存着同一份数据的多个版本。版本通过时间戳来索引,时间戳的类型是 64 位整型,时间戳可以由 HBase 在数据写入时自动赋值,也可以由客户显式指定。每个 Cell 中,不同版本的数据按照时间戳倒序排列,即最新的数据排在最前面。

Region

HBase Table 中的所有行按照 Row Key 的字典序排列。HBase Tables 通过行键的范围 (row key range) 被水平切分成多个 Region, 一个 Region 包含了在 start key 和 end key 之间的所有行。

每个表一开始只有一个 Region,随着数据不断增加,Region 会不断增大,当增大到一个阀值的时候,Region 就会等分为两个新的 Region。当 Table 中的行不断增多,就会有越来越多的 Region

HBASE peer hbase peers_数据库_05


Region 是 HBase 中分布式存储和负载均衡的最小单元,不同的 Region 可以分布在不同的 Region Server

Region Server

Region Server 运行在 HDFS 的 DataNode 上。它具有以下组件:

  • WAL(Write Ahead Log,预写日志):用于存储尚未进持久化存储的数据记录,以便在发生故障时进行恢复。
  • BlockCache:读缓存。它将频繁读取的数据存储在内存中,如果存储不足,它将按照 最近最少使用原则 清除多余的数据。
  • MemStore:写缓存。它存储尚未写入磁盘的新数据,并会在数据写入磁盘之前对其进行排序。每个 Region 上的每个列族都有一个 MemStore。
  • HFile :将行数据按照 Key\Values 的形式存储在文件系统上。

三、HBase系统架构

HBase 系统遵循 Master/Salve 架构,由三种不同类型的组件组成:

Zookeeper

  1. 保证任何时候,集群中只有一个 Master;
  2. 存贮所有 Region 的寻址入口;
  3. 实时监控 Region Server 的状态,将 Region Server 的上线和下线信息实时通知给 Master;
  4. 存储 HBase 的 Schema,包括有哪些 Table,每个 Table 有哪些 Column Family 等信息。

Master

  1. 为 Region Server 分配 Region ;
  2. 负责 Region Server 的负载均衡 ;
  3. 发现失效的 Region Server 并重新分配其上的 Region;
  4. GFS 上的垃圾文件回收;
  5. 处理 Schema 的更新请求。

Region Server

  1. Region Server 负责维护 Master 分配给它的 Region ,并处理发送到 Region 上的 IO 请求;
  2. Region Server 负责切分在运行过程中变得过大的 Region。

HBASE peer hbase peers_java_06


HBase 使用 ZooKeeper 作为分布式协调服务来维护集群中的服务器状态。 Zookeeper 负责维护可用服务列表,并提供服务故障通知等服务:

  • 每个 Region Server 都会在 ZooKeeper 上创建一个临时节点,Master 通过 Zookeeper 的 Watcher 机制对节点进行监控,从而可以发现新加入的 Region Server 或故障退出的 Region Server;
  • 所有 Masters 会竞争性地在 Zookeeper 上创建同一个临时节点,由于 Zookeeper 只能有一个同名节点,所以必然只有一个 Master 能够创建成功,此时该 Master 就是主 Master,主 Master 会定期向 Zookeeper 发送心跳。备用 Masters 则通过 Watcher 机制对主 HMaster 所在节点进行监听;
  • 如果主 Master 未能定时发送心跳,则其持有的 Zookeeper 会话会过期,相应的临时节点也会被删除,这会触发定义在该节点上的 Watcher 事件,使得备用的 Master Servers 得到通知。所有备用的 Master Servers 在接到通知后,会再次去竞争性地创建临时节点,完成主 Master 的选举。
  • HBASE peer hbase peers_HBASE peer_07

四、操作HBase

HBase提供了Java API,但相比于使用一行 SQL 就能实现数据查询,HBase 的 API 还是过于复杂。

Phoenix

Phoenix 是 HBase 的开源 SQL 中间层,它允许你使用标准 JDBC 的方式来操作 HBase 上的数据。

Phoenix 的理念是 we put sql SQL back in NOSQL,即你可以使用标准的 SQL 就能完成对 HBase 上数据的操作。同时这也意味着你可以通过集成 Spring Data JPAMybatis 等常用的持久层框架来操作 HBase。

其次 Phoenix 的性能表现也非常优异,Phoenix 查询引擎会将 SQL 查询转换为一个或多个 HBase Scan,通过并行执行来生成标准的 JDBC 结果集。它通过直接使用 HBase API 以及协处理器和自定义过滤器,可以为小型数据查询提供毫秒级的性能,为千万行数据的查询提供秒级的性能。同时 Phoenix 还拥有二级索引等 HBase 不具备的特性,

因为以上的优点,所以 Phoenix 成为了 HBase 最优秀的 SQL 中间层。

五、Hbase 协处理器

协处理器是属于RegionServer的,我们可以把业务处理代码给到协处理器,将从Hbase查询到的数据,经过处理之后,再返回给客户端,这样就可以大大减少网络带宽

协处理器类型

1.Observer协处理器

Observer 协处理器类似于关系型数据库中的触发器,当发生某些事件的时候这类协处理器会被 Server 端调用。通常可以用来实现下面功能:

  • 权限校验:在执行 GetPut 操作之前,您可以使用 preGetprePut 方法检查权限;
  • 完整性约束: HBase 不支持关系型数据库中的外键功能,可以通过触发器在插入或者删除数据的时候,对关联的数据进行检查;
  • 二级索引: 可以使用协处理器来维护二级索引。

2.Endpoint协处理器

Endpoint 协处理器类似于关系型数据库中的存储过程。客户端可以调用 Endpoint 协处理器在服务端对数据进行处理,然后再返回。

以聚集操作为例,如果没有协处理器,当用户需要找出一张表中的最大数据,即 max 聚合操作,就必须进行全表扫描,然后在客户端上遍历扫描结果,这必然会加重了客户端处理数据的压力。利用 Coprocessor,用户可以将求最大值的代码部署到 HBase Server 端,HBase 将利用底层 cluster 的多个节点并发执行求最大值的操作。即在每个 Region 范围内执行求最大值的代码,将每个 Region 的最大值在 Region Server 端计算出来,仅仅将该 max 值返回给客户端。之后客户端只需要将每个 Region 的最大值进行比较而找到其中最大的值即可。

参考

https://github.com/heibaiying/BigData-Notes