日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何优雅的理解HBase和BigTable

發布時間:2024/8/23 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何优雅的理解HBase和BigTable 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

云棲號資訊:【點擊查看更多行業資訊】
在這里您可以找到不同行業的第一手的上云資訊,還在等什么,快來!


學習 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。