理解Hbase和BigTable(转)
add by zhj: 这篇文章写的通俗易懂,介绍了HBase最重要的几点特性。
英文原文:https://dzone.com/articles/understanding-hbase-and-bigtab
译文:https://lunatictwo.github.io/2017/09/25/Hbase&&BigTable/
学习HBase(Google BigTable 的具体实现)最困难的地方在于,HBase的概念很难让人理解。
不幸的是,在HBase和BigTable的介绍中,都包含了table这个单词,很容易让学过关系型数据库的人们(包括我自己)产生困惑。
这篇文章致力于从概念的角度介绍这个分布式数据存储系统。阅读之后,当你遇到想使用HBase或者是想使用传统数据库的时候,你就可以有一个清晰的认识。
一切都在术语中
Google的BigTable论文 清晰的指出了什么是BigTable。这里是其中Data Model一节的第一句话:
Bigtable is a sparse, distributed, persistent multidimensional sorted map.
接下来,论文继续解释道:
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的Wiki介绍中,有如下描述:
HBase uses a data model very similar to that of Bigtable. Users store data rows in labelled tables. A data row has a sortable key and an arbitrary number of columns. The table is stored sparsely, so that rows in the same table can have crazily-varying columns, if the user likes.
尽管看起来让人难以理解,但是一次理解一个单词,也是有意义的。下面我将按照以下顺序解释这些单词:map, persistent, distributed, sorted, multidimensional, 和sparse。
1. 字典
HBase和BigTable的核心是一个map。依靠你的编程语言背景,你可以很容易理解,这就像PHP中的关联数组,Python中的字典,Ruby中的哈希,或者是JavaScript中的对象。
从Wiki中的解释来看,map就是”由key和value组成的数据结构,其中每一个key和一个value相关联”。
使用JavaScript的对象语法,这是一个简单的map实例:
{
"zzzzz" : "woot",
"xyz" : "hello",
"aaaab" : "world",
"1" : "x",
"aaaaa" : "y"
}
2. 持久化
Persistence(持久性)只是表示当你的程序结束或数据入口关闭后,你保存在map中的数据会被持久化,这个和其他的持久化存储方式没区别。
3. 分布式
Hbase和BigTable构建在分布式文件系统上,以便底层文件存储可以在独立机器阵列之间传播。
HBase可以运行在HDFS上,也可以运行在Amazon的Simple Storage Service上,同时BigTable可以运行在Google File System上。
数据以类似的方式在多个参与节点中复制,以便数据在基于独立冗余磁盘阵列的系统中的光盘之间进行条带化。
在本文中,我们并不关心使用哪个分布式文件系统实现。要了解的事情是它是分布式的,它提供了一个保护机制,例如,集群内的某个节点发生故障,可以做到容灾即可。
4. 有序
与大多数Map实现不同,在Hbase/BigTable中,键值对以严格的字母顺序保存。 也就是说,键“aaaaa”的存储行应该在键“aaaab”的旁边,并且距离具有键“zzzzz”的存储行非常远。
回到我们的map示例,排序后的版本如下:
{
"1" : "x",
"aaaaa" : "y",
"aaaab" : "world",
"xyz" : "hello",
"zzzzz" : "woot"
}
因为这些系统往往是特别庞大的,并且数据是分布式存储,所以这种排序功能其实非常重要。具有类似键的行的空间优势确保了当一个操作必须扫描表格时,查询最感兴趣的内容将彼此靠近。
这在选择行key时很重要。 例如,假如一个表的关键字是域名,最有意义的是以反向符号(即“com.jimbojw.www”而不是“www.jimbojw.com”)列出它们,以便关于子域名的行将在父域名行附近。
继续解释域名的例子,如果是以反向符号存储的话,假如有一行数据是“mail.jimbojw.com”,那么它应该被存储在“www.jimbojw.com”行的旁边,而不是在“mail.xyz.com”旁边。
需要注意的是,在HBase和BigTable中的value是不被排序的,只有key被排序。除了这个,其他的和普通的map实现是一样的。
5. 多维度
到目前为止,我们没有提到任何“列(columns)”的概念,而是将“表”视为概念中的常规Hash/Map。 这是完全有意为之的。单词“列”是另一个人为引入的单词,如“table”和“base”,它是多年关系型数据库从业人员的命名习惯。
相反,我更喜欢把它想象为一个map的嵌套结构。比如如下结构:
{
"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"
}
}
在上述例子中,你会发现每一个内层的map都有两个key,A和B。从现在开始,每一个外层的map视为一行,每一个内层的map中的A、B视为A、B列。
创建表的时候,需要首先指定好表的列,后续难以修改,或不可修改。同时,添加新的列的代价也是非常昂贵的。
不过幸运的是,在每一个列中,同样可以添加无数的列,就像JSON中一样,举例如下:
{
// ...
"aaaaa" : {
"A" : {
"foo" : "y",
"bar" : "d"
},
"B" : {
"" : "w"
}
},
"aaaab" : {
"A" : {
"foo" : "world",
"bar" : "domination"
},
"B" : {
"" : "ocean"
}
},
// ...
}
上面的示例中,A列有两个子列:foo和bar,B列有一个子列,用空字符串标识。
在查询HBase和BigTable的时候,必须提供数据的全限定名,比如”A:foo”, “A:bar”和”B:”。
请注意,尽管列是静态的,但列的子列不是。比如以下结构:
{
// ...
"zzzzz" : {
"A" : {
"catch_phrase" : "woot",
}
}
}
在这种情况下,“zzzzz”行只有一列“A:catch_phrase”。 因为每一行可能有不同的列数,所以没有内置的方法来查询所有列中所有子列的列表。要获取该信息,必须进行全表扫描。然而,可以查询所有列的内容,因为这些列是不可变的。
Hbase/BigTable表示的最终维度是时间。所有数据使用整数时间戳或用户选择的其他整数进行统一时间控制。客户端可以在插入数据时指定时间戳。
假设有如下采用某一时间序列存储的数据:
{
// ...
"aaaaa" : {
"A" : {
"foo" : {
15 : "y",
4 : "m"
},
"bar" : {
15 : "d",
}
},
"B" : {
"" : {
6 : "w"
3 : "o"
1 : "w"
}
}
},
// ...
}
每个列的子列可能有自己的规则来设置要保留的版本数量(单元格由其行键/列对标识)。在大多数情况下,应用程序将简单地询问给定单元格的数据,而不指定时间戳。 在这种常见情况下,Hbase/BigTable将返回最新的版本(具有最高时间戳的版本),因为它们以倒序的时间顺序存储。
如果应用程序在给定的时间戳中请求给定行,则Hbase将返回单元格数据,其中时间戳小于或等于提供的时间戳。
使用上述示例的Hbase表,查询“aaaaa”/“A:foo”的行/列将返回“y”,同时查询“aaaaa”/“A:foo”/ 10的行/列/时间戳将返回“M”。 查询“aaaaa”/“A:foo”/ 2的行/列/时间戳将返回空结果。
6. 稀疏
最后一个关键字是sparse(稀疏的)。 如上文已经提到的,给定行可以在每个列族中具有任意数量的列,或者根本没有列。 另一种类型的稀疏性是基于行的间隙,这仅仅意味着键之间可能存在间隙。
当然,如果您在本文的基于map的术语中考虑过Hbase/BigTable,而不是在RDBMS中看到类似的概念,那么这是非常有道理的。(言外之意就是说,在HBase/BigTable中的数据是稀疏的,而在RDBMS中不经常是。)
综述
以上就是HBase/BigTable的概念介绍。
理解Hbase和BigTable(转)的更多相关文章
- HBase vs. BigTable Comparison - HBase对比BigTable
HBase vs. BigTable Comparison HBase is an open-source implementation of the Google BigTable architec ...
- 深入理解HBase Memstore
2013/08/09 转发自http://www.cnblogs.com/shitouer/archive/2013/02/05/configuring-hbase-memstore-what-you ...
- Understanding HBase and BigTable
Hbase is a distributed data storage systems. A Bigtable is spare , distributed , persistent multidim ...
- 深入理解HBase
深入理解HBase: https://www.jianshu.com/p/b23800d9b227
- 理解HBase
1.HBase HBase: Hadoop Database,根据Google的Big Table设计 HBase是一个分布式.面向列族的开源数据库.HDFS为Hbase提供了底层的数据存储服务,Ma ...
- 理解Hbase RowKey的字典排序;HBase Rowkey的散列与预分区设计
HBase是三维有序存储的,是指rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这个三个维度是依照ASCII码表排序的. HB ...
- 深度预警:深入理解HBase的系统架构
HBase的构成 物理上来说,HBase是由三种类型的服务器以主从模式构成的.这三种服务器分别是:Region server,HBase HMaster,ZooKeeper. 其中Region ser ...
- Hbase框架原理及相关的知识点理解、Hbase访问MapReduce、Hbase访问Java API、Hbase shell及Hbase性能优化总结
转自:http://blog.csdn.net/zhongwen7710/article/details/39577431 本blog的内容包含: 第一部分:Hbase框架原理理解 第二部分:Hbas ...
- HBase 数据模型(Data Model)
HBase Data Model--HBase 数据模型(翻译) 在HBase中,数据是存储在有行有列的表格中.这是与关系型数据库重复的术语,并不是有用的类比.相反,HBase可以被认为是一个多维度的 ...
随机推荐
- Fixed Partition Memory Management UVALive - 2238 建图很巧妙 km算法左右顶点个数不等模板以及需要注意的问题 求最小权匹配
/** 题目: Fixed Partition Memory Management UVALive - 2238 链接:https://vjudge.net/problem/UVALive-2238 ...
- android平台的三个编译命令——make,mm,mmm
在Android源码根目录下,执行以下三步即可编译android: 1. build/envsetup.sh #这个脚本用来设置android的编译环境; 2. lunch #选择编译目标 3 ...
- [TF] Architecture - Computational Graphs
阅读笔记: 仅希望对底层有一定必要的感性认识,包括一些基本核心概念. Here只关注Graph相关,因为对编程有益. TF – Kernels模块部分参见:https://mp.weixin.qq.c ...
- nginx-启动|关闭|重新加载配置文件的命令
1.1 进入操作目录 D: cd D:\NginxTest\nginx-1.10.2 1.2 启动指令 nginx -c conf\nginx.conf 1.3 关闭指令 nginx -s stop ...
- C#设计模式--状态模式
设计模式: 状态模式(State Pattern) 简单介绍: 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式. 在状态模式中,我们创建表示 ...
- Spark2 Random Forests 随机森林
随机森林是决策树的集合. 随机森林结合许多决策树,以减少过度拟合的风险. spark.ml实现支持随机森林,使用连续和分类特征,做二分类和多分类以及回归. 导入包 import org.apache. ...
- SVM 核方法
在 SVM 中引入核方法便可使得 SVM 变为非线性分类器,给定非线性可分数据集 $\left \{ (x_i,y_i)\right\}_{i=1}^N$,如下图所示,此时找不到一个分类平面来将数据分 ...
- 自主移动机器人同时定位与地图创建(SLAM)方法概述
1.引言: 机器人的研究越来越多的得到关注和投入,随着计算机技术和人工智能的发展,智能自主移动机器人成为机器人领域的一个重要研究方向和研究热点.移动机器人的定位和地图创建是自主移动机器人领域的热点研究 ...
- EF将IEnumerable<T>类型转换为Dictionary<T,T>类型
x 无标题 #region 博客Code {DBEntities}生成EFModel的时候自己命名的 using ({DBEntities} db = new { DBEntities }()) { ...
- VMware与Centos系统安装 和重置root密码
VMware与Centos系统安装 今日任务 1.Linux发行版的选择 2.vmware创建一个虚拟机(centos) 3.安装配置centos7 4.xshell配置连接虚拟机(centos) ...