ivaneeo's blog

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

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
          HBASE松散數(shù)據(jù)存儲(chǔ)設(shè)計(jì)初識(shí) - 西湖邊的窮秀才-文初 - BlogJava
              
          設(shè)為主頁(yè)        加入收藏幫助  |  留言交流  |      
          HBASE松散數(shù)據(jù)存儲(chǔ)設(shè)計(jì)初識(shí) - 西湖邊的窮秀才-文初 - BlogJava (轉(zhuǎn)載)
          HBASE松散數(shù)據(jù)存儲(chǔ)設(shè)計(jì)初識(shí)
           

          最近關(guān)注Hadoop,因此也順便關(guān)注了一下Hadoop相關(guān)的項(xiàng)目。HBASE就是基于Hadoop的一個(gè)開(kāi)源項(xiàng)目,也是對(duì)GoogleBigTable的一種實(shí)現(xiàn)。

                 BigTable是什么?GooglePaper對(duì)其作了充分的說(shuō)明。字面上看就是一張大表,其實(shí)和我們想象的傳統(tǒng)數(shù)據(jù)庫(kù)的表還是有些差別的。松散數(shù)據(jù)可以說(shuō)是介于Map Entrykey & value)和DB Row之間的一種數(shù)據(jù)。在我使用Memcache的時(shí)候,有時(shí)候的需求是需要存儲(chǔ)的不僅僅是簡(jiǎn)單的一個(gè)key對(duì)應(yīng)一個(gè)value,可能我需要類(lèi)似于數(shù)據(jù)庫(kù)表結(jié)構(gòu)中多屬性的存儲(chǔ),但是又不會(huì)有傳統(tǒng)數(shù)據(jù)庫(kù)表結(jié)構(gòu)中那么多關(guān)聯(lián)關(guān)系的需求,其實(shí)這類(lèi)數(shù)據(jù)就是所謂的松散數(shù)據(jù)。BigTable最淺顯來(lái)看就是一張很大的表,表的屬性可以根據(jù)需求去動(dòng)態(tài)增加,但是又沒(méi)有表與表之間關(guān)聯(lián)查詢(xún)的需求。

                 互聯(lián)網(wǎng)應(yīng)用有一個(gè)最大的特點(diǎn),就是速度,功能再?gòu)?qiáng)大,速度慢,還是會(huì)被舍棄。因此在大訪(fǎng)問(wèn)量的網(wǎng)站都采取前后的緩存來(lái)提升性能和響應(yīng)時(shí)間。對(duì)于Map Entry類(lèi)型的數(shù)據(jù),集中式分布式Cache都有很多選擇,對(duì)于傳統(tǒng)的關(guān)系型數(shù)據(jù),從MySQLOracle都給了很好的支持,唯有松散數(shù)據(jù)這類(lèi)數(shù)據(jù),采用前后兩種解決方案都不能最大化它的處理能力。因此BigTable才有了它用武之地。

                 HBASE作為Apache的開(kāi)源項(xiàng)目,也是出于起步階段,因?yàn)槠鋵?shí)它所依賴(lài)的Hadoop也不能說(shuō)已經(jīng)到了成熟階段,所以都有很大的發(fā)展空間,這也為我們這些開(kāi)源愛(ài)好者提供了更多空間去貢獻(xiàn)。這里主要會(huì)談到HBASE的框架設(shè)計(jì)方面的知識(shí)和它的一些特點(diǎn),不論是否采用HBASE去解決工作中的問(wèn)題,一種好的流程設(shè)計(jì)總會(huì)給開(kāi)發(fā)者和架構(gòu)設(shè)計(jì)者帶來(lái)一些思想上的火花。

          HBASE設(shè)計(jì)介紹

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

                 HBASE中的每一張表,就是所謂的BigTableBigTable會(huì)存儲(chǔ)一系列的行記錄,行記錄有三個(gè)基本類(lèi)型的定義:Row Key,Time Stamp,ColumnRow Key是行在BigTable中的唯一標(biāo)識(shí),Time Stamp是每次數(shù)據(jù)操作對(duì)應(yīng)關(guān)聯(lián)的時(shí)間戳,可以看作類(lèi)似于SVN的版本,Column定義為:<family>:<label>,通過(guò)這兩部分可以唯一的指定一個(gè)數(shù)據(jù)的存儲(chǔ)列,family的定義和修改需要對(duì)HBASE作類(lèi)似于DBDDL操作,而對(duì)于label的使用,則不需要定義直接可以使用,這也為動(dòng)態(tài)定制列提供了一種手段。family另一個(gè)作用其實(shí)在于物理存儲(chǔ)優(yōu)化讀寫(xiě)操作,同family的數(shù)據(jù)物理上保存的會(huì)比較臨近,因此在業(yè)務(wù)設(shè)計(jì)的過(guò)程中可以利用這個(gè)特性。

          看一下邏輯數(shù)據(jù)模型:

          Row Key

          Time Stamp

          Column "contents:"

          Column "anchor:"

          Column "mime:"

          "com.cnn.www"

          t9

          "anchor:cnnsi.com"

          "CNN"

          t8

          "anchor:my.look.ca"

          "CNN.com"

          t6

          "<html>..."

          "text/html"

          t5

          "<html>..."

          t3

          "<html>..."

          上表中有一列,列的唯一標(biāo)識(shí)為com.cnn.www,每一次邏輯修改都有一個(gè)timestamp關(guān)聯(lián)對(duì)應(yīng),一共有四個(gè)列定義:<contents:>,<anchor:cnnsi.com>,<anchor:my.look.ca>,<mime:>。如果用傳統(tǒng)的概念來(lái)將BigTable作解釋?zhuān)敲?/span>BigTable可以看作一個(gè)DB Schema,每一個(gè)Row就是一個(gè)表,Row key就是表名,這個(gè)表根據(jù)列的不同可以劃分為多個(gè)版本,同時(shí)每個(gè)版本的操作都會(huì)有時(shí)間戳關(guān)聯(lián)到操作的行。

          再看一下HBASE的物理數(shù)據(jù)模型:

          Row Key

          Time Stamp

          Column "contents:"

          "com.cnn.www"

          t6

          "<html>..."

          t5

          "<html>..."

          t3

          "<html>..."

          Row Key

          Time Stamp

          Column "anchor:"

          "com.cnn.www"

          t9

          "anchor:cnnsi.com"

          "CNN"

          t8

          "anchor:my.look.ca"

          "CNN.com"

          Row Key

          Time Stamp

          Column "mime:"

          "com.cnn.www"

          t6

          "text/html"

          物理數(shù)據(jù)模型其實(shí)就是將邏輯模型中的一個(gè)Row分割成為根據(jù)Column family存儲(chǔ)的物理模型。

          對(duì)于BigTable的數(shù)據(jù)模型操作的時(shí)候,會(huì)鎖定Row,并保證Row的原子操作。

          框架結(jié)構(gòu)及流程


          1 框架結(jié)構(gòu)圖

                 HBASE依托于HadoopHDFS作為存儲(chǔ)基礎(chǔ),因此結(jié)構(gòu)也很類(lèi)似于HadoopMaster-Slave模式,Hbase Master Server 負(fù)責(zé)管理所有的HRegion Server,但Hbase Master Server本身并不存儲(chǔ)HBASE中的任何數(shù)據(jù)。HBASE邏輯上的Table被定義成為一個(gè)Region存儲(chǔ)在某一臺(tái)HRegion Server上,HRegion Server Region的對(duì)應(yīng)關(guān)系是一對(duì)多的關(guān)系。每一個(gè)HRegion在物理上會(huì)被分為三個(gè)部分:HmemcacheHlogHStore,分別代表了緩存,日志,持久層。通過(guò)一次更新流程來(lái)看一下這三部分的作用:


          2 提交更新以及刷新Cache流程

                 由流程可以看出,提交更新操作將會(huì)寫(xiě)入到兩部分實(shí)體中,HMemcacheHlog中,HMemcache就是為了提高效率在內(nèi)存中建立緩存,保證了部分最近操作過(guò)的數(shù)據(jù)能夠快速的被讀取和修改,Hlog是作為同步HmemcacheHstore的事務(wù)日志,在HRegion Server周期性的發(fā)起Flush Cache命令的時(shí)候,就會(huì)將Hmemcache中的數(shù)據(jù)持久化到Hstore中,同時(shí)會(huì)清空Hmemecache中的數(shù)據(jù),這里采用的是比較簡(jiǎn)單的策略來(lái)做數(shù)據(jù)緩存和同步,復(fù)雜一些其實(shí)可以參照java的垃圾收集機(jī)制來(lái)做。

                 在讀取Region信息的時(shí)候,優(yōu)先讀取HMemcache中的內(nèi)容,如果未取到再去讀取Hstore中的數(shù)據(jù)。

          幾個(gè)細(xì)節(jié):

          1.              由于每一次Flash Cache,就會(huì)產(chǎn)生一個(gè)Hstore File,在Hstore中存儲(chǔ)的文件會(huì)越來(lái)越多,對(duì)性能也會(huì)產(chǎn)生一定影響,因此達(dá)到設(shè)置文件數(shù)量閥值的時(shí)候就會(huì)Merge這些文件為一個(gè)大文件。

          2.              Cache大小的設(shè)置以及flush的時(shí)間間隔設(shè)置需要考慮內(nèi)存消耗以及對(duì)性能的影響。

          3.              HRegion Server每次重新啟動(dòng)的時(shí)候會(huì)將Hlog中沒(méi)有被FlushHstore中的數(shù)據(jù)再次載入到Hmemcache,因此Hmemcache過(guò)大對(duì)于啟動(dòng)的速度也有直接影響。

          4.              Hstore File中存儲(chǔ)數(shù)據(jù)采用B-tree的算法,因此也支持了前面提到對(duì)于ColumnFamily數(shù)據(jù)操作的快速定位獲取。

          5.              HRegion可以Merge也可以被Split,根據(jù)HRegion的大小決定。不過(guò)在做這些操作的時(shí)候HRegion都會(huì)被鎖定不可使用。

          6.              Hbase Master Server通過(guò)Meta-info Table來(lái)獲取HRegion Server的信息以及Region的信息,Meta最頂部的一個(gè)Region是虛擬的一個(gè)叫做Root Region,通過(guò)Root Region可以找到下面各個(gè)實(shí)際的Region

          7.              客戶(hù)端通過(guò)Hbase Master Server獲得了Region所在的Region Server,然后就直接和Region Server進(jìn)行交互,而對(duì)于Region Server相互之間不通信,只和Hbase Master Server交互,受到Master Server的監(jiān)控和管理。

          后話(huà)

                 對(duì)HBase還沒(méi)有怎么使用,僅僅只是看了wiki去了解了一下結(jié)構(gòu)和作用,暫時(shí)還沒(méi)有需要使用的場(chǎng)景,不過(guò)對(duì)于各種開(kāi)源項(xiàng)目的設(shè)計(jì)有所了解,對(duì)自己的框架結(jié)構(gòu)設(shè)計(jì)也會(huì)有很多幫助,因此分享一下。

            (石頭狗 的分類(lèi)目錄 [hadoop])
          相關(guān)文章
          發(fā)表評(píng)論
          發(fā)送評(píng)論時(shí)內(nèi)容自動(dòng)復(fù)制到剪切板
          posted on 2011-01-21 19:31 ivaneeo 閱讀(411) 評(píng)論(0)  編輯  收藏 所屬分類(lèi):
          主站蜘蛛池模板: 宁陕县| 胶州市| 仪征市| 仲巴县| 蒲江县| 滦平县| 长汀县| 环江| 鸡东县| 屏山县| 清镇市| 黄梅县| 隆安县| 南宁市| 大渡口区| 金昌市| 旺苍县| 嘉祥县| 金门县| 东港市| 墨竹工卡县| 卢氏县| 南通市| 临邑县| 兴和县| 高州市| 本溪市| 芦山县| 澎湖县| 芦溪县| 凤庆县| 阳原县| 靖远县| 霍山县| 宁明县| 清镇市| 娄底市| 达州市| 赤水市| 徐闻县| 长沙市|