HBase 基本原理

来源:互联网 发布:盖革计数器知乎 编辑:程序博客网 时间:2024/05/17 11:57

简介

HBase是Apache Hadoop生态系统中的重要一员,而且与hadoop一样,依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。HBase基于Google 的 BigTable 模型开发,是典型的键-值(key-value)存储系统。它将数据按照表、行和列的逻辑结构进行存储,是构建在HDFS之上的面向列、可伸缩的分布式数据库。与HDFS只能批量处理和顺序访问数据不同,HBase能以随机的方式访问、存储和检索数据库。在Hadoop生态系统中,HBase位于结构化存储层,HDFS为HBase提供了高可靠性的底层存储支持, MapReduce为HBase提供了高性能的计算能力,Zookeeper为HBase提供了稳定服务和failover机制,Pig和Hive为HBase提供了高层语言支持,Sqoop为HBase提供了便捷的RDBMS数据导入功能。

图1. Hadoop 生态圈

HBase表

HBase是一个面向列的数据库,数据库中的表由行构成,每行由唯一的行键(Row Key)来确定存储;行是列族的集合,一行可以有多个列族,每个列族又可以有任意多列。

  • Row Key: 行键,表的主键,可以是任意字符串(最大长度64KB)。在HBase表中,数据按照Row key的字典序排序存储,并根据Row Key进行检索。访问Hbase表中的行有三种方式:
    • 通过单个row key访问
    • 通过row key的range
    • 全表扫描
  • 列族:列族是表的一部分,必须在使用表之前定义。Hbase表中的每个列都归属与某个列族,列名都以列族作为前缀。访问控制、磁盘和内存的使用统计都是在列族层面进行的。
  • 时间戳:Hbase中通过行和列确定的为一个存贮单元称为cell。每个 cell都保存着同一份数据的多个版本,版本通过时间戳来索引。时间戳是 64位的整型数据,可以由Hbase 在数据写入时自动赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个 cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
  • Cell:由{row key, column, version} 唯一确定的单元。cell中的数据没有类型,全部是字节码形式存贮。

Hbase表的特点

  • 大:一个表可以有数十亿行,上百万列
  • 无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列
  • 面向列:面向列(族)的存储和权限控制,列(族)独立检索
  • 稀疏:空列并不占用存储空间,表可以设计的非常稀疏
  • 数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳
  • 数据类型单一:表中数据都是字符串,没有类型

HBase表的存储

HBase中扩展和负载均衡的基本单元称作region,是一个以行键排序的连续存储空间。如果region过大,系统就会把它们动态拆分,相反的,就把多个region合并,以减少存储文件数量。一个表最开始只有一个region,用户开始向表中插入数据时,系统会检查region大小,确保不会超过配置的最大值。如果超过,会从region中行键的中间值一分为二,将该region分为大小大致相等的两个region。每个region只能由一个region server加载,每一台region服务器可以同时加载多个region。

这里写图片描述

HBase系统架构

HBase采用Master/Slave架构搭建集群,由HMaster节点、HRegionServer节点、ZooKeeper集群构成。在系统底层,它将数据存储于HDFS中,因而涉及到HDFS的NameNode、DataNode等节点,总体架构图如下所示

这里写图片描述

  • HMaster节点:管理HRegionServer,调整Region分布,实现负载均衡;在Region Split后,负责新Region的分配;在HRegionServer停机后,负责失效HRegionServer上的Regions迁移;管理用户对Table的增、删、改、查操作。
  • HRegionServer节点:维护Master分配给它的Region,处理对这些Region的IO请求,向HDFS文件系统中读写数据,是HBase中最核心的模块。HRegionServer内部管理了一系列HRegion对象(对应了表中的一个Region),每个HRegion由多 个HStore组成,每个HStore对应了表中的一个列族的存储。
  • ZooKeeper集群:存放整个 HBase集群的元数据以及集群的状态信息,实现HMaster主从节点的failover。Zookeeper Quorum中除了存储了-ROOT-表的地址和HMaster的地址,HRegionServer也会把自己注册到Zookeeper中,使得HMaster可以随时感知到各个HRegionServer的健康状态。此外,Zookeeper也避免了HMaster的单点问题。
  • Client:使用RPC机制与HMaster和HRegionServer进行通信。对于管理类操作(如建表,删表等),Client和HMaster进行RPC;对于数据读写类操作,Client和HRegionServer进行RPC。

两种表

HBase中有两张特殊的表:-ROOT-和.META.。其中,.META.表记录了用户表的Region信息,可以有多个regoin。-ROOT-表记录了.META.表的Region信息,-ROOT-只有一个region,Zookeeper中记录了-ROOT-表的location。用户通过客户端访问数据之前需要首先访问Zookeeper,然后访问-ROOT-表,接着访问.META.表,最后才能找到用户数据的位置去访问,中间需要多次网络操作,不过客户端会做缓存。

这里写图片描述

存储格式

HBase中所有数据都存储在Hadoop HDFS文件系统上,主要包括以下两种文件类型:

  • HFile: HBase中Key-Value数据的存储格式,HFile是Hadoop的二进制格式文件
  • HLog File:HBase中WAL(Write Ahead Log) 的存储格式,物理上是Hadoop的Sequence File

这里写图片描述
HFile文件是不定长的,长度固定的只有其中的两块:Trailer和FileInfo。如上图所示,Trailer中有指针指向其他数据块的起始点。File Info中记录了文件的一些Meta信息。Data Index和Meta Index块记录了每个Data块和Meta块的起始点。Data Block是HBase I/O的基本单元,为了提高效率,HRegionServer中有基于LRU的Block Cache机制。每个Data块的大小可以在创建一个Table的时候通过参数指定,大号的Block有利于顺序Scan,小号Block利于随机查询。每个Data块除了开头的Magic以外就是一个个Key-Value对拼接而成, Magic内容就是一些随机数字,目的是防止数据损坏。HFile里面的每个Key-Value对就是一个简单的byte数组。

这里写图片描述
HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是“写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequence number。HLog Sequece File的Value是HBase的Key-Value对象,即对应HFile中的Key-Value。

0 0
原创粉丝点击