yunong
by yunong

Categories

  • hbase

Tags

  • 数据库

目录

Table of Contents

  1. 目录
    1. 表、行、列和单元格
    2. Region
    3. 存储API
    4. 结构实现
      1. HFile
      2. WAL
      3. 删除操作
      4. HFile合并
        1. Hbase管家机制
      5. HBase组件

BigTable是一个管理结构化数据的分布式系统,它可以拓展到非常大:如在成千上万的商用服务器上存储PB级的数据。……一个稀疏的、分布式的、持久的多维排序映射

表、行、列和单元格

Hbase最基本的是列(column), 一列或多列形成一行(row), 并由唯一的行键(row key)来确定存储, 若干行组成表(table)。其中每个列可能有多个版本,在每一个单元格(cell)中存储了不同的值。

一行由若干列组成,若干列又构成一个列族(column family),一个列族的所有列存储在同一个底层的存储文件(HFile)里。

每一列的值或单元格的值都具有时间戳,默认有系统指定,也可以用户显示设置。存储的时候一个列的多个版本按时间戳倒序排序。用户可以设置保留的最大的版本数。此外还支持谓词删除(predicate deletion), 如保留过去一周内写入的值。

  • 存取模型

    Hbase是一个稀疏的、分布式的、持久化的、多维的映射,由行键、列键和时间戳进行索引。

    于是就有了对应的数据存取模型: (Table, RowKey, Family, Column, Timestamp)->Value

    可以用一种更像编程语言的风格表示:

    SortedMap<
      RowKey, List<
        SortedMap<
          Column, List<
            Value, TimeStamp
          >
        >
      >
    >
    
  • 事务

    行数据的存取是原子的(atomic), 可以读写任意数目的列。目前还不支持跨行事务和跨表事务。原子存取也是促成系统架构具有强一致性(strictly consistent)的一个因素。

    使用多版本和时间戳同样能帮助解决应用层一致性问题

Region

Hbase中拓展和负载均衡的基本单元称为region, region本质上是以行键排序的连续存储的区间。

一张表初始只有一个region,用户开始向表中插入数据时,系统会检查这个region的大小,确保其不超过配置的最大值。如果超过了限制,系统会在中间键(middle key)处将这个region拆分成两个大致相等的子region

  • Regions

    20170606115324992

    每一个region只能由一台region服务器(region server加载),每一台region服务器可以同时加载多个region。

    region拆分和服务相当于其他系统提供的自动分区(autosharding)。当一个服务器上的region出现故障后,该服务器上的region可以快速回复,并获得细粒度的负责均衡。

存储API

Hbase没有提供查询数据的特定域查询语言,如SQL,数据存取不是以申明的形式完成的,而是通过客户端API以纯粹的命令完成的。

结构实现

HFile

数据存储在存储文件中(store file),称为HFile, HFile中存储的是经过排序的键值映射结构。

HFile内部由连续的块组成,块的索引信息存储在文件的尾部。每个块的大小是64KB,可以配置块大小,存储文件提供了一个设定起始和终止行键范围的API用于扫描特定的值。

HFile通常保存在HDFS中,HDFS提供了一个可拓展、持久的、冗余的Hbase存储层。

WAL

每次数据更新的时候,都会将数据记录在提交日志(commit log)中,在Hbase中叫预写日志write-ahead log,然后才会将这些数据写入内存中的memstore中。

内存写入的数据超过给定的阈值,系统会将这部分数据移出内存作为HFile文件写入磁盘中,然后丢弃对应的commit log。写入的数据是已经排好序的,因此HFile不需要做其他特殊处理。

WAL的用处是用在内存数据在服务器奔溃前没有写入到磁盘,通过WAL来进行恢复。

删除操作

因为存储文件是不可改变的,所以无法通过移除某个键值对来简单的删除值。通过对row打删除标记(delete marker, 又称为墓碑标记),表明给定的行已被删除的事实。检索的过程中,客户端读不到值

HFile合并

内存中的数据写入磁盘中,会产生很多小的HFile,需要将小的文件合并成大的文件。

Hbase管家机制

  • minor合并

    将多个小文件重写为数量较小的大文件,这个过程实际是一个通过多路归并的过程

  • major压缩合并

    将一个region中一个列族的若干个HFile重写为一个Hfile

    与minor合并相比:

    • 扫描所有的键值对顺序重写全部的数据
    • 重写过程中,删除被墓碑标记的数据
    • 断言删除的数据,例如过期的数据就不写入磁盘了

HBase组件

  • 客户端库
  • 一台主服务器
  • 多台region服务器