HBase(六): HBase体系结构剖析(上)

      HBase隶属于hadoop生态系统,它参考了谷歌的BigTable建模,实现的编程语言为 Java, 创建在hdfs之上,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统。它仅能经过主键(row key)和主键的range来检索数据,主要用来存储非结构化和半结构化的松散数据。与hadoop同样,Hbase目标主要依靠横向扩展,经过不断增长廉价的商用服务器,来增长计算和存储能力。Hbase数据库中的表通常有这样的特色: html

  • 大: 一个表能够有上亿行,上百万列
  • 面向列:  面向列(族)的存储和权限控制,列(族)独立检索
  • 稀疏: 对于为空(null)的列,并不占用存储空间,所以,表能够设计的很是稀疏

目录:算法

  • 系统架构
  • 数据模型
  • RegionServer
  • nameSpace
  • HBase寻址

系统架构:数据库


  • HBase采用Master/Slave架构搭建集群,由HMaster节点HRegionServer节点、ZooKeeper集群组成,而在底层,它将数据存储于HDFS中,于是涉及到HDFS的NN、DN等,整体结构以下(注意:hadoop(四): 本地 hbase 集群配置 Azure Blob Storage 介绍过,也能够将底层的存储配置为 Azure Blob StorageAmazon Web Services),图A较清楚表达各组件之间的访问及内部实现逻辑,图B更直观表达hbase 与 hadoop hdfs 部署结构及 hadoop NN 和 HMaster 的 SPOF 解决方案
  •  
  •                                     架构图A                                                                                                架构图B
  • Client的主要功能:
    1. 使用HBase的RPC机制与HMaster和HRegionServer进行通讯
    2. 对于管理类操做,Client与HMaster进行RPC
    3. 对于数据读写类操做,Client与HRegionServer进行RPC
  • Zookeeper功能:
    1. 经过选举,保证任什么时候候,集群中只有一个master,Master与RegionServers 启动时会向ZooKeeper注册
    2. 实时监控Region server的上线和下线信息,并实时通知给Master
    3. 存贮全部Region的寻址入口和HBase的schema和table元数据
    4. Zookeeper的引入实现HMaster主从节点的failover
    5. 详细工做原理以下图:
      1. 在HMaster和HRegionServer链接到ZooKeeper后建立Ephemeral节点,并使用Heartbeat机制维持这个节点的存活状态,若是某个Ephemeral节点失效,则HMaster会收到通知,并作相应的处理
      2. HMaster经过监听ZooKeeper中的Ephemeral节点(默认:/hbase/rs/*)来监控HRegionServer的加入和宕机
      3. 在第一个HMaster链接到ZooKeeper时会建立Ephemeral节点(默认:/hbasae/master)来表示Active的HMaster,其后加进来的HMaster则监听该Ephemeral节点,若是当前Active的HMaster宕机,则该节点消失,于是其余HMaster获得通知,而将自身转换成Active的HMaster,在变为Active的HMaster以前,它会建立在/hbase/back-masters/下建立本身的Ephemeral节点
  • HMaster功能:
    1. 管理HRegionServer,实现其负载均衡
    2. 管理和分配HRegion,好比在HRegion split时分配新的HRegion;在HRegionServer退出时迁移其内的HRegion到其余HRegionServer上
    3. 监控集群中全部HRegionServer的状态(经过Heartbeat和监听ZooKeeper中的状态)
    4. 处理schema更新请求 (建立、删除、修改Table的定义), 以下图:
  • HRegionServer功能:
    1. Region server维护Master分配给它的region,处理对这些region的IO请求
    2. Region server负责切分在运行过程当中变得过大的region
  • 小结:
    1. client访问hbase上数据的过程并不须要master参与(寻址访问zookeeper,数据读写访问regione server),master仅仅维护者table和region的元数据信息,负载很低
    2. HRegion所处理的数据尽可能和数据所在的DataNode在一块儿,实现数据的本地化

数据模型:编程


  • Table: 与传统关系型数据库相似,HBase以表(Table)的方式组织数据,应用程序将数据存入HBase表中
  • Row: HBase表中的行经过 RowKey 进行惟一标识,不管是数字仍是字符串,最终都会转换成字段数据进行存储;HBase表中的行是按RowKey字典顺序排列
  • Column Family: HBase表由行和列共同组织,同时引入列族的概念,它将一列或多列组织在一块儿,HBase的列必须属于某一个列族,在建立表时只需指定表名和至少一个列族
  • Cell: 行和列的交叉点称为单元格,单元格的内容就是列的值,以二进制形式存储,同时它是版本化
  • version: 每一个cell的值可保存数据的多个版本(到底支持几个版本可在建表时指定),按时间顺序倒序排列,时间戳是64位的整数,可在写入数据时赋值,也可由RegionServer自动赋值
  • 注意:
    1. HBase没有数据类型,任何列值都被转换成字符串进行存储
    2. 与关系型数据库在建立表时需明确包含的列及类型不一样,HBase表的每一行能够有不一样的列
    3. 相同RowKey的插入操做被认为是同一行的操做。即相同RowKey的二次写入操做,第二次可被可为是对该行某些列的更新操做
    4. 列由列族和列名链接而成, 分隔符是冒号,如  d:Name  (d: 列族名, Name: 列名)
  • 以一个示例来讲明关系型数据表和HBase表各自的解决方案(示例:博文及做者),关系型数据库表结构设计及数据以下图:
  •  
  •                (表结构设计)                                                                                       (示例数据)
  • 用HBase设计表结构以下图:
  • 存储示例数据以下:
  • 小结:
    1. HBase不支持条件查询和Order by等查询,读取记录只能按Row key(及其range)或全表扫描
    2. 在表建立时只需声明表名和至少一个列族名,每一个Column Family为一个存储单元,在下节物理模型会详细介绍
    3. 在上例中设计了一个HBase表blog,该表有两个列族:article和author,但在实际应用中强烈建议使用单列族
    4. Column不用建立表时定义即能够动态新增,同一Column Family的Columns会群聚在一个存储单元上,并依Column key排序,所以设计时应将具备相同I/O特性的Column设计在一个Column Family上以提升性能。注意:这个列是能够增长和删除的,这和咱们的传统数据库很大的区别。因此他适合非结构化数据
    5. HBase经过row和column肯定一份数据,这份数据的值可能有多个版本,不一样版本的值按照时间倒序排序,即最新的数据排在最前面,查询时默认返回最新版本。如上例中row key=1的author:nickname值有两个版本,分别为1317180070811对应的“一叶渡江”和1317180718830对应的“yedu”(对应到实际业务能够理解为在某时刻修改了nickname为yedu,但旧值仍然存在)。Timestamp默认为系统当前时间(精确到毫秒),也能够在写入数据时指定该值
    6. 每一个单元格值经过4个键惟一索引,tableName+RowKey+ColumnKey+Timestamp=>value, 例如上例中{tableName=’blog’,RowKey=’1’,ColumnName=’author:nickname’,Timestamp=’ 1317180718830’}索引到的惟一值是“yedu”
    7. 存储类型
      • TableName 是字符串
      • RowKey 和 ColumnName 是二进制值(Java 类型 byte[])
      • Timestamp 是一个 64 位整数(Java 类型 long)
      • value 是一个字节数组(Java类型 byte[])

RegionServer:数组


  • HRegionServer通常和DN在同一台机器上运行,实现数据的本地性,如图B。HRegionServer包含多个HRegion,由WAL(HLog)、BlockCache、MemStore、HFile组成,如图A,其中图A是0.94-的架构图,图B是0.96+的新架构图
  •                                 图A                                                                                                               图B
  • WAL(Write Ahead Log):它是HDFS上的一个文件,全部写操做都会先保证将数据写入这个Log文件后,才会真正更新MemStore,最后写入HFile中
  • 采用这种模式,能够保证HRegionServer宕机后,依然能够从该Log文件中读取数据,Replay全部的操做,来保证数据的一致性
  • 一个HRegionServer只有一个WAL实例,即一个HRegionServer的全部WAL写都是串行,这固然会引发性能问题,在HBase 1.0以后,经过HBASE-5699实现了多个WAL并行写(MultiWAL),该实现采用HDFS的多个管道写,以单个HRegion为单位
  • Log文件会按期Roll出新的文件而删除旧的文件(那些已持久化到HFile中的Log能够删除)。WAL文件存储在/hbase/WALs/${HRegionServer_Name}的目录中
  • BlockCache(图B):是一个读缓存,将数据预读取到内存中,以提高读的性能
  • HBase中提供两种BlockCache的实现:默认on-heap LruBlockCache和BucketCache(一般是off-heap)。一般BucketCache的性能要差于LruBlockCache,然而因为GC的影响,LruBlockCache的延迟会变的不稳定,而BucketCache因为是本身管理BlockCache,而不须要GC,于是它的延迟一般比较稳定,这也是有些时候须要选用BucketCache的缘由
  • HRegion:是一个Table中的一个Region在一个HRegionServer中的表达,是Hbase中分布式存储和负载均衡的最小单元
  • 一个Table拥有一个或多个Region,分布在一台或多台HRegionServer上
  • 一台HRegionServer包含多个HRegion,能够属于不一样的Table
  • 见图A,HRegion由多个Store(HStore)构成,每一个HStore对应了一个Table在这个HRegion中的一个Column Family,即每一个Column Family就是一个集中的存储单元
  • HStore是HBase中存储的核心,它实现了读写HDFS功能,一个HStore由一个MemStore 和0个或多个StoreFile组成
  • MemStore:是一个写缓存(In Memory Sorted Buffer),全部数据的写在完成WAL日志写后,会 写入MemStore中,由MemStore根据必定的算法将数据Flush到底层HDFS文件中(HFile),一般每一个HRegion中的每一个 Column Family有一个本身的MemStore
  • HFile(StoreFile): 用于存储HBase的数据(Cell/KeyValue)。在HFile中的数据是按RowKey、Column Family、Column排序,对相同的Cell(即这三个值都同样),则按timestamp倒序排列
  • 小结:
    1. Table中的全部行都按照row key的字典序排列,Table 在行的方向上分割为多个Hregion,以下图A
    2. region按大小分割的,每一个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,Hregion就会等分会两个新的Hregion,以下图B
    3.                          
    4.                                    图A                                                                      图B
    5. HRegion是Hbase中分布式存储和负载均衡的最小单元。最小单元就表示不一样的Hregion能够分布在不一样的HRegion server上。但一个Hregion是不会拆分到多个server上的,以下图
    6. HRegion虽然是分布式存储的最小单元,但并非存储的最小单元。事实上,HRegion由一个或者多个Store组成,每一个store保存一个columns family,每一个Strore又由一个memStore和0至多个StoreFile组成,以下图,说明:StoreFile以HFile格式保存在HDFS上

nameSpace缓存


  • 在HBase中,namespace命名空间指对一组表的逻辑分组,相似RDBMS中的database,方便对表在业务上划分。
  • Apache HBase从0.98.0, 0.95.2两个版本开始支持namespace级别的受权操做,HBase全局管理员能够建立、修改和回收namespace的受权
  • HBase系统默认定义了两个缺省的namespace,见以下图的目录结构:
    1. hbase:系统内建表,包括namespace和meta表
    2. default:用户建表时未指定namespace的表都建立在此
  •  

HBase寻址:服务器


  • 本节主要讨论的问题:Client访问用户数据时如何找到某个row key所在的region?
  • 0.94- 版本 Client访问用户数据以前须要首先访问zookeeper,而后访问-ROOT-表,接着访问.META.表,最后才能找到用户数据的位置去访问,中间须要屡次网络操做,以下图:
  • 0.96+ 删除了root 表,改成zookeeper里面的文件,以下图 A, 以读为例,寻址示意图如B
  •         
  •                图A                                                                                                 图B
  • 思考:若是root表信息存储在zookeeper文件,集群重建后,文件是如何还原?
相关文章
相关标签/搜索