今天扯一下 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 的使用方式:
- Hbase 对聚合等数据分析的查询不友好
- Hbase 针对 key 的范围查找和单点查找性能特别好
- 但是要是对 Hbase 的某一列进行单点查找,那就意味着遍历全表。
好的,在文章的最后做一下总结。了解一个数据库或者是一个组件,最好还是回归本源去理解它是怎么设计出来的,而不是直接去使用它。就和我在面试的时候,会问候选者,你认为 Hbase 是一个怎样的数据库,它适用于什么样的场景。然后大部分候选者,会直接使用百度搜索到的,列簇数据库、松散表啊,然后再问列簇的含义,和列式存储、行式存储有什么区别,大部分就懵逼了。很多人都没有真正的理解 Hbase ,可能就知道 Hbase 只适合使用 key 查询,而不知道为什么。
不多说了,这篇文章对 Hbase 的介绍就到此结束了。