简单认识Hbase

Posted mohanchen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单认识Hbase相关的知识,希望对你有一定的参考价值。

  • 什么是HBase数据库
    • HBase是分布式、面向列族的开源数据库;
    • HDFS为HBase提供可靠的底层数据存储服务;
    • Zookeeper为HBase提供稳定服务和Failover机制;
    • HBase是一个通过大量廉价机器解决海量数据的高速存储和读取的分布式数据库解决方案案。
  • HBase数据库有什么特点
    • 海量存储

      HBase适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在几百毫秒内返回数据。

    • 列式存储

      这里说的列式存储其实说的是列族存储,HBase是根据列族来存储数据的,列族下面可以有非常多的列,列族在创建表时就必须制定。

      为了加深对HBase列族的理解,下面是一个简单的关系型数据库的表和HBase数据库的表:

      关系型数据库的表

      技术图片

        Hbase表

技术图片

下图是针对HBase和关系型数据库的基本的一个比较

技术图片

    • 极易扩展

      HBase的扩展性主要体现在两个方面,一个是基于上层处理能力的扩展,一个是基于存储的扩展。通过横向添加RegionServer的机器,进行水平扩展,提升Hbase上层处理能力,提升HBase服务更多Region的能力。

    • 高并发  

    由于目前大部分使用Hbase的架构,都是采用的廉价PC,因此单个IO的延迟其实并不小,一般在几十到上百ms之间。这里说的高并发,主要是在并发的情况下,Hbase的单个IO延迟下降并不多。能获得高并发、低延迟的服务。

    • 稀疏

    稀疏主要是针对Hbase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。

  • Hbase的几个概念
    • 列族

    Column Family又叫列族,Hbase通过列族划分数据的存储,列族下面可以包含任意多的列,实现灵活的数据存取。刚接触的时候,理解起来有点吃力。我想到了一个非常类似的概念,理解起来就非常容易了。那就是家族的概念,我们知道一个家族是由于很多个的家庭组成的。列族也类似,列族是由一个一个的列组成(任意多)。

    Hbase表的创建的时候就必须指定列族。就像关系型数据库创建的时候必须指定具体的列是一样的。

    Hbase的列族不是越多越好,官方推荐的是列族最好小于或者等于3。我们使用的场景一般是1个列族。

    • Rowkey的概念

      Rowkey的概念和mysql中的主键是完全一样的,Hbase使用Rowkey来唯一的区分某一行的数据。

      由于Hbase只支持3中查询方式:

      • 基于Rowkey的单行查询
      • 基于Rowkey的范围扫描
      • 全表扫描

      因此,Rowkey对Hbase的性能影响非常大,Rowkey的设计就显得尤为的重要。

    • Region的概念

      Region的概念和关系型数据库的分区或者分片差不多。 Hbase会将一个大表的数据基于Rowkey的不同范围分配到不通的Region中,每个Region负责一定范围的数据访问和存储。这样即使是一张巨大的表,由于被切割到不通的region,访问起来的时延也很低。

    • TimeStamp的概念  

      TimeStamp对Hbase来说至关重要,因为它是实现Hbase多版本的关键。在Hbase中使用不同的timestame来标识相同rowkey行对应的不通版本的数据。

      在写入数据的时候,如果用户没有指定对应的timestamp,Hbase会自动添加一个timestamp,timestamp和服务器时间保持一致。 在Hbase中,相同rowkey的数据按照timestamp倒序排列。默认查询的是最新的版本,用户可同指定timestamp的值来读取旧版本的数据。

  • HBase的架构

  HBase的架构图如下:

  技术图片

从图中可以看出Hbase是由Client、Zookeeper、Master、HRegionServer、HDFS等几个组建组成,下面来介绍一下几个组建的相关功能:

    • Client

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

    •  Zookeeper

      Hbase通过Zookeeper来做master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作。具体工作如下:

      通过Zoopkeeper来保证集群中只有1个master在运行,如果master异常,会通过竞争机制产生新的master提供服务

      通过Zoopkeeper来监控RegionServer的状态,当RegionSevrer有异常的时候,通过回调的形式通知Master RegionServer上下限的信息

      通过Zoopkeeper存储元数据的统一入口地址

    • Hmaster

      master节点的主要职责如下:

      为RegionServer分配Region 维护整个集群的负载均衡   

      维护集群的元数据信息

      发现失效的Region,并将失效的Region分配到正常的RegionServer上

      当RegionSever失效的时候,协调对应Hlog的拆分

    • HRegionServer

      HregionServer直接对接用户的读写请求,是真正的“干活”的节点。它的功能概括如下:

      管理master为其分配的Region

      处理来自客户端的读写请求

      负责和底层HDFS的交互,

      存储数据到HDFS

      负责Region变大以后的拆分

      负责Storefile的合并工作  

    •  HDFS

      HDFS为Hbase提供最终的底层数据存储服务,同时为Hbase提供高可用(Hlog存储在HDFS)的支持,具体功能概括如下:

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

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

    •  HRegion      

       HRegion是一个Table中的一个Region在一个HRegionServer中的表达。一个Table可以有一个或多个Region,他们可以在一个相同的HRegionServer上,也可以分布在不同的HRegionServer上,一个HRegionServer可以有多个HRegion,他们分别属于不同的Table。

    • HStore

      HRegion由多个Store(HStore)构成,每个HStore对应了一个Table在这个HRegion中的一个Column Family,即每个Column Family就是一个集中的存储单元,因而最好将具有相近IO特性的Column存储在一个Column Family,以实现高效读取(数据局部性原理,可以提高缓存的命中率)。HStore是HBase中存储的核心,它实现了读写HDFS功能,一个HStore由一个MemStore 和0个或多个StoreFile组成。

    • MemStore

       MemStore是一个写缓存(In Memory Sorted Buffer),所有数据的写在完成WAL日志写后,会 写入MemStore中,由MemStore根据一定的算法将数据Flush到地层HDFS文件中(HFile),通常每个HRegion中的每个 Column Family有一个自己的MemStore。

    • HFile

      HFile(StoreFile) 用于存储HBase的数据(Cell/KeyValue)。在HFile中的数据是按RowKey、Column Family、Column排序,对相同的Cell(即这三个值都一样),则按timestamp倒序排列。

    • Hlog

    WAL即Write Ahead Log,在早期版本中称为HLog,它是HDFS上的一个文件,如其名字所表示的,所有写操作都会先保证将数据写入这个Log文件后,才会真正更新MemStore,最后写入HFile中。采用这种模式,可以保证HRegionServer宕机后,我们依然可以从该Log文件中读取数据,Replay所有的操作,而不至于数据丢失。

以上是关于简单认识Hbase的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop+Hbase分布式集群架构“完全篇

HBase的简单java操作

HBase学习01(HBase入门及HBase Shell简单操作)

HBase学习01(HBase入门及HBase Shell简单操作)

HBase学习01(HBase入门及HBase Shell简单操作)

Hbase 认识及其作用