瞎扯 Hbase ,很多人都理解错了

2020-02-26 15:44:48 浏览数 (1)

今天扯一下 Hbase ,我对 Hbase 的了解起源于两篇文章Understanding HBase and BigTable和《李逵麻子,李鬼坑人--BigTable的数据模型》;这两篇本质上还是一篇文章,《李逵麻子,李鬼坑人--BigTable的数据模型》类似于Understanding HBase and BigTable的中文版讲解。还好的是我是先读的这两篇文章,再去看 Hbase 的官方文档和使用 Hbase ,否则真有可能被 Hbase 的概念给糊弄进去了。要知道,对一个软件或者工具,要想深刻理解和使用它,第一印象很重要,它决定你学习的进度,要是弄错了,学习的时候就会很痛苦,怎么也无法理解这个工具怎么设计的。

假设先抛开那两篇文章,看看一般的中文文章怎么介绍 Hbase 的。

HBase(Hadoop Database),是一个基于 Google BigTable 论文设计的高可靠性、高性能、可伸缩的分布式存储系统。 它有以下特征: 1.HBase 仍然是采用行存储的,采用松散表的结构来获得动态列的功能; 。。。

嗯,读到这里,你就会想 Hbase 是不是和传统的关系型数据库一样,是一种二维表结构,那所谓的“松散表”是什么意思呢?既然是行存储,那又是怎么做到“动态列”的?Hbase 是 “NoSQL” 数据库,那又是怎么个“No”?按照《李逵麻子,李鬼坑人--BigTable的数据模型》的说法,“因为BigTable借用了很多的关系数据库的术语来表示并非是关系数据库的东西,所以我们的理解就似是而非了。”

准确而言,Hbase 应该是

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

这句话才是 Hbase 的核心。

首先 Hbase 是一个 Map ,是和 Python 里的字典、Java 里的 TreeMap 和 HashMap是同一个东西。Hbase 不是传统的二维表结构,而是一个键值对,是和 Redis 一样的存储结构。类似于下面这样:

代码语言:javascript复制
{
  "zzzzz" : "woot",
  "xyz" : "hello",
  "aaaab" : "world",
  "1" : "x",
  "aaaaa" : "y"
}

The map is indexed by a row key, column key, and a timestamp; each value in the map is an uninterpreted array of bytes.

Hbase 使用的 Map 的主键是 row key 、column key 和 timestamp。是的,你没看错,Hbase 里面使用的 row 和 column 的概念,本质是 key 的一部分。

然后再看 sorted ,说明 Hbase 存储 map 的时候是有序的,一般来说是按照key的字符串再加上 timestamp 排序。

persistent 就好理解了,Hbase 底层的数据存储是 HDFS ,是分布式文件系统,可以保证数据持久化到硬盘,而且不因为单机的宕机而导致系统宕机。

最后的话,sparse 就是松散的意思,既然是 Map 结构,那就不保证每个行列组成的格子里面都有值。

明白了 Hbase 的结构,那么这也就限制了 Hbase 的使用方式:

  1. Hbase 对聚合等数据分析的查询不友好
  2. Hbase 针对 key 的范围查找和单点查找性能特别好
  3. 但是要是对 Hbase 的某一列进行单点查找,那就意味着遍历全表。

好的,在文章的最后做一下总结。了解一个数据库或者是一个组件,最好还是回归本源去理解它是怎么设计出来的,而不是直接去使用它。就和我在面试的时候,会问候选者,你认为 Hbase 是一个怎样的数据库,它适用于什么样的场景。然后大部分候选者,会直接使用百度搜索到的,列簇数据库、松散表啊,然后再问列簇的含义,和列式存储、行式存储有什么区别,大部分就懵逼了。很多人都没有真正的理解 Hbase ,可能就知道 Hbase 只适合使用 key 查询,而不知道为什么。

不多说了,这篇文章对 Hbase 的介绍就到此结束了。

0 人点赞