asp.net 网站开发框架H5 网站
asp.net 网站开发框架,H5 网站,模版网站好吗,房地产网站广告销售怎么做云栖号资讯#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯#xff0c;还在等什么#xff0c;快来#xff01; 学习 HBase 最难的地方在于要让你的脑子真正理解它是什么。
HBase#xff1a;Google BigTable 的开源实现
我们经常会把关… 云栖号资讯【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯还在等什么快来 学习 HBase 最难的地方在于要让你的脑子真正理解它是什么。
HBaseGoogle BigTable 的开源实现
我们经常会把关系型数据库RDBMS比如 MySQL和 HBase 搞混因为在这两个系统中都包含 table 和 baseHBaseDatabase。
这篇文章的目标是从概念上来说清楚 HBase 这个分布式的数据存储系统。读完后你应该可以很清楚的知道什么情况下 HBase 更好什么情况下传统的关系型数据库更好。
关于一些术语
幸运的是Google 的 BigTable论文清楚的解释了 BigTable 到底是什么。下面是论文中数据模型章节的第一句话
BigTable 是一个稀疏的、分布式的、可持久化的多维有序 map。
在这个节骨眼上我想给读者一个机会让他们在读到最后一行字时能够收集到他们脑壳里的活动信息这可能是个笑话但我没懂^v^。
论文中继续解释如下
map 通过 rowKeycolumnKey 和时间戳进行索引map 中的每个值都是一个连续的字节数组。
注rowKey 是记录的主键唯一标识一行记录
在 Hadoop 的官方文档中也对 HBase 的架构做了说明
HBase 使用了与 BigTable 非常类似的数据模型。用户存储数据行到特定的表中。一个数据行有一个可排序的 rowKey 和数量不定的列。这个表是稀疏的只要用户愿意这个表不同行可以有完全不同的列。
这些话看起来相当费解让人摸不着头脑但如果你把这些话拆成一个个词意思就慢慢变的清晰了。我将按照以下的顺序来讨论这些词map持久化分布式有序的多维的稀疏。
我发现循序渐进地建立一个思维框架要比一次性勾画一个完整的系统更加容易。
map
从根本来上来HBase/BigTable 是一个 map。map 在不同的编程语言中有不同的叫法比如 PHP 中的 arrayPython 的 dictionaryRuby 中的 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 可以存储到 HDFSHadoops Distributed File System上也可以存储到 亚马逊的 S3Simple Storage Service上而 BigTable 使用的是 GFSGoogle 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 和 barB 列族只有一列而且 qualifier 是一个空字符串。
当访问 HBase / BigTable 中的数据时你需要提供完整的列名:。举个例子上面总共有三列分别是A:fooA: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 : w3 : o1 : 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 本文来自“掘金”了解相关信息可以关注“掘金”
原文链接 本文为云栖社区原创内容未经允许不得转载。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/88710.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!