面朝大海,春暖花开

大数据存储框架之 Phoenix (1) 概述
大数据存储框架之 HBase (1) 概述

HBase的架构

HBase

从上图,我们可以看出,一个标准的HBase的组成应该包含:Client , Zookeeper , Hmaster,HregionServer,HDFS,下面来介绍下这几个组件之间的相关功能:

  • Client

    Client包含了访问HBase的接口,另外Client还维护对应的cache来加速Hbase的访问,比如cachemeta元数据的信息。

  • Zookeeper

    HBase 通过 zookeeper 来做 master 的高可用、 RegionServer 的监控、元数据的入口以及
    集群配置的维护等工作。具体工作如下:
    通过Zoopkeeper 来保证集群中只有 1 个 master 在运行,如果 master 异常,会通过竞争
    机制产生新的 master 提供服务通过Zoopkeeper 来监控 RegionServer 的状态,当 RegionSevrer 有异常的时候,通过回调的形式通知 Master RegionServer 上下 线 的信息
    通过Zoopkeeper 存储元数据的统一入口地址

  • Hmaster

    • Regionserver分配Region
    • 维护整个集群的负载均衡
    • 维护集群的元数据信息
    • 发现失效的Region,并将失效的Region分配到正常的RegionServer
    • RegionServer失效的时候,协调对应的HLog的拆分
  • HregionServer

    • 管理master为其分配的Region
    • 处理来自客户端的读写请求
    • 负责和底层HDFS的交互,存储数据到HDFS
  • HDFS

    • 提供元数据和表数据的底层分布式存储服务

    • 数据多副本,保证高可靠和高可用性

HBase数据结构

Rowkey

相当于我们关系数据库中的主键,全表唯一。我们访问HBase中的行,一般有三种方式:

  • 通过单个Rowkey
  • 通过Rowkeyrange(正则)
  • 全表扫描

    Rowkey 设计原则

  • 长度原则
  • 散列原则
  • 唯一原则

Rowkey 的设计方案

  • 随机数
  • Hash
  • 散列值
  • 字符串反转

    Column Family

列族:HBASE 表中的每个列,都归属于某个列族。列族是表的 schema 的一部 分( 而列不是 ),必须在使用表之前定义。列名都以列族作为前缀。例如 courses:history courses:math都属于 courses 这个列族。

Cell

{rowkey, column Family columu , version} 唯一确定的单元。 cell 中的数据是没有类型的,全部是字节码形式存贮。

关键字:无类型、字节码

Time Stamp

HBase中通过rowkey和columns确定的为一个存贮单元称为cell。每个cell都保存着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是64位整型。时间戳可以由HBase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统。时间戳也可以是由客户显示赋值,如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳,每个cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。

为了避免数据存在过多版本造成的管理(包括存贮和索引)负担,HBase提供了两种数据版本回收方式,一是保存数据的最后 n 个版本,而是保存最近一段时间的版本(比如近七天),用户可以针对每个列族进行设置。

命名空间

命名空间结构:

1572590350006

  • Table表: 所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定,则在default默认的命名空间中;
  • RegionServer Group: 一个命名空间包含默认的RegionServer Group;
  • Permission: 权限,命名空间能够让我们来定义访问控制列表 ACL(Access Control List) , 比如创建表,读取表等;
  • Quota: 限额,可以强制一个命名空间可包含的region的数量

HBase的原理

读流程

1572590720917

  • Client 先访问 Zookeeper,从meta表读取region的位置,然后读取meta表中的数据。meta中有存储用户表的 region信息
  • 根据 namespace,表名和rowkeymeta表中找到对应的region信息
  • 找到这个region对应的regionserver
  • 先从MemStore找到数据,如果没有,再到BlockCache里面读
  • BlockCache还没有,再到StoreFile上读(为了读取的效率)
  • 如果是从StroFile里面读取的数据,不是直接返回客户端,而是先写入BlockCache,再返回给客户端。

写流程

1572590740409

  • Client HRegionServer发送请求
  • HRegionServer将数据写到HLogWrite Ahead Log).为了数据的吃持久化和恢复;
  • HRegionServer将数据写入到内存(MemStore
  • 反馈Client写成功

数据Flush过程

  • MemStore 数据达到阈值(默认是128M,老版本是64M),将数据刷到硬盘,将内存中的数据删除,同时删除HLog 中的历史数据;
  • 并将数据存储到HDFS
  • 在HLog

数据合并过程

  • 当数据块达到4 块,Hmaster 触发合并操作,Region 将数据块加载到本地,进行合并;
  • 当合并的数据超过256M,进行拆分,将拆分后的Region 分配给不同的HregionServer管理;
  • 当HregionServer 宕机后,将HregionServer 上的hlog 拆分,然后分配给不同的HregionServer加载,修改.META.;
  • 注意:HLog 会同步到HDFS。

Phoenix 的二级索引

这里要记住的是二级索引的原理。

这里可以参考这一篇文章: 大数据存储框架之 Phoenix (1) 概述