ivaneeo's blog

          自由的力量,自由的生活。

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks

          HBase – Hadoop Database,是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統(tǒng),利用HBase技術(shù)可在廉價PC Server上搭建起大規(guī)模結(jié)構(gòu)化存儲集群。

          HBase是Google Bigtable的開源實現(xiàn),類似Google Bigtable利用GFS作為其文件存儲系統(tǒng),HBase利用Hadoop HDFS作為其文件存儲系統(tǒng);Google運行MapReduce來處理Bigtable中的海量數(shù)據(jù),HBase同樣利用Hadoop MapReduce來處理HBase中的海量數(shù)據(jù);Google Bigtable利用 Chubby作為協(xié)同服務(wù),HBase利用Zookeeper作為對應(yīng)。

          上圖描述了Hadoop EcoSystem中的各層系統(tǒng),其中HBase位于結(jié)構(gòu)化存儲層,Hadoop HDFS為HBase提供了高可靠性的底層存儲支持,Hadoop MapReduce為HBase提供了高性能的計算能力,Zookeeper為HBase提供了穩(wěn)定服務(wù)和failover機制。

          此外,Pig和Hive還為HBase提供了高層語言支持,使得在HBase上進(jìn)行數(shù)據(jù)統(tǒng)計處理變的非常簡單。 Sqoop則為HBase提供了方便的RDBMS數(shù)據(jù)導(dǎo)入功能,使得傳統(tǒng)數(shù)據(jù)庫數(shù)據(jù)向HBase中遷移變的非常方便。

          HBase訪問接口

          1.       Native Java API,最常規(guī)和高效的訪問方式,適合Hadoop MapReduce Job并行批處理HBase表數(shù)據(jù)

          2.       HBase Shell,HBase的命令行工具,最簡單的接口,適合HBase管理使用

          3.       Thrift Gateway,利用Thrift序列化技術(shù),支持C++,PHP,Python等多種語言,適合其他異構(gòu)系統(tǒng)在線訪問HBase表數(shù)據(jù)

          4.       REST Gateway,支持REST 風(fēng)格的Http API訪問HBase, 解除了語言限制

          5.       Pig,可以使用Pig Latin流式編程語言來操作HBase中的數(shù)據(jù),和Hive類似,本質(zhì)最終也是編譯成MapReduce Job來處理HBase表數(shù)據(jù),適合做數(shù)據(jù)統(tǒng)計

          6.       Hive,當(dāng)前Hive的Release版本尚沒有加入對HBase的支持,但在下一個版本Hive 0.7.0中將會支持HBase,可以使用類似SQL語言來訪問HBase

          HBase數(shù)據(jù)模型

          Table & Column Family

          Row Key Timestamp Column Family
          URI Parser
          r1 t3 url=http://www.taobao.com title=天天特價
          t2 host=taobao.com
          t1
          r2 t5 url=http://www.alibaba.com content=每天…
          t4 host=alibaba.com

          Ø  Row Key: 行鍵,Table的主鍵,Table中的記錄按照Row Key排序

          Ø  Timestamp: 時間戳,每次數(shù)據(jù)操作對應(yīng)的時間戳,可以看作是數(shù)據(jù)的version number

          Ø  Column Family:列簇,Table在水平方向有一個或者多個Column Family組成,一個Column Family中可以由任意多個Column組成,即Column Family支持動態(tài)擴展,無需預(yù)先定義Column的數(shù)量以及類型,所有Column均以二進(jìn)制格式存儲,用戶需要自行進(jìn)行類型轉(zhuǎn)換。

          Table & Region

          當(dāng)Table隨著記錄數(shù)不斷增加而變大后,會逐漸分裂成多份splits,成為regions,一個region由[startkey,endkey)表示,不同的region會被Master分配給相應(yīng)的RegionServer進(jìn)行管理:

          -ROOT- && .META. Table

          HBase中有兩張?zhí)厥獾腡able,-ROOT-和.META.

          Ø  .META.:記錄了用戶表的Region信息,.META.可以有多個regoin

          Ø  -ROOT-:記錄了.META.表的Region信息,-ROOT-只有一個region

          Ø  Zookeeper中記錄了-ROOT-表的location

          Client訪問用戶數(shù)據(jù)之前需要首先訪問zookeeper,然后訪問-ROOT-表,接著訪問.META.表,最后才能找到用戶數(shù)據(jù)的位置去訪問,中間需要多次網(wǎng)絡(luò)操作,不過client端會做cache緩存。

          MapReduce on HBase

          在HBase系統(tǒng)上運行批處理運算,最方便和實用的模型依然是MapReduce,如下圖:

          HBase Table和Region的關(guān)系,比較類似HDFS File和Block的關(guān)系,HBase提供了配套的TableInputFormat和TableOutputFormat API,可以方便的將HBase Table作為Hadoop MapReduce的Source和Sink,對于MapReduce Job應(yīng)用開發(fā)人員來說,基本不需要關(guān)注HBase系統(tǒng)自身的細(xì)節(jié)。

          HBase系統(tǒng)架構(gòu)

          Client

          HBase Client使用HBase的RPC機制與HMaster和HRegionServer進(jìn)行通信,對于管理類操作,Client與HMaster進(jìn)行RPC;對于數(shù)據(jù)讀寫類操作,Client與HRegionServer進(jìn)行RPC

          Zookeeper

          Zookeeper Quorum中除了存儲了-ROOT-表的地址和HMaster的地址,HRegionServer也會把自己以Ephemeral方式注冊到Zookeeper中,使得HMaster可以隨時感知到各個HRegionServer的健康狀態(tài)。此外,Zookeeper也避免了HMaster的單點問題,見下文描述

          HMaster

          HMaster沒有單點問題,HBase中可以啟動多個HMaster,通過Zookeeper的Master Election機制保證總有一個Master運行,HMaster在功能上主要負(fù)責(zé)Table和Region的管理工作:

          1.       管理用戶對Table的增、刪、改、查操作

          2.       管理HRegionServer的負(fù)載均衡,調(diào)整Region分布

          3.       在Region Split后,負(fù)責(zé)新Region的分配

          4.       在HRegionServer停機后,負(fù)責(zé)失效HRegionServer 上的Regions遷移

          HRegionServer

          HRegionServer主要負(fù)責(zé)響應(yīng)用戶I/O請求,向HDFS文件系統(tǒng)中讀寫數(shù)據(jù),是HBase中最核心的模塊。

          HRegionServer內(nèi)部管理了一系列HRegion對象,每個HRegion對應(yīng)了Table中的一個Region,HRegion中由多個HStore組成。每個HStore對應(yīng)了Table中的一個Column Family的存儲,可以看出每個Column Family其實就是一個集中的存儲單元,因此最好將具備共同IO特性的column放在一個Column Family中,這樣最高效。

          HStore存儲是HBase存儲的核心了,其中由兩部分組成,一部分是MemStore,一部分是StoreFiles。MemStore是Sorted Memory Buffer,用戶寫入的數(shù)據(jù)首先會放入MemStore,當(dāng)MemStore滿了以后會Flush成一個StoreFile(底層實現(xiàn)是HFile),當(dāng)StoreFile文件數(shù)量增長到一定閾值,會觸發(fā)Compact合并操作,將多個StoreFiles合并成一個StoreFile,合并過程中會進(jìn)行版本合并和數(shù)據(jù)刪除,因此可以看出HBase其實只有增加數(shù)據(jù),所有的更新和刪除操作都是在后續(xù)的compact過程中進(jìn)行的,這使得用戶的寫操作只要進(jìn)入內(nèi)存中就可以立即返回,保證了HBase I/O的高性能。當(dāng)StoreFiles Compact后,會逐步形成越來越大的StoreFile,當(dāng)單個StoreFile大小超過一定閾值后,會觸發(fā)Split操作,同時把當(dāng)前Region Split成2個Region,父Region會下線,新Split出的2個孩子Region會被HMaster分配到相應(yīng)的HRegionServer上,使得原先1個Region的壓力得以分流到2個Region上。下圖描述了Compaction和Split的過程:

          在理解了上述HStore的基本原理后,還必須了解一下HLog的功能,因為上述的HStore在系統(tǒng)正常工作的前提下是沒有問題的,但是在分布式系統(tǒng)環(huán)境中,無法避免系統(tǒng)出錯或者宕機,因此一旦HRegionServer意外退出,MemStore中的內(nèi)存數(shù)據(jù)將會丟失,這就需要引入HLog了。每個HRegionServer中都有一個HLog對象,HLog是一個實現(xiàn)Write Ahead Log的類,在每次用戶操作寫入MemStore的同時,也會寫一份數(shù)據(jù)到HLog文件中(HLog文件格式見后續(xù)),HLog文件定期會滾動出新的,并刪除舊的文件(已持久化到StoreFile中的數(shù)據(jù))。當(dāng)HRegionServer意外終止后,HMaster會通過Zookeeper感知到,HMaster首先會處理遺留的 HLog文件,將其中不同Region的Log數(shù)據(jù)進(jìn)行拆分,分別放到相應(yīng)region的目錄下,然后再將失效的region重新分配,領(lǐng)取 到這些region的HRegionServer在Load Region的過程中,會發(fā)現(xiàn)有歷史HLog需要處理,因此會Replay HLog中的數(shù)據(jù)到MemStore中,然后flush到StoreFiles,完成數(shù)據(jù)恢復(fù)。

          HBase存儲格式

          HBase中的所有數(shù)據(jù)文件都存儲在Hadoop HDFS文件系統(tǒng)上,主要包括上述提出的兩種文件類型:

          1.       HFile, HBase中KeyValue數(shù)據(jù)的存儲格式,HFile是Hadoop的二進(jìn)制格式文件,實際上StoreFile就是對HFile做了輕量級包裝,即StoreFile底層就是HFile

          2.       HLog File,HBase中WAL(Write Ahead Log) 的存儲格式,物理上是Hadoop的Sequence File

          HFile

          下圖是HFile的存儲格式:

          首先HFile文件是不定長的,長度固定的只有其中的兩塊:Trailer和FileInfo。正如圖中所示的,Trailer中有指針指向其他數(shù)據(jù)塊的起始點。File Info中記錄了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等。Data Index和Meta Index塊記錄了每個Data塊和Meta塊的起始點。

          Data Block是HBase I/O的基本單元,為了提高效率,HRegionServer中有基于LRU的Block Cache機制。每個Data塊的大小可以在創(chuàng)建一個Table的時候通過參數(shù)指定,大號的Block有利于順序Scan,小號Block利于隨機查詢。每個Data塊除了開頭的Magic以外就是一個個KeyValue對拼接而成, Magic內(nèi)容就是一些隨機數(shù)字,目的是防止數(shù)據(jù)損壞。后面會詳細(xì)介紹每個KeyValue對的內(nèi)部構(gòu)造。

          HFile里面的每個KeyValue對就是一個簡單的byte數(shù)組。但是這個byte數(shù)組里面包含了很多項,并且有固定的結(jié)構(gòu)。我們來看看里面的具體結(jié)構(gòu):

          開始是兩個固定長度的數(shù)值,分別表示Key的長度和Value的長度。緊接著是Key,開始是固定長度的數(shù)值,表示RowKey的長度,緊接著是RowKey,然后是固定長度的數(shù)值,表示Family的長度,然后是Family,接著是Qualifier,然后是兩個固定長度的數(shù)值,表示Time Stamp和Key Type(Put/Delete)。Value部分沒有這么復(fù)雜的結(jié)構(gòu),就是純粹的二進(jìn)制數(shù)據(jù)了。

          HLogFile

          上圖中示意了HLog文件的結(jié)構(gòu),其實HLog文件就是一個普通的Hadoop Sequence File,Sequence File 的Key是HLogKey對象,HLogKey中記錄了寫入數(shù)據(jù)的歸屬信息,除了table和region名字外,同時還包括 sequence number和timestamp,timestamp是“寫入時間”,sequence number的起始值為0,或者是最近一次存入文件系統(tǒng)中sequence number。

          HLog Sequece File的Value是HBase的KeyValue對象,即對應(yīng)HFile中的KeyValue,可參見上文描述。

          結(jié)束

          本文對HBase技術(shù)在功能和設(shè)計上進(jìn)行了大致的介紹,由于篇幅有限,本文沒有過多深入地描述HBase的一些細(xì)節(jié)技術(shù)。目前一淘的存儲系統(tǒng)就是基于HBase技術(shù)搭建的,后續(xù)將介紹“一淘分布式存儲系統(tǒng)”,通過實際案例來更多的介紹HBase應(yīng)用。

          posted on 2011-01-21 19:04 ivaneeo 閱讀(929) 評論(0)  編輯  收藏 所屬分類:
          主站蜘蛛池模板: 井冈山市| 秦安县| 双鸭山市| 彰化市| 洛南县| 清苑县| 长丰县| 石阡县| 扎赉特旗| 巴彦淖尔市| 志丹县| 柳江县| 南召县| 韩城市| 泸定县| 颍上县| 石景山区| 眉山市| 厦门市| 康马县| 东平县| 潞城市| 麦盖提县| 鹿邑县| 隆回县| 那曲县| 静乐县| 黄龙县| 余庆县| 贞丰县| 太康县| 德安县| 宜宾市| 将乐县| 阿鲁科尔沁旗| 汉阴县| 和平县| 利辛县| 张北县| 定西市| 枝江市|