带你学习不一样的Hbase|概述|核心原理

Posted 涤生手记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带你学习不一样的Hbase|概述|核心原理相关的知识,希望对你有一定的参考价值。

        Hbase是什么?学习东西的一手资料就是看官网,看hbase官网的背书:一个基于hadoop的分布式的,可扩展的,可以大量存储的数据库,主要应对大量数据的随机读写需求,实现海量数据的实时随机读写。

       但是官网的表述往往是言简意赅,简洁客观性的陈述介绍。其实不利于很多初级学习者的学习和理解,或者不够的深入的和细节性的学习。技术是为了应用,技术的发展是为了解决已经存在问题。所以学一个技术框架,首先了解为什么需要它?它的出现是为了解决什么问题?以及它是如何解决的?把这个三个问题搞透了,也就对整个技术框架成竹在胸了,其他剩下就是深入的细节研究。  

1.为什么需要Hbase?

1.1Hbase的前世

        随着互联网的发展,企业收集的数据规模越来越大。所谓的大数据其实就是为了解决两个问题海量的数据存储+海量的数据计算 。 面对海量的数据存储,单机已经不可能在实现了。Google在面对海量网页信息存储的时候,弄出了一个GFS(后来的分布式文件存储系统HDFS/Hadoop基于此实现)进行分布式文件存储。

       但是很快Google又遇到了麻烦,随着数据规模的增大,Google的海量数据搜索,需要对数据进行建索引,那么数据在分布式多台服务器上存储时,如何维护这个巨大的数据索引?并且能保证它高度一致,可以低延迟随机读写,以及实现故障转移等?这个时候Google为了解决这个问题又搞出来一个BIgtable,Hbase的前世。

1.2 Bigtable是什么?

        Bigtable是一个分布式的结构化数据存储系统,用来处理海量数据,注意官方介绍不是数据库。在Google发表的关于Bigtable的论文中这样介绍:Bigtable是一个稀疏的、分布式的、持久化存储的多维度排序的Map。

A Bigtable is a sparse, distributed, persistent multidimensional sorted map.

          Map这玩意大家都知道,就是一个Key-value键值对。设计的Bigtable的key是一个复合的值,包含行键rowkey ,列键column key 和时间戳timestamp,而值value是一个字节数组。如下所示,其他的几点就不展开介绍了。

(rowkey:string,column:string,timestatmp:int)---> byte[]

          而后来Hbase是基于Google的Bigtable开源而来,所以Hbase的核心应该是一个MAP,而不是传统的数据库的二维表结构,所以如果只看官网,很容易误导人,没能真正地理解hbase。只是这里Hbase 使用的 Map 的主键更加复杂,是一个复合键由 row key行键 、column key列族(一个列族里可以在使用时任意添加拓展列,百万列的级别) ,qualifier列(也称限定符),type和 timestamp构成。

1.3 Hbase是什么?

         参照Bigtable的核心,Hbase定义也应该是一个稀疏的、分布式的、持久化存储的多维度排序的Map。

1.3.1分布式的

        Hbase存储在分布式文件系统上,如HDFS/S3等。所以Hbase底层数据是分布式存储在不同服务器上的。这里HDFS可以理解成硬盘,Hbase基于HDFS存储,不直接操作底层linux文件系统。

1.3.2 持久化的

      Hbase的数据在创建或访问它的程序完成后“持久化”存储在机器上

1.3.3排序的

   与大多数Map的实现不同,在 Hbase/BigTable 中,k-V键值对K严格按照字母顺序保存,即字典排序的,有序存放(也是其支持高效查询的原因之一),注意V不排序。也就是说,k“aaaaa”的行应该紧挨着k“aaaab”的行,并且离键“zzzzz”的行很远。

{ 
  “1”:“x”,
  “aaaaa”:“y”,
  “aaaab”:“世界”,
  “xyz”:“你好”,
  “zzzzz”:“woot” 
}

1.3.4 稀疏的

     给定的行在每个列族中可以有任意数量的列,或者根本没有列不.同行列数可以不同,不需要用null值填充,不占空间。

     另一种稀疏类型是基于行的间隙,这仅意味着键之间可能存在间隙,键不用连续

1.3.5多维

      多维如果从Map的角度看就是一个多维Map,从Hbase数据库的角度看多维一个是指基于列族的存储。另一个多维是指时间戳,所有数据都使用整数时间戳(自纪元以来的秒数)或您选择的另一个整数进行版本控制。具体后面在深入介绍。

      如下,才是Hbase的底层真面目:1张表,有三个列族,每个列族的里列数不固定,时间戳也不固定。Hbase底层是复合的(多维的)Map键值对格式存储。

         为什么官网又把Hbase叫做database呢?因为Hbase使用了大量数据库的概念:表,行,列等,数据以表的形式组织的,所以从数据库的角度看也是没有问题的。但是坑就坑在这,把Hhbae称呼成database,很不利于真正了解Hbase基本工作原理。

      Hbase底层依赖于HDFS进行文件存储,HDFS不支持随机读写,那么Hbase如何实现的可以支持随机读写呢?以及为何可以实现低延迟,近实时的数据读写操作呢?

2.先见森林,了解Hbase架构

2.1 hbase架构初见

如上图所以,先了解下Hbase集群架构

    1.Master/Slave模式,一个Hbase集群由一个活跃的Master节点(HA,可以多个备份Master)管理各种工作,以及多个RegionServer(负责实际干活)角色组成。

     2.RegionServer是Hbase核心的模块,用来响应用户的IO请求。如上图RegionServer组成:WAL(Hlog),BlockCache,N个region组成(N>=0)。

     3.Zookeeper主要是保证Master节点的HA,管理Hbase核心元数据(hbase:meta),提供分布式锁,保证对分布式存储的数据表进行分布式操作时状态的一致性。

      4.HDFS是Hbase底层实际存储数据的文件系统,可以理解成Hbase存储数据的硬盘,Hbase主要用它的分布式存储和数据高可靠性。

2.2 Hbase集群角色剖析

2.2.1核心的RegionServer

 如上图尖叫提示:

  • 1个RegionServer=1个WAL(HLOG)+1个BlockCache+N个Region(N>=0)
  • 1个Region=N 个Store(N>=1)
  • 一个Store=1个MemStore+N个HStoreFile(也叫HFile)(n>=1)       

1.Hlog(WAL预写日志)

    WAL(write ahead log),预写日志。这个其实是Hbase的一个安全机制,为了保障数据的高可靠性。Hbase在的客户端在操作数据时,不是直接操作底层数据(Hfile),而是先写入缓存(内存),为了防止缓存数据丢失,所以在写入缓存之前先写入Hlog(WAL,是落盘日志,一个滚动更新日志),这样万一缓存断电丢失等可以从HLOG中恢复,有点类似mysql的binlog日志;

2.BlockCache(非主要)

    这个主要是Hbase的读缓存,缓存是block块,注意这个block块不是HDFS的block,而是Hbase的block,默认值64k。主要作用是从磁盘读取数据后缓存到内存里,防止后续再次读取这样就不需要访问磁盘了,对于热点数据有利于提高请求性能,类似于HDFS的块读取缓存机制。

3.Region及其内部剖析

          Region是一个表的“水平分片”,即一个表一部分。简单理解举个例子:一个表10亿行,2个列族,大概平均每行10万列左右,那么如何存储呢,一个节点肯定存储不了。那么这时候就给表按行切分存储,比如rowkey1-10000行为一个Region,存储在某个节点上,其他依次类推。

         那么表的Region如何切分呢?当表的大小超过某个阈值时就会切分成两个(默认10GB),然后由Master节点根据负载均衡原则分配到不同的RegionServer(RS)上存储。所以一个生产上的RS会同时管理多个表的多个Region所以Region是Hbase中表的分布式存储单元,但是注意其实Region只是一个逻辑划分的概念,实际底层存储的Store。那么为什么表切分后不直接叫Store呢?因为表是按排序后的rowkey范围切分的,要保证每个切分都是唯一的单元。而Store其实存储的是列族,Store个数等于列族个数。每个表会不止一个列族,且每个表的列族个数不确定,没法唯一标识这个表的切片,所以加了一个逻辑层叫Region(里面有一个或多个Store组成)

       一个Region由具体有多少个Store组成呢?1个Region的Store个数的取决于这个Region对应表的列族个数,比如这个表只有1个列族,那么这个表对应的所有的Region都只有一个Store,同理表有N个列族,表单个Region就有N个Store。

       一个Store=1个MemStore+N个HStoreFile(也叫HFile)(n>=1)   。MemStore其实是一个写缓存,客户端写数据时,先写入MemStore内存中,其实就是一个环形缓冲区,当其写入的数据超过指定的阈值(比如写满默认128Mb或者某个设置的百分比)时,就会Flush到HDFS上成一个Hfile文件。因为缓冲区不大,所以写数据时会有大量的HFile产生,

       当Hfile的文件个数超过某个设置的阈值后就会进行Compact合并(大合并和小合并),合并成一个或多个大文件。当某个Region下面的所有文件之和超过设定的Region大小时,这个Region又会分裂成两个。

2.2Hbase的性能

2.2.1优势

1.存储容量大,TB,甚至PB的数据规模。我们公司使用的Hbase数据规模在1PB规模,千亿行,甚至万亿行的规模。

2.拓展性强,分布式部署,拓展。

3.高性能,低延迟,

4.多版本,支持数据多版本,稀疏性存储,节省空间

2.2.2缺点

1.不支持复杂的聚合运算,后者需要借助第三方工具,如Phoenix等。

2.不支持去全局跨行事务等,没有实现二级索引等。

以上是关于带你学习不一样的Hbase|概述|核心原理的主要内容,如果未能解决你的问题,请参考以下文章

深入Hbase原理(超详细)

带你涨姿势,Hbase 概念原理扫盲 !

深入学习Hbase架构原理

Hbase总结

如何做好容器化管理?腾讯架构师一篇文章带你吃透 Docker 原理

Hbase原理基本概念基本架构