云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!


学习 HBase 最难的地方在于要让你的脑子真正理解它是什么。

HBase:Google BigTable 的开源实现

我们经常会把关系型数据库(RDBMS,比如 MySQL)和 HBase 搞混,因为在这两个系统中都包含 table 和 base(HBase,Database)。

这篇文章的目标是从概念上来说清楚 HBase 这个分布式的数据存储系统。读完后,你应该可以很清楚的知道什么情况下 HBase 更好,什么情况下传统的关系型数据库更好。

关于一些术语

幸运的是,Google 的 BigTable论文清楚的解释了 BigTable 到底是什么。下面是论文中数据模型章节的第一句话:

BigTable 是一个稀疏的、分布式的、可持久化的多维有序 map。

在这个节骨眼上,我想给读者一个机会,让他们在读到最后一行字时,能够收集到他们脑壳里的活动信息(这可能是个笑话,但我没懂^v^)。

论文中,继续解释如下:

map 通过 rowKey,columnKey 和时间戳进行索引,map 中的每个值都是一个连续的字节数组。

注:rowKey 是记录的主键,唯一标识一行记录

在 Hadoop 的官方文档中,也对 HBase 的架构做了说明:

HBase 使用了与 BigTable 非常类似的数据模型。用户存储数据行到特定的表中。一个数据行有一个可排序的 rowKey 和数量不定的列。这个表是稀疏的,只要用户愿意,这个表不同行可以有完全不同的列。

这些话看起来相当费解,让人摸不着头脑,但如果你把这些话拆成一个个词,意思就慢慢变的清晰了。我将按照以下的顺序来讨论这些词:map,持久化,分布式,有序的,多维的,稀疏。

我发现循序渐进地建立一个思维框架要比一次性勾画一个完整的系统更加容易。

map

从根本来上来,HBase/BigTable 是一个 map。map 在不同的编程语言中有不同的叫法,比如 PHP 中的 array,Python 的 dictionary,Ruby 中的 Hash,或者 JavaScript 中的 Object。

维基百科上对于 map 的定义是:map 是一个抽象的数据类型,包含了一组 key 和一组 value,每个 key 关联一个 value。

如果用 JavaScript 的对象来表示 map,这里有一个简单的例子,其中所有的 value 都是字符串:

{"zzzzz" : "woot","xyz" : "hello","aaaab" : "world","1" : "x","aaaaa" : "y"
}

持久化的

持久化的意思仅仅是指你放进这个特殊 map 的数据会在你的程序执行完成之后被保存下来。它和其他的持久化存储系统中持久化的概念没有任何区别,比如存一个文件到一个文件系统。我们继续...

分布式的

HBase 和 BigTable 都建立在分布式文件系统上,所以底层文件可以被分散存储到不同的机器上。

HBase 可以存储到 HDFS(Hadoop's Distributed File System)上,也可以存储到 亚马逊的 S3(Simple Storage Service)上,而 BigTable 使用的是 GFS(Google File System)。

同一份数据会被复制存储到多个节点上,类似于 RAID(独立冗余磁盘阵列,利用冗余存储的数据使损坏数据得以恢复,从而保护数据不丢失)系统中数据在磁盘上的复制存储到多块磁盘的方式。

在这篇文章中,我们不关心具体使用哪种分布式文件系统。重要的是,要理解这个文件系统是分布式的,即使集群中某个节点出现故障,也可以保证数据的完整性和安全性。

有序的

和其他大多数 map 的实现不同,HBase 和 BigTable 的键值对的顺序严格按照字母顺序来排列。所以 rowKey 为 "aaaaa" 的下一条记录的 rowKey 就是 "aaaab",并且会离 “zzzz” 非常远。

继续看上面的那个 JSON 例子,排行序之后是下面这样的:

{"1" : "x","aaaaa" : "y","aaaab" : "world","xyz" : "hello","zzzzz" : "woot"
}

因为这个系统是分布式的,而且会越来越大,因此排序这个特性非常重要。这样就会把 rowKey 相近的记录放在一起,在某些情况下,如果你必须要扫描表(通常不推荐),那就能保证你需要获取的记录都在一块。

那么如何选择 rowKey 就非常重要。比如说,一个表的 rowKey 就是域名。一个比较好的方式就是将域名进行反转来作为 rowKey(使用 “com.jimbojw.www”,而不要使用 “www.jimbojw.com”),这样,同一个域名下的记录就可以存储在相邻的位置。

继续上面的域名例子,rowKey 为 “mail.jimbojw.com” 行应该与 “www.jimbojw.com” 行更近,而不是 “mail.xyz.com”,如果不把域名反转存储,就会发生这种情况。

需要注意的是,在 HBase / BigTable 中,有序并不意味着值是有序的。除了 rowKey 以外,没有任内容会被排序,在这点上和普通 map 的实现一致。

多维的

到目前为止,我们还没有提过任何关于列的概念,而是将表在概念上当做常规的 map。我是故意这么做的。列和表、base 等词一样,都带有传统关系型数据库多年的情感包袱。

然而,我发现把 HBase 理解为一个多维的 map 会容易很多,map 的 map。给上面的 JSON 再加上一列:

{"1" : {"A" : "x","B" : "z"},"aaaaa" : {"A" : "y","B" : "w"},"aaaab" : {"A" : "world","B" : "ocean"},"xyz" : {"A" : "hello","B" : "there"},"zzzzz" : {"A" : "woot","B" : "1337"}
}

在上面的例子中你可以看到每个 key 都指向了另一个 map,其中包含着 A 和 B 两个 key。在这里,我们将最上面那层键值对称为行。并且在 HBase / BigTable 的术语表中,A 和 B 的映射称之为列族。

一个表的列族在表创建的时候就会被创建好,而且后续修改很困难,添加一个新列族的开销同样也很大,所以在创建表的时候应当将后续会用到的所有列族创建好。

好在一个列族可以有任意数量的列。称之为为列限定符(qualifier)或者标签(label)。

下面是我们上面 JSON 例子的子集,这次加入了 qualifier 的维度:

{// ..."aaaaa" : {"A" : {"foo" : "y","bar" : "d"},"B" : {"" : "w"}},"aaaab" : {"A" : {"foo" : "world","bar" : "domination"},"B" : {"" : "ocean"}},// ...
}

注意在上面的两行数据中,A 列族有两列:foo 和 bar,B 列族只有一列,而且 qualifier 是一个空字符串。

当访问 HBase / BigTable 中的数据时,你需要提供完整的列名::。举个例子,上面总共有三列,分别是:A:foo,A:bar 和 B:。

列族虽然基本固定不变,但是列不是,来看下面的例子:

{// ..."zzzzz" : {"A" : {"catch_phrase" : "woot",}}
}

在这个例子中,zzzzz 行有一个列 A:catch_phrase。因为每一行可以有任意数量的列,所以没有内置方法可以从所有行中的所有列中查询出一个列表。为了获取到那些信息,你需要做全表扫描。但是你可以查询所有的列族,因为它们是不变的(基本不变)。

HBase / BigTable 中最后的一个维度是时间。所有数据默认通过时间戳(1970年以来的秒数)来表示版本,或者你也可以指定一个其他的整数。客户端在插入数据的时候可以指定这个时间戳。

在最新的例子中,我们使用任意的整数来作为版本标识:

{// ..."aaaaa" : {"A" : {"foo" : {15 : "y",4 : "m"},"bar" : {15 : "d",}},"B" : {"" : {6 : "w"3 : "o"1 : "w"}}},// ...
}

每个列族可以自己指定一个 cell 中的数据可以保留多少个版本(cell 由 rowKey 和列进行标识)。在大多数情况下,应用会直接访问一个 cell 中的数据,而不会指定一个时间戳(版本),HBase / BigTable 会直接返回最近版本(时间戳最大的那个)的数据,因为它是按照时间倒序来存储数据的。

如果应用在请求数据的时候指定了一个时间戳,那么 HBase 就会返回时间戳小于或者等于指定时间戳的一个 cell 中的数据。

如果查询上面例子中的 HBase 表,查询 aaaaa A:foo,就会返回 y,如果带时间戳查询 aaaaa A:foo 10,就会返回 m,如果查询 aaaaa A:foo 2,就会返回 null。

稀疏的

最后的一个关键词是稀疏的。就如上面所说的,一个给定的行在每个列族中可以有任意数量的列,0 或者任意大。行之间可以存在间隙,这也是另一种稀疏。

如果你一直跟着本文在 map 的基础上来理解 HBase / BigTable,而没有与关系型数据库(RDBMS)的概念混淆,这样就很好了。

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-06-14
本文作者:Rayjun
本文来自:“掘金”,了解相关信息可以关注“掘金”

原文链接
本文为云栖社区原创内容,未经允许不得转载。

如何优雅的理解HBase和BigTable相关推荐

  1. Understanding HBase and BigTable 译文

    有时间翻译一下这篇文章.http://jimbojw.com/#understan... Google BigTable论文可下载:https://ai.google/research/pu... 在 ...

  2. 分布式列数据库--理解hbase列存储机制、架构、表结构设计、命令操作

    1. HBase简介 HBase是Hadoop Database的简称,是建立在Hadoop文件系统之上的分布式面向列的数据库. HBase和HDFS HDFS适用于存储大容量文件的分布式文件系统,不 ...

  3. 理解HBase zookeeper和-Root-/.MET表

    1 探究Zookeeper 安装过HBase的开发者一定知道,HBase本身就嵌入了Zookeeper,你可以选择安装嵌入的Zookeeper,也可以安装一个分布式的Zookeeper集群.具体的安装 ...

  4. 优雅的理解 call 和 apply 的使用方法

    作者在看到一篇优雅的使用 js 的各种方法解决算法的时候产生的疑问,到底什么时候使用 apply 和 call 啦? 每次看到别人用 apply 和 call 其实从以前的懵懵懂懂到现在的明白,但是自 ...

  5. 如何优雅的理解ECMAScript中的对象

    序 ECMAScript is an object-oriented programming language for performing computations and manipulating ...

  6. 深入理解 HBase Compaction 机制

    HBase有很多话题可以聊,包括读写路径上涉及到的一些数据结构,性能优化以及优化读写做的一些设计等.今天要探讨的Compaction机制就是HBase架构上做的一个重要优化,其实关于HBase的架构设 ...

  7. 优雅のJava(四)—— 优雅的理解代理模式

    文章目录 专栏导航 前言 代理 静态代理 RPC 静态代理 VS 装饰器 VS AOP 动态代理 VS 静态代理 RPC调用的例子 Why not Http? 动态代理实现AOP JDK动态代理 VS ...

  8. 理解HBase面向列存储

    从严格的列式存储的定义来看,Hbase并不属于列式存储,有人称它为面向列的存储.行式存储 传统的数据库是关系型的,且是按行来存储的.如下图: 其中只有张三把一行数据填满了,李四王五赵六的行都没有填满. ...

  9. 深入理解HBase的系统架构

    HBase的构成 Regions HBase的HMaster ZooKeeper HBase各组成部分之间的合作 HBase的第一次读写 HBase的META table Region Server的 ...

最新文章

  1. HMM学习最佳范例三:隐藏模式
  2. springcloud微服务实战 学习笔记五 Hystrix服务降级 Hystrix依赖隔离 断路器
  3. 双稳态电路的两个稳定状态是什么_从双稳态到双“更”稳态 ——叶芳伟课题组在拓扑光子学研究方向上取得新进展...
  4. m1MacBook的TensorFlow虚拟环境---pytables的安装
  5. pandas流式读取数据,不再担心内存炸裂
  6. 转载: .net程序员偏向XML开发的面试题
  7. oracle的会话(session)
  8. [转载] python中svm的使用_Python中支持向量机SVM的使用方法详解
  9. 【介绍】GNES ——Pythonic的直观方式快速构建神经搜索框架
  10. 面向对象程序设计_Task5_Calculator1.5.0
  11. 【图解】ERP系统如何操作?具体步骤是什么?
  12. Android之应用市场排行榜、上架、首发(非原创)
  13. 地理坐标系与经纬度转换
  14. android 免费云测平台,免费的移动APP真机云测试平台|iTestin云测工具 v3.0.8
  15. chrome 浏览器 FungLeo 常用插件汇总
  16. 84 岁 iOS 女程序员,不得不服!
  17. Http 400错误重现实验及解决办法
  18. notability整理归档_【干货整理】巧妙使用Notability,期末GPA可以4.0!
  19. 美国佐治亚大学卢国玉老师组招收计算机视觉方向全奖博士生
  20. httpd离线安装(含依赖包下载地址)

热门文章

  1. python json解析 超过对象_json序列化数据超出最大值(maxJsonLength)
  2. 小黑框如何连接mysql_珍藏版(cmd小黑框)数据库命令及操作
  3. python实时绘图暂停_Python实时绘图
  4. spring 上下文_一次性教你彻底理解 Spring容器和应用上下文!
  5. oracle 解锁 账户_oracle用户解锁三种方法
  6. python爬虫的技能_关于 Python 爬虫可能涉及到的技能点
  7. 电脑手机wifi互传文件_安卓手机文件互传
  8. 高中发表在论文计算机方面,高中计算机教学论文
  9. 谷歌用算力爆了一篇论文,解答有关无限宽度网络的一切
  10. 张文宏又爆“金句”:上班开会,要和关系最差的人坐一起……