阿里妹導讀:2006 年10 月Google 發佈三架馬車之一的《Bigtable:A Distributed Storage System for Strctured Data》論文以後,Powerset 公司就宣佈 HBase 在 Hadoop 項目中成立,做爲子項目存在。後來,在2010 年左右逐漸成爲 Apache 旗下的一個頂級項目。多是實際應用中包裝得太好,不少人對於 HBase 的認識止步於 NoSQL 。今天,螞蟻金服的南俊從基礎開始講起,但願有助於加強你們在實際業務中對 HBase 的理解。
HBase 名稱的由來是因爲其做爲 Hadoop Database 存在的,用來存儲非結構化、半結構化數據。數據庫
要想知道 HBase 的用途,就須要看一看其在 Apache 的 Hadoop 生態系統中的位置,能夠看到 HBase 是構建在 HDFS 之上的,這是因爲 HBase 內部管理的文件所有都是存儲在 HDFS 當中的。同時,MapReduce 這個計算框架在 HBase 之上又提供了高性能的計算能力來處理海量數據。此外還有一些像 Pig、Hive 用來提供高層語言的支持。還有 Sqoop 用來完成傳統數據庫到 HBase 之間的數據遷移。相似衍生出來的新技術還有不少,有興趣的同窗能夠本身去了解一下。數組
Google 的三架馬車 BigTable、GFS、MapReduce 如今在開源社區中都能找到對應的實現。HBase 就是 Bigtable 的開源實現,固然這句話不是徹底正確,由於二者之間仍是有些差別的。可是主要仍是基於 BigTable 這個數據模型開發的,所以也是具備 Key-Value 特徵的,同時也就具備 Bigtable 稀疏的、面向列的這些特性。緩存
也是因爲 HBase 利用 HDFS 做爲它的文件系統,所以它也具備 HDFS 的高可靠性和可伸縮性。和 Hadoop 同樣,HBase 也是依照橫向擴展,經過不斷地經過添加廉價的服務器來增長計算和存儲的能力。BigTable 利用 Chubby 來進行協同服務,HBase 則是利用 Zookeeper 來對整個分佈式系統進行協調服務。正是由於經過HDFS 的高可靠可伸縮性,以及應用了 Bigtable 的稀疏的面向列的這些高效的數據組織形式。因此 HBase 才能如此地適合大數據隨機和實時讀寫。服務器
這裏介紹一下 HBase 的一些基本概念:負載均衡
RowKey(行鍵),顧名思義也就是咱們在關係型數據庫中常見的主鍵,它是Unique 的,在 HBase 中這個主鍵能夠是任意的字符串,其最大長度是64K,在內部存儲中會被存儲爲字節數組,HBase 表中的數據是按照 RowKey 的字典序排列的,例如不少索引的實現,包括地理空間索引很大程度就是依賴這個特性。框架
不過也要注意一個點,現實當中指望排序是一、二、三、4...10,而在 HBase 中1 後面緊跟的會是10。所以,在設計行鍵的時候必定要充分地利用字典序這個特性,將一下常常讀取的行存儲到一塊兒或者靠近,減小Scan 的耗時,提升讀取的效率。這裏必定要說的一點是,行鍵設計真的很重要,例如作組合行鍵時將時間排前面,致使寫熱點(曾經踩過的坑,記憶猶新)。分佈式
Column Family(列族),它是由若干列構成,是表 Schema 的一部分,因此須要在建立表的時候就指定好。但也不是所表建立完以後就不能更改列族,只是成本會比較大,所以不建議更改。HBase 中可容許定義的列族個數最多就20多個。列族不只僅可以幫助咱們構建數據的語義邊界,還能有助於咱們設置某些特性,好比能夠指定某個列族內數據的壓縮形式。一個列族包含的全部列在物理存儲上都是在同一個底層的存儲文件當中。oop
Column (列),通常都是從屬於某個列族,跟列族不同,列的數量通常的沒有強限制的,一個列族當中能夠有數百萬個列,並且這些列均可以動態添加的。這也是咱們常說的 HBase 面向列的優勢,不像傳統的關係型數據庫,調整一下 Schema 都須要擔憂對於生產的影響。性能
Version Number(版本號),HBase 中每一列的值或者說是每一個單元格的值都是具備版本號的,默認使用的系統當前的時間戳,精確到毫秒。固然也能夠是用戶本身顯式地設置,咱們是經過時間戳來識別不一樣的版本,所以若是要本身設置的話,也要保證版本號的惟一性。用戶也能夠指定保存指定單元格的最後 N 個版本,或者某個時間段的版本,這個是能夠在配置中配置的。一個單元格里面是數據是按照版本號降序的。也就是說最後寫入的值會被最早讀取。大數據
Cell(單元格),一個單元格就是由前面說的行鍵、列標示、版本號惟一肯定的,這裏說的列標示包括列族和列名。Cell 中的數據是沒有類型的,所有都是字節碼。
因爲 HBase 表的一個單元格是由多維決定的,我這裏嘗試用一個二維的電子表格來展現。能夠結合前面說的 HBase 的基本概念來理解。能夠看到經過二維表格來展現一個成績表,中間有不少單元格是空的,總體看起來很稀疏,須要說明的是在 HBase 的實際存儲中這些空的單元格並不佔存儲。
物理視圖比較複雜,下面以圖來展現一個 HBase 表從宏觀到微觀到物理存儲。儘可能以最簡單到方式展現物理視圖的幾個層次。
一個 Region 是由一個或多個 Store 組成。每個 Store 其實就是一個列族。每一個
Store 又是由一個 memStore 和 0 個或者多個 storeFile 組成。memStore 是存儲在內存中,storeFile 是存儲在 HDFS 中,有時候也稱做 HFile。數據都會先寫入memStore,一旦 memStore 超過給的的最大值以後,HBase 就會將memStore 持久化爲 storeFile。
一個 HBase 集羣通常由一個 Master 和多個 RegionServer 組成。
本文來自雲棲社區合做夥伴「 阿里技術」,如需轉載請聯繫原做者。