HBase基本知识介绍及典型案例分析

本次分享的内容主要分为以下五点:

  1. HBase基本知识;
  2. HBase读写流程;
  3. RowKey设计要点;
  4. HBase生态介绍;
  5. HBase典型案例分析。

首先我们简单介绍一下 HBase 是什么。

HBase基本知识介绍及典型案例分析_第1张图片

HBase 最开始是受 Google 的 BigTable 启发而开发的分布式、多版本、面向列的开源数据库。其主要特点是支持上亿行、百万列,支持强一致性、并且具有高扩展、高可用等特点。

既然 HBase 是一种分布式的数据库,那么其和传统的 RMDB 有什么区别的呢?我们先来看看HBase表核心概念,理解这些基本的核心概念对后面我理解 HBase 的读写以及如何设计 HBase 表有着重要的联系。

HBase基本知识介绍及典型案例分析_第2张图片

HBase 表主要由以下几个元素组成:

  1. RowKey:表中每条记录的主键;
  2. Column Family:列族,将表进行横向切割,后面简称CF;
  3. Column:属于某一个列族,可动态添加列;
  4. Version Number:类型为Long,默认值是系统时间戳,可由用户自定义;
  5. Value:真实的数据。

大家可以从上面的图看出:一行(Row)数据是可以包含一个或多个 Column Family,但是我们并不推荐一张 HBase 表的 Column Family 超过三个。Column 是属于 Column Family 的,一个 Column Family 包含一个或多个 Column。

在物理层面上,所有的数据其实是存放在 Region 里面的,而 Region 又由 RegionServer 管理,其对于的关系如下:

HBase基本知识介绍及典型案例分析_第3张图片

  1. Region:一段数据的集合;
  2. RegionServer:用于存放Region的服务。

从上面的图也可以清晰看到,一个 RegionServer 管理多个 Region;而一个 Region 管理一个或多个 Column Family。

到这里我们已经了解了 HBase 表的组成,但是 HBase 表里面的数据到底是怎么存储的呢?

HBase基本知识介绍及典型案例分析_第4张图片

上面是一张从逻辑上看 HBase 表形式,这个和关系型数据库很类似。那么如果我们再深入看,可以看出,这张表的划分可以如下图表示。

HBase基本知识介绍及典型案例分析_第5张图片

从上图大家可以明显看出,这张表有两个 Column Family ,分别为 personal 和 office。而 personal 又有三列name、city 以及 phone;office 有两列 tel 以及 address。由于存储在 HBase 里面的表一般有上亿行,所以 HBase 表会对整个数据按照 RowKey 进行字典排序,然后再对这张表进行横向切割。切割出来的数据是存储在 HFile 里面,而不同的 Column Family 虽然属于一行,但是其在底层存储是放在不同的 HFile 里。所以这张表我用了六种颜色表示,也就是说,这张表的数据会被放在六个 HFile 里面的,这就可以把数据尽可能的分散到整个集群。

在前面我们介绍了 HBase 其实是面向列的数据库,所以说一行 HBase 的数据其实是分了好几行存储,一个列对应一行,HBase 的 KV 结构如下:

HBase基本知识介绍及典型案例分析_第6张图片

为了简便起见,在后面的表示我们删除了类似于 Key Length 的属性,只保留 Row Key、Column Family、Column Qualifier等信息。所以 RowKey 为 Row1 的数据第一列表示为上图最后一行的形式。以此类推,整个表的存储就可以如下表示:

HBase基本知识介绍及典型案例分析_第7张图片

大家可以从上面的 kv 表现形式看出,Row11 的 phone 这列其实是没有数据的,在 HBase 的底层存储里面也就没有存储这列了,这点和我们传统的关系型数据库有很大的区别,有了这个特点, HBase 特别适合存储稀疏表。

我们前面也将了 HBase 其实是多版本的,那如果我们修改了 HBase 表的一列,HBase 又是如何存储的呢?

HBase基本知识介绍及典型案例分析_第8张图片

比如上如中我们将 Row1 的 city 列从北京修改为上海了,如果使用 KV 表示的话,我们可以看出其实底层存储了两条数据,这两条数据的版本是不一样的,最新的一条数据版本比之前的新。总结起来就是:

  1. HBase支持数据多版本特性,通过带有不同时间戳的多个KeyValue版本来实现的;
  2. 每次put,delete都会产生一个新的Cell,都拥有一个版本;
  3. 默认只存放数据的三个版本,可以配置;
  4. 查询默认返回最新版本的数据,可以通过制定版本号或版本数获取旧数据。

到这里我们已经了解了 HBase 表及其底层的 KV 存储了,现在让我们来了解一下 HBase 是如何读写数据的。首先我们来看看 HBase 的架构设计,这种图来自于社区:

HBase基本知识介绍及典型案例分析_第9张图片

HBase 的写过程如下:

  1. 先将数据写到WAL中;
  2. WAL 存放在HDFS之上;
  3. 每次Put、Delete操作的数据均追加到WAL末端;
  4. 持久化到WAL之后,再写到MemStore中;
  5. 两者写完返回ACK到客户端。

HBase基本知识介绍及典型案例分析_第10张图片

MemStore 其实是一种内存结构,一个Column Family 对应一个MemStore,MemStore 里面的数据也是对 Rowkey 进行字典排序的,如下:

HBase基本知识介绍及典型案例分析_第11张图片

 

 

 

 

 

 

 

 

HBase 在风控场景、车联网/物联网、广告推荐、电子商务等行业有这广泛的使用。下面是四个典型案例的架构,由于图片里有详细的文字,我就不再打出来了。

HBase基本知识介绍及典型案例分析_第12张图片

HBase基本知识介绍及典型案例分析_第13张图片

HBase基本知识介绍及典型案例分析_第14张图片

HBase基本知识介绍及典型案例分析_第15张图片

 

 

 

 

 

uploading.4e448015.gif转存失败重新上传取消

uploading.4e448015.gif转存失败重新上传取消

uploading.4e448015.gif转存失败重新上传取消

你可能感兴趣的:(HBase)