分布式列存储数据库Hbase简述

    Hadoop 可以通过 HDFS 来存储结构化、半结构甚至非结构化的数据,它是传统数据库的补充,是海量数据存储的最佳方法,它针对大文件的存储,批量访问和流式访问都做了优化,同时也通过多副本解决了容灾问题。但是 Hadoop 的缺陷在于它只能执行批处理,并且只能以顺序方式访问数据,这意味着即使是最简单的工作,也必须搜索整个数据集,无法实现对数据的随机访问。实现数据的随机访问是传统的关系型数据库所擅长的,但它们却不能用于海量数据的存储。在这种情况下,必须有一种新的方案来解决海量数据存储和随机访问的问题,HBase 就是其中之一 (HBase,Cassandra,couchDB,Dynamo 和 MongoDB 都能存储海量数据并支持随机访问),国内主要Hbase应用更为广泛。

基本概念

    Hbase是构建在Hadoop文件系统之上的面向列存储的分布式数据库。我觉得HBase 是一个面向 列族 的分布式数据库更为贴切。表 schema 仅定义列族,一个表可以有多个列族,每个列族可以包含任意数量的列,列由多个单元格(cell )组成,单元格可以存储多个版本的数据,多个版本数据以时间戳进行区分。

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:history,courses:math 都属于 courses 这个列族。

Column Qualifier (列限定符)

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

Column(列)

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

Cell

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

Timestamp(时间戳)

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

Hbase 的表具有以下特点:

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

存储结构

Regions

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

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

Region 是 HBase 中分布式存储和负载均衡的最小单元。这意味着不同的 Region 可以分布在不同的 Region Server 上。但一个 Region 是不会拆分到多个 Server 上的。
Region虽然是分布式存储的最小单元,但并不是存储的最小单元。事实上Region由一个或者多个Store组成,每个Store保存一个列族;每个Strore又由一个memStore和0至多个StoreFile组成;StoreFile以HFile格式保存在HDFS上。

Region Server

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

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

Region Server 存取一个子表时,会创建一个 Region 对象,然后对表的每个列族创建一个 Store 实例,每个 Store 会有 0 个或多个 StoreFile 与之对应,每个 StoreFile 则对应一个 HFile,HFile 就是实际存储在 HDFS 上的文件。

Hbase架构

    HBase 是一种类似于 Google’s Big Table 的数据模型的开源实现,它是 Hadoop 生态系统的一部分,它将数据存储在 HDFS 上,客户端可以通过 HBase 实现对 HDFS 上数据的随机访问。
在这里插入图片描述
HBase 系统遵循 Master/Salve 架构,由以下服务组成:
Zookeeper

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

Master

  • 为 Region Server 分配 Region
  • 负责 Region Server 的负载均衡
  • 发现失效的 Region Server 并重新分配其上的 Region
  • GFS 上的垃圾文件回收
  • 处理 Schema 的更新请求

RegionServer

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

服务之间的协作
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 的选举。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值