第四章-分布式数据库HBase
第四章-分布式數(shù)據(jù)庫HBase
文章目錄
- 第四章-分布式數(shù)據(jù)庫HBase
- HBase簡介
- HBase數(shù)據(jù)模型
- 數(shù)據(jù)模型概念
- 概念視圖
- 物理視圖
- 面向列的存儲
- HBase實現(xiàn)原理
- HBase功能組件
- 表和Region
- Region的定位
- HBase運行機制
- HBase系統(tǒng)架構(gòu)
- Region工作原理
HBase簡介
BigTable是一個分布式存儲系統(tǒng),利用 MapReduce分布式并行計算模型來處理海量數(shù)據(jù),使用谷歌分布式文件系統(tǒng) GFS作為底層數(shù)據(jù)存儲,可以擴展到PB級別的數(shù)據(jù)和上千臺機器,具備廣泛應(yīng)用性、可擴展性、高性能和高可用性等特點。
HBase是一個高可靠、高性能、面向列、可伸縮的分布式數(shù)據(jù)庫,是谷歌 BigTable的開源實現(xiàn),主要用來存儲非結(jié)構(gòu)化和半結(jié)構(gòu)化的松散數(shù)據(jù)。HBase的目標(biāo)是處理非常龐大的表,可以通過水平擴展的方式,利用廉價計算機集群處理由超過10億行數(shù)據(jù)和數(shù)百萬列元素組成的數(shù)據(jù)表。
- 利用 MapReduce來處理 HBase中的海量數(shù)據(jù),實現(xiàn)高性能運算
- 利用 HDFS作為高可靠的底層存儲,利用廉價集群提供海量數(shù)據(jù)存儲能力
- 利用 Zookeeper提供協(xié)同服務(wù),實現(xiàn)穩(wěn)定服務(wù)和錯誤恢復(fù)
- Sqoop為 Hbase提供高效便捷的 RDBMS數(shù)據(jù)導(dǎo)入功能
- Pip和 Hive提供了高層語言支持
HBase與傳統(tǒng)關(guān)系數(shù)據(jù)庫的區(qū)別
| 數(shù)據(jù)類型 | 采用關(guān)系模型,具有豐富的數(shù)據(jù)類型和存儲方式 | 采用了更加簡單的數(shù)據(jù)模型,把數(shù)據(jù)存儲為未經(jīng)解釋的字符串,用戶需要自己編寫程序解析字符串 |
| 數(shù)據(jù)操作 | 包含了豐富的操作,其中會涉及復(fù)雜的多表連接 | 不存在復(fù)雜的表與表之間的關(guān)系,只有簡單的插入、查詢、刪除、清空等,不能實現(xiàn)表與表的連接查詢 |
| 存儲模式 | 基于行模式存儲 | 基于列存儲,不同列族的文件是分離的??梢越档?I/O開銷,支持大量并發(fā)用戶查詢 |
| 數(shù)據(jù)索引 | 通常可以針對不同列構(gòu)建復(fù)雜的多個索引,以提高數(shù)據(jù)訪問性能 | 只有一個索引——行鍵,HBase中的所有訪問方法,或通過行鍵訪問,或通過行鍵掃描 |
| 數(shù)據(jù)維護 | 更新操作會用最新的當(dāng)前值去替換記錄中原來的舊值,舊值被覆蓋后就不會存在 | 執(zhí)行更新操作時,并不會刪除數(shù)據(jù)舊的版本,而是生成一個新的版本,舊有的版本仍然保留 |
| 可伸縮性 | 很難實現(xiàn)橫向擴展,縱向擴展的空間也比較有限 | 能夠通過在集群中增加或者減少硬件數(shù)量來實現(xiàn)性能的伸縮 |
HBase也有自身的局限性,比如不支持事務(wù),因此無法實現(xiàn)跨行的原子性。
HBase數(shù)據(jù)模型
數(shù)據(jù)模型概念
HBase是一個稀疏、多維度、排序的映射表,這張表的索引是行鍵、列族、列限定符和時間戳。每個值是一個未經(jīng)解釋的字符串,沒有數(shù)據(jù)類型。用戶在表中存儲數(shù)據(jù),每一行都有一個可排序的行鍵和任意多的列。
表在水平方向由一個或者多個列族組成,一個列族中可以包含任意多個列,同一個列族里面的數(shù)據(jù)存儲在一起。列族支持動態(tài)擴展,可以很輕松地添加一個列族或列,無需預(yù)先定義列的數(shù)量以及類型,所有列均以字符串形式存儲,用戶需要自行進行數(shù)據(jù)類型轉(zhuǎn)換。HBase中執(zhí)行更新操作時,并不會刪除數(shù)據(jù)舊的版本, 而是生成一個新的版本,舊有的版本仍然保留。
HBase數(shù)據(jù)模型的相關(guān)概念
| 表 | HBase采用表來組織數(shù)據(jù),表由行和列組成,列劃分為若干個列族 |
| 行 | 每個 HBase表都由若干行組成,每個行由行鍵(row key)來標(biāo)識 |
| 列族 | 一個 HBase表被分組成許多“列族”(Column Family)的集合,它是基本的訪問控制單元 |
| 列限定符 | 列族里的數(shù)據(jù)通過列限定符(或列)來定位 |
| 單元格 | 在 HBase表中,通過行、列族和列限定符確定一個“單元格”(cell),單元格中存儲的數(shù)據(jù)沒有數(shù)據(jù)類型,總被視為字節(jié)數(shù)組 byte[ ]。每個單元格可以保存一個數(shù)據(jù)的多個版本,對應(yīng)不同的時間戳。 |
| 時間戳 | 每個單元格都保存著同一份數(shù)據(jù)的多個版本,這些版本采用時間戳進行索引。一個單元格的不同版本是根據(jù)時間戳降序的順序進行存儲的,最新的版本可以最先被讀取 |
HBase中使用坐標(biāo)來定位表中的數(shù)據(jù),需要根據(jù)行鍵、列族、列限定符和時間戳來確定一個單元格,因此,可以視為一個“四維坐標(biāo)”,即 [行鍵, 列族, 列限定符, 時間戳]。
| [“201505003”, “Info”, “email”, 1174184619081] | “xie@qq.com” |
| [“201505003”, “Info”, “email”, 1174184620720] | “you@163.com” |
概念視圖
在 HBase的概念視圖中,一個表可以視為一個稀疏,多維的映射關(guān)系。每個行都包含相同的列族,盡管行不需要在每個列族中存儲數(shù)據(jù)。
這是一個存儲網(wǎng)頁的 HBase表的片段。
- 行鍵是一個反向 URL(即 com.cnn.www),之所以這么存放,是因為 HBase是按照行鍵的字典序來排序存儲數(shù)據(jù)的,采用反向 URL的方式,可以讓來自同一個網(wǎng)站的數(shù)據(jù)內(nèi)容都保存在一個相鄰的位置,在按照行鍵的值進行水平分區(qū)時,就可以盡量把來自同一個網(wǎng)站的數(shù)據(jù)劃分到同一個分區(qū)(Region)中。
- contents列族用來存儲網(wǎng)頁內(nèi)容。
- anchor列族包含了任何引用這個頁面的錨鏈接文本。
物理視圖
在概念視圖層面,HBase每個表是由許多行組成的;但是在物理存儲層面,它是采用了基于列的存儲方式,這也是 HBase和傳統(tǒng)關(guān)系數(shù)據(jù)庫的重要區(qū)別。
上面的概念視圖在物理存儲的時候,HBase表會按照 contents、anchor這兩個列族分別存放,屬于同一個列族的數(shù)據(jù)保存在一起。同時,和每個列族一起存放的還包括行鍵和時間戳。
在概念視圖中,有些列是空的,即這些列上面不存在值。在物理視圖中,這些空的列不會被存儲成 null,而是根本就不會被存儲,當(dāng)請求這些空白的單元格時,會返回 null值。
面向列的存儲
行式數(shù)據(jù)庫使用 NSM(N-ary Storage Model)存儲模型,一個元組(或行)會被連續(xù)地存儲在磁盤頁中。在從磁盤中讀取數(shù)據(jù)時,需要從磁盤中順序掃描每個元組的完整內(nèi)容,然后從每個元組中篩選出查詢所需要的屬性。如果每個元組只有少量屬性的值對于查詢是有用的,那么 NSM就會浪費很多磁盤空間和內(nèi)存帶寬。
列式數(shù)據(jù)庫采用 DSM(Decomposition Storage Model)存儲模型,目的是最小化無用的 I/O。DSM會對關(guān)系進行垂直分解,并為每個屬性分配一個子關(guān)系,每個子關(guān)系單獨存儲,每個子關(guān)系只有當(dāng)其相應(yīng)的屬性被請求時才會被訪問。DSM的缺陷是:執(zhí)行連接操作時需要昂貴的元組重構(gòu)代價。
行式數(shù)據(jù)庫主要適合于小批量的數(shù)據(jù)處理,如聯(lián)機事務(wù)型數(shù)據(jù)處理,我們平時熟悉的 Oracle、MySQL等關(guān)系數(shù)據(jù)庫都屬于行式數(shù)據(jù)庫。
列式數(shù)據(jù)庫主要適合于批量數(shù)據(jù)處理和即席查詢(Ad-Hoc Query),它可以降低 I/O開銷,支持大量用戶并發(fā)查詢,其數(shù)據(jù)處理速度比傳統(tǒng)方法快100倍。列式數(shù)據(jù)庫主要用于數(shù)據(jù)挖掘、決策支持和地理信息系統(tǒng)等查詢密集型系統(tǒng)中。
HBase實現(xiàn)原理
HBase功能組件
HBase的實現(xiàn)包括三個主要的功能組件:
- 庫函數(shù):鏈接到每個客戶端
- 一個 Master主服務(wù)器
- 許多個 Region服務(wù)器
Region服務(wù)器負責(zé)存儲和維護分配給自己的 Region,處理來自客戶端的讀寫請求。
主服務(wù)器 Master負責(zé)管理和維護 HBase表的分區(qū)信息,維護 Region服務(wù)器列表,檢測集群中的 REgion服務(wù)器,合理分配 Region實現(xiàn)負載均衡,以及處理模式的變化,如表和列族的創(chuàng)建 。
客戶端并不是直接從 Master主服務(wù)器上讀取數(shù)據(jù),而是在獲得 Region的存儲位置信息后,直接從 Region 服務(wù)器上讀取數(shù)據(jù)。
表和Region
對于每個 HBase表,表中的行是根據(jù)行鍵的值的字典序進行維護的。因此分布式存儲時需要根據(jù)行鍵的值對表中的行進行分區(qū),每個行區(qū)間構(gòu)成一個分區(qū),被稱為“Region”。它包含了位于某個值域區(qū)間內(nèi)的所有數(shù)據(jù),是負載均衡和數(shù)據(jù)分發(fā)的基本單位,這些 Region會被分發(fā)到不同的服務(wù)器上。
每一個表格最初都只包含一個 Region,隨著數(shù)據(jù)的不斷插入,Region會持續(xù)增大,當(dāng)一個 Region中包含的行數(shù)量達到一個閾值時,就會被自動等分成兩個新的 Region。隨著表中行的數(shù)量持續(xù)增加,就會分裂出越來越多的 Region。
Master主服務(wù)器會把不同的 Region分配到不同的 Region服務(wù)器上,但是同一個 Region是不會被拆分到多個服務(wù)器上的。每個 Region的最佳大小取決于單臺服務(wù)器的有效處理能力,通常建議是1GB~2GB。每個 Region服務(wù)器負責(zé)管理一個 Region集合,通常一個集合是10~1000個 Region。
Region的定位
每一個 Region都有一個 RegionID來標(biāo)識它的唯一性,為了定位每個 Region所在的位置,就可以構(gòu)建一張映射表。映射表的每行包含兩項內(nèi)容,一個是 Region標(biāo)識符,另一個是 Region服務(wù)器標(biāo)識符,這一行就表示 Region和 Region服務(wù)器之間的對應(yīng)關(guān)系。這個映射表也被稱為“元數(shù)據(jù)表”,又名“.META.表”。為了加快訪問速度,.META.表的全部 Region都會被保存在內(nèi)存中。
當(dāng) HBase表中的 Region數(shù)據(jù)非常龐大時, .META.表也會被分裂 成多個 Region。為了定位這些 Region,再構(gòu)建一個新的映射表,記錄所有元數(shù)據(jù)的具體位置,就是“根數(shù)據(jù)表”,又名“-ROOT-表”。-ROOT-表是不能被分割的,永遠只存在一個 Region用于存放-ROOT-表 ,這個 Region的名字是寫死的,Master服務(wù)器永遠知道它的位置。
客戶端訪問用戶數(shù)據(jù)之前,需要首先訪問 Zookeeper,獲取-ROOT-表的位置信息,然后訪問-ROOT-表,獲取.META.表的信息,接著訪問.META.表,找到所需的 Region具體位于哪個 Region服務(wù)器,最后才會到該 Region服務(wù)器讀取數(shù)據(jù)。
為了加快尋址過程,一般會在客戶端做緩存,把查詢過的位置信息緩存起來。這樣以后訪問相同數(shù)據(jù)時,就可以直接從客戶端緩存中獲取 Region的位置信息,而不需要每次都經(jīng)歷一個“三級尋址”過程。
綜上所述,HBase使用類似 B+樹的三層結(jié)構(gòu)來保存 Region位置信息。
| 第一層 | Zookeeper文件 | 記錄了-ROOT-表的位置信息 |
| 第二層 | -ROOT-表 | 記錄了.META.表的 Region位置信息,-ROOT-表只有一個 Region。通過-ROOT-表就可以訪問.META.表中的數(shù)據(jù) |
| 第三層 | .META.表 | 記錄了用戶數(shù)據(jù)表的 Region位置信息,.META.表可以有多個 Region,保存了 HBase中所有用戶數(shù)據(jù)表的 Region位置信息 |
HBase運行機制
HBase系統(tǒng)架構(gòu)
HBase的系統(tǒng)架構(gòu)包括客戶端、Zookeeper服務(wù)器、Master服務(wù)器、Region服務(wù)器。HBase一般采用 HDFS作為底層數(shù)據(jù)存儲。
客戶端:包含訪問 HBase的接口,同時在緩存中維護著已經(jīng)訪問過的 Region位置信息,用來加快后續(xù)數(shù)據(jù)訪問過程。HBase客戶端使用 HBase的 RPC機制與 Master服務(wù)器和 Region服務(wù)器進行通信。
Zookeeper:Zookeeper存儲-ROOT-表的地址和 Master地址, Region Server主動向 Zookeeper注冊,使得 Master可隨時感知 各 Region Server的健康狀態(tài)。Zookeeper可以幫助選舉出一個 Master作為集群的總管,并保證在任何時刻總有唯一一個 Master在運行,這就避免了Master的“單點失效”問題。
Master主服務(wù)器:Master主要負責(zé)表和Region的 管理工作
- 管理用戶對表的增加、刪除、修改等操作
- 實現(xiàn)不同Region服務(wù)器之間的負載均衡
- 在Region分裂或合并后,負責(zé)重新調(diào)整Region的分布
- 對發(fā)生故障失效的Region服務(wù)器上的Region進行遷移
Region服務(wù)器:HBase中最核心的模塊,負責(zé)維 護分配給自己的Region,并響應(yīng)用戶的讀寫請求。
Region工作原理
Region服務(wù)器內(nèi)部管理了一系列 Region對象和一個共用的 HLog文件。HLog文件是磁盤上面的記錄文件,記錄了所有的更新操作。每個 Region對象又是由多個 Store組成的,,每個 Store又包含了一個 MemStore和若干個 StoreFile。其中,MemStore是在內(nèi)存中的緩存,保存最近更新的數(shù)據(jù),StoreFile是磁盤中的文件。
這些文件都是 B樹結(jié)構(gòu),方便快速讀取。StoreFile在底層的實現(xiàn)方式是 HDFS文件系統(tǒng)的 HFile,HFile的數(shù)據(jù)塊通常采用壓縮方式存儲,壓縮之后可以大大減少網(wǎng)絡(luò) I/O和磁盤 I/O。
Store是 Region服務(wù)器的核心,每個 Store對應(yīng)了表中的一個列族的存儲。當(dāng)用戶寫入數(shù)據(jù)時,系統(tǒng)首先把數(shù)據(jù)放入 MemStore緩存,當(dāng)緩存滿時,就會刷新到磁盤中的一個 StoreFile文件中。StoreFile達到一定的數(shù)量之后就會觸發(fā)文件合并操作,多個 StoreFile合并成一個大的 StoreFile文件,這個StoreFile會越來越大。當(dāng)StoreFile文件的大小超過一定的閾值時,就會觸發(fā)文件分裂操作。同時,當(dāng)前的父 Region會被分裂成2個子 Region,父 Region會下線,新分裂出的2個子 Region會被 Master分配到相應(yīng)的 Region服務(wù)器上。
HBase采用 HLog來保證系統(tǒng)發(fā)生故障時可以恢復(fù)到正常狀態(tài)。HBase系統(tǒng)為每個Region服務(wù)器配置了一個HLog 文件,它是一種預(yù)寫式日志(Write Ahead Log)。用戶更新數(shù)據(jù)必須首先寫入日志后,才能寫入 MemStore緩存,并且,直到 MemStore緩存內(nèi)容 對應(yīng)的日志已經(jīng)寫入磁盤,該緩存內(nèi)容才能被刷新寫入磁盤。
Zookeeper會實時監(jiān)測每個 Region服務(wù)器的狀態(tài),當(dāng)某個 Region服務(wù)器發(fā)生故障時,Zookeeper會通知 Master。Master首先會處理該故障 Region服務(wù)器上面遺留的 HLog文件,這個遺留的HLog文件中包含了來自多個 Region對象的日志記錄。系統(tǒng)會根據(jù)每條日志記錄所屬的 Region對象對 HLog數(shù)據(jù)進行拆分,分別放到相應(yīng) Region對象的目錄下,然后,再將失效的 Region重新分配到可用的 Region服務(wù)器中,并把與該 Region對象相關(guān)的 HLog日志記錄也發(fā)送給相應(yīng)的 Region服務(wù)器。
Region服務(wù)器領(lǐng)取到分配給自己的 Region對象以及與之相關(guān)的 HLog日志記錄以后,會重新做一遍日志記錄中的各種操作,把日志記錄中的數(shù)據(jù)寫入到 MemStore緩存中,然后,刷新到磁盤的 StoreFile文件中,完成數(shù)據(jù)恢復(fù)。
HBase系統(tǒng)中,每個 Region服務(wù)器只需要維護一個 HLog文件,所有的 Region對象共用一個 HLog。這樣可以減少磁盤尋址次數(shù),提高對表的寫操作性能。
總結(jié)
以上是生活随笔為你收集整理的第四章-分布式数据库HBase的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第三章-分布式文件系统HDFS
- 下一篇: 新手第一课-什么是深度学习