HBase是一種Hadoop數(shù)據(jù)庫(kù),經(jīng)常被描述為一種稀疏的,分布式的,持久化的,多維有序映射,它基于行鍵、列鍵和時(shí)間戳建立索引,是一個(gè)可以隨機(jī)訪問(wèn)的存儲(chǔ)和檢索數(shù)據(jù)的平臺(tái)。HBase不限制存儲(chǔ)的數(shù)據(jù)的種類,允許動(dòng)態(tài)的、靈活的數(shù)據(jù)模型,不用SQL語(yǔ)言,也不強(qiáng)調(diào)數(shù)據(jù)之間的關(guān)系。HBase被設(shè)計(jì)成在一個(gè)服務(wù)器集群上運(yùn)行,可以相應(yīng)地橫向擴(kuò)展。
HBase使用場(chǎng)景和成功案例
互聯(lián)網(wǎng)搜索問(wèn)題:爬蟲(chóng)收集網(wǎng)頁(yè),存儲(chǔ)到BigTable里,MapReduce計(jì)算作業(yè)掃描全表生成搜索索引,從BigTable中查詢搜索結(jié)果,展示給用戶。
抓取增量數(shù)據(jù):例如,抓取監(jiān)控指標(biāo),抓取用戶交互數(shù)據(jù),遙測(cè)技術(shù),定向投放廣告等
內(nèi)容服務(wù)
信息交互
入門
1、API
和數(shù)據(jù)操作有關(guān)的HBase API有5個(gè),分別是 Get(讀),Put(寫),Delete(刪),Scan(掃描)和Increment(列值遞增)
2、操作表
首先要?jiǎng)?chuàng)建一個(gè)configuration對(duì)象
Configuration conf = HBaseConfiguration.create();
使用eclipse時(shí)的話還必須將配置文件添加進(jìn)來(lái)。
conf.addResource(new Path(“E:\\share\\hbase-site.xml”));
conf.addResource(new Path(“E:\\share\\core-site.xml”));
conf.addResource(new Path(“E:\\share\\hdfs-site.xml”));
使用連接池創(chuàng)建一張表。
HTablePool pool = new HTablePool(conf,1);
HTableInterface usersTable = pool.getTable(“users”);
3、寫操作
用來(lái)存儲(chǔ)數(shù)據(jù)的命令是put,往表里存儲(chǔ)數(shù)據(jù),需要?jiǎng)?chuàng)建Put實(shí)例。并制定要加入的行
Put put = new Put(byte[] row) ;
Put的add方法用來(lái)添加數(shù)據(jù),分別設(shè)定列族,限定符以及單元格的指
put.add(byte[] family , byte[] qualifier , byte[] value) ;
最后提交命令給表
usersTable.put(put);
usersTable.close();
修改數(shù)據(jù),只需重新提交一次最新的數(shù)據(jù)即可。
HBase寫操作的工作機(jī)制:
HBase每次執(zhí)行寫操作都會(huì)寫入兩個(gè)地方:預(yù)寫式日志(write-ahead log,也稱HLog)和MemStore(寫入緩沖區(qū)),以保證數(shù)據(jù)持久化,只有當(dāng)這兩個(gè)地方的變化信息都寫入并確認(rèn)后,才認(rèn)為寫動(dòng)作完成。MemStore是內(nèi)存里的寫入緩沖區(qū),HBase中數(shù)據(jù)在永久寫入硬盤之前在這里累積,當(dāng)MemStore填滿后,其中的數(shù)據(jù)會(huì)刷寫到硬盤,生成一個(gè)HFile。
4、讀操作
創(chuàng)建一個(gè)Get命令實(shí)例,包含要查詢的行
Get get = new Get(byte[] row) ;
執(zhí)行addColumn()或addFamily()可以設(shè)置限制條件。
將get實(shí)例提交到表會(huì)返回一個(gè)包含數(shù)據(jù)的Result實(shí)例,實(shí)例中包含行中所有列族的所有列。
Result r = usersTable.get(get) ;
可以對(duì)result實(shí)例檢索特定的值
byte[] b = r.getValue(byte[] family , byte[] qualifier) ;
工作機(jī)制:
BlockCache用來(lái)保存從HFile中讀入內(nèi)存的頻繁訪問(wèn)的數(shù)據(jù),避免硬盤讀,每個(gè)列族都有自己的BlockCache。從HBase中讀出一行,首先會(huì)檢查MemStore等待修改的隊(duì)列,然后檢查BlockCache看包含該行的Block是否最近被訪問(wèn)過(guò),最后訪問(wèn)硬盤上的對(duì)應(yīng)HFile。
5、刪除操作
創(chuàng)建一個(gè)Delete實(shí)例,指定要?jiǎng)h除的行。
Delete delete = new Delete(byte[] row) ;
可以通過(guò)deleteFamily()和deleteColumn()方法指定刪除行的一部分。
6表掃描操作
Scan scan = new Scan() 可以指定起始行和結(jié)束行。
setStartRow() , setStopRow() , setFilter()方法可以用來(lái)限制返回的數(shù)據(jù)。
addColumn()和addFamily()方法還可以指定列和列族。
HBase模式的數(shù)據(jù)模型包括:
表:HBase用表來(lái)組織數(shù)據(jù)。
行:在表里,數(shù)據(jù)按行存儲(chǔ),行由行鍵唯一標(biāo)識(shí)。行鍵沒(méi)有數(shù)據(jù)類型,為字節(jié)數(shù)組byte[]。
列族:行里的數(shù)據(jù)按照列族分組,列族必須事先定義并且不輕易修改。表中每行擁有相同的列族。
列限定符:列族里的數(shù)據(jù)通過(guò)列限定符或列來(lái)定位,列限定符不必事先定義。
單元:存儲(chǔ)在單元里的數(shù)據(jù)稱為單元值,值是字節(jié)數(shù)組。單元由行鍵,列族或列限定符一起確定。
時(shí)間版本:?jiǎn)卧涤袝r(shí)間版本,是一個(gè)long類型。
一個(gè)HBase數(shù)據(jù)坐標(biāo)的例子:
HBase可以看做是一個(gè)鍵值數(shù)據(jù)庫(kù)。HBase的設(shè)計(jì)是面向半結(jié)構(gòu)化數(shù)據(jù)的,數(shù)據(jù)記錄可能包含不一致的列,不確定大小等。
三、分布式的HBase、HDFS和MapReduce
1、分布式模式的HBase
HBase將表會(huì)切分成小的數(shù)據(jù)單位叫region,分配到多臺(tái)服務(wù)器。托管region的服務(wù)器叫做RegionServer。一般情況下,RgionServer和HDFS DataNode并列配置在同一物理硬件上,RegionServer本質(zhì)上是HDFS客戶端,在上面存儲(chǔ)訪問(wèn)數(shù)據(jù),HMaster分配region給RegionServer,每個(gè)RegionServer托管多個(gè)region。
HBase中的兩個(gè)特殊的表,-ROOT-和.META.,用來(lái)查找各種表的region位置在哪。-ROOT-指向.META.表的region,.META.表指向托管待查找的region的RegionServer。
一次客戶端查找過(guò)程的3層分布式B+樹(shù)如下圖:
HBase頂層結(jié)構(gòu)圖:
zookeeper負(fù)責(zé)跟蹤region服務(wù)器,保存root region的地址。
Client負(fù)責(zé)與zookeeper子集群以及HRegionServer聯(lián)系。
HMaster負(fù)責(zé)在啟動(dòng)HBase時(shí),把所有的region分配到每個(gè)HRegion Server上,也包括-ROOT-和.META.表。
HRegionServer負(fù)責(zé)打開(kāi)region,并創(chuàng)建對(duì)應(yīng)的HRegion實(shí)例。HRegion被打開(kāi)后,它為每個(gè)表的HColumnFamily創(chuàng)建一個(gè)Store實(shí)例。每個(gè)Store實(shí)例包含一個(gè)或多個(gè)StoreFile實(shí)例,它們是實(shí)際數(shù)據(jù)存儲(chǔ)文件HFile的輕量級(jí)封裝。每個(gè)Store有其對(duì)應(yīng)的一個(gè)MemStore,一個(gè)HRegionServer共享一個(gè)HLog實(shí)例。
一次基本的流程:
a、 客戶端通過(guò)zookeeper獲取含有-ROOT-的region服務(wù)器名。
b、 通過(guò)含有-ROOT-的region服務(wù)器查詢含有.META.表中對(duì)應(yīng)的region服務(wù)器名。
c、 查詢.META.服務(wù)器獲取客戶端查詢的行鍵數(shù)據(jù)所在的region服務(wù)器名。
d、 通過(guò)行鍵數(shù)據(jù)所在的region服務(wù)器獲取數(shù)據(jù)。
HFile結(jié)構(gòu)圖:
Trailer有指向其他塊的指針,Index塊記錄Data和Meta塊的偏移量,Data和Meta塊存儲(chǔ)數(shù)據(jù)。默認(rèn)大小是64KB。每個(gè)塊包含一個(gè)Magic頭部和一定數(shù)量的序列化的KeyValue實(shí)例。
KeyValue格式:
該結(jié)構(gòu)以兩個(gè)分別表示鍵長(zhǎng)度和值長(zhǎng)度的定長(zhǎng)數(shù)字開(kāi)始,鍵包含了行鍵,列族名和列限定符,時(shí)間戳等。
預(yù)寫日志W(wǎng)AL:
每次更新都會(huì)寫入日志,只有寫入成功才會(huì)通知客戶端操作成功,然后服務(wù)器可以按需自由地批量處理或聚合內(nèi)存中的數(shù)據(jù)。
編輯流在memstore和WAL之間分流的過(guò)程:
處理過(guò)程:客戶端通過(guò)RPC調(diào)用將KeyValue對(duì)象實(shí)例發(fā)送到含有匹配region的HRegionServer。接著這些實(shí)例被發(fā)送到管理相應(yīng)行的HRegion實(shí)例,數(shù)據(jù)被寫入到WAL,然后被放入到實(shí)際擁有記錄的存儲(chǔ)文件的MemStore中。當(dāng)memstore中的數(shù)據(jù)達(dá)到一定的大小以后,數(shù)據(jù)會(huì)異步地連續(xù)寫入到文件系統(tǒng)中,WAL能保證這一過(guò)程的數(shù)據(jù)不會(huì)丟失。
1、為什么引入?yún)f(xié)處理器?
在舊版(0.92HBase版本之前)的HBase中是沒(méi)有引入?yún)f(xié)處理器的概念的。這樣存在的問(wèn)題是:創(chuàng)建二級(jí)索引較難,很難進(jìn)行簡(jiǎn)單的排序、求和、計(jì)數(shù)等操作。這里是指在該版本限制下難以進(jìn)行上述操作,不是不行。為了降低難度,提出了協(xié)處理器的概念。
這里補(bǔ)充索引相關(guān)的知識(shí)點(diǎn):
索引的概念:
i)明確是針對(duì)數(shù)據(jù)庫(kù)而言的,體現(xiàn)是一張表或者一種數(shù)據(jù)結(jié)構(gòu),一列或者多列,目的是用來(lái)快速訪問(wèn)數(shù)據(jù)庫(kù)中的信息。包含的內(nèi)容是:鍵的屬性值和存儲(chǔ)文件位置信息的指針。
ii)主索引:
主索引是包含兩個(gè)定長(zhǎng)字段的有序文件。字段1:主鍵;字段2:磁盤塊的指針。 這兩個(gè)字段的值是索引項(xiàng)的值。
ii)二級(jí)索引
二級(jí)索引的概念:
“二級(jí)索引也是有兩個(gè)字段的有序文件:
第一個(gè)字段是索引字段,有相同的數(shù)據(jù)類型,并且是數(shù)據(jù)文件中的非排序字段,
第二個(gè)字段可以是一個(gè)塊指針也可以是記錄指針。二級(jí)索引(也稱為非聚簇索引)用于在二級(jí)鍵上搜索文件,二級(jí)索引的搜索鍵指定了一個(gè)順序,這個(gè)順序與文件的排序順序不同。”
2、協(xié)處理器的特性是什么?
允許用戶執(zhí)行region級(jí)的操作,使用類似觸發(fā)器的功能
允許擴(kuò)展現(xiàn)有的RPC協(xié)議引入自己的調(diào)用
提供一個(gè)非常靈活的、可用于建立分布式服務(wù)的數(shù)據(jù)模型
能夠自動(dòng)化擴(kuò)展、負(fù)載均衡、應(yīng)用請(qǐng)求路由
3.協(xié)處理器的使用場(chǎng)景:
維護(hù)輔助索引;維護(hù)數(shù)據(jù)間的應(yīng)用完整性。
4.協(xié)處理器框架提供了兩大類Observer、endPoint(以下是參考HBase權(quán)威指南第三版)
通過(guò)繼承這兩大類來(lái)擴(kuò)展自己的功能。
1)Observer(觀察者)
該類是與RDMS中的觸發(fā)器類似。回調(diào)函數(shù)在一些特定的事件發(fā)生時(shí)被調(diào)用。
事件包括:用戶產(chǎn)生的事件或者服務(wù)端內(nèi)部產(chǎn)生的事件。
協(xié)處理器框架提供的接口如下:
a、RegionObserver:用戶可以通過(guò)這種處理器來(lái)處理數(shù)據(jù)修改事件,它們與表的Region緊密關(guān)聯(lián)。region級(jí)的操作。對(duì)應(yīng)的操作是:put/delete/scan/get
b、MasterObserver:可以用作管理或DDL類型的操作,是集群級(jí)的操作。對(duì)應(yīng)的操作是:創(chuàng)建、刪除、修改表。
c、WALObserver:提供控制WAL的鉤子函數(shù)。
Observer定義好鉤子函數(shù),服務(wù)端可以調(diào)用。
2)endPoint
該類的功能類似RDMS中的存儲(chǔ)過(guò)程。將用戶的自定義操作添加到服務(wù)器端,endPoint可以通過(guò)添加遠(yuǎn)程過(guò)程調(diào)用來(lái)擴(kuò)展RPC協(xié)議。用戶可以將自定義完成某項(xiàng)操作代碼部署到服務(wù)器端。例如:服務(wù)器端的計(jì)算操作。
當(dāng)二者結(jié)合使用可以決定服務(wù)器端的狀態(tài)。
5、Coprocessor類
所有的協(xié)處理器都必須實(shí)現(xiàn)給接口,該接口定義了協(xié)處理器的基本約定和易于框架管理,并且定義協(xié)處理器的執(zhí)行的優(yōu)先級(jí)別。
1)協(xié)處理器的執(zhí)行順序
Coprocessor.Priority枚舉類型定義了兩個(gè)值:SYSTEM、USER。前者優(yōu)于后者執(zhí)行,后者定義的按順序執(zhí)行。
2)協(xié)處理器的生命周期
協(xié)處理器的生命周期是由框架管理的,接口定義兩個(gè)方法start、stop。這兩個(gè)方法的參數(shù)是:CoprocessorEnvironment。該類提供了訪問(wèn)HBase的版本、Coprocessor版本、協(xié)處理器優(yōu)先級(jí)等方法。start/stop方法是被隱式調(diào)用的,且關(guān)于協(xié)處理器的狀態(tài)的定義是有一個(gè)枚舉類Coprocessor.State對(duì)應(yīng)的。
3)協(xié)處理器環(huán)境和實(shí)例的維護(hù)
CoprocessorHost類來(lái)完成,其有相應(yīng)的子類來(lái)完成維護(hù)region、master協(xié)處理器的實(shí)例和環(huán)境。
總結(jié):Coprocessor、CoprocessorEnvironment、CoprocessorHost是三個(gè)類,在該三個(gè)類的基礎(chǔ)上進(jìn)行擴(kuò)展功能,完成支持、管理、維護(hù)協(xié)處理器。
6、協(xié)處理器的加載/部署
在加載處理器的方式上有兩種方式:1.通過(guò)配置文件靜態(tài)加載 2.在集群運(yùn)行時(shí)動(dòng)態(tài)加載(在權(quán)威指南第三版中指出尚未有動(dòng)態(tài)加載的API)。
1) 對(duì)于靜態(tài)加載的方式
在HBase權(quán)威指南中P171頁(yè)指出,在此不再贅述,是搬磚的苦力活。其中需要強(qiáng)調(diào)的是書(shū)中“配置文件中配置項(xiàng)的順序非常重要,這個(gè)順序決定了執(zhí)行順序”
2)特定表加載處理器是歸屬于靜態(tài)加載的方式
對(duì)于特定表的協(xié)處理器加載是通過(guò)表描述符。所以該處理器的加載只針對(duì)該表的region,同時(shí)被服務(wù)端的region和region server調(diào)用,不能被master或WAL調(diào)用。在HBase權(quán)威指南的P173給出示例。
7、RegionObserver類
該類的描述:1.RegionObserver類是Observer類的子類2.明確是在響應(yīng)region級(jí)別的操作。當(dāng)region事件發(fā)生時(shí),其定義的鉤子函數(shù)被調(diào)用。該級(jí)別的操作可以分為兩類:region生命周期變化或客戶端API調(diào)用。
1)處理region生命周期事件
這里的生命周期事件體現(xiàn)的是region的狀態(tài)變化,而觸發(fā)器處理的時(shí)間發(fā)生在是狀態(tài)變化的前、后。
下面是不同的狀態(tài)的前后可以定義的協(xié)處理器(這里的協(xié)處理器就是指可以進(jìn)行的操作):
狀態(tài)1:pendingOpen,region將要被打開(kāi)的狀態(tài)。
協(xié)處理器以實(shí)現(xiàn)的方法是:
preOpen()/postOpen()。完成功能是:搭載或者阻止這次打開(kāi)過(guò)程。
preWALRestore()/postWALRestore.完成的功能是:用戶可以訪問(wèn)那些記錄被修改了,監(jiān)督那些記錄被實(shí)施了。
狀態(tài)2:open,這個(gè)狀態(tài)的標(biāo)志是:region被部署到一個(gè)region server上且正常工作時(shí)。
協(xié)處理器可以實(shí)現(xiàn)的方法是:
void preFlush()/void postFlush() 內(nèi)存被持久到磁盤
void preSpilt()/void postSpilt() region達(dá)到足夠大時(shí)進(jìn)行拆分
狀態(tài)3:pendingClose。region將要被關(guān)閉時(shí)的狀態(tài)。
協(xié)處理器可以實(shí)現(xiàn)的方法是:
void preClose()/void postClose()
2)處理客戶端API事件
這里是指在調(diào)用Java API 時(shí),響應(yīng)的事件。如:
void prePut()/void postPut、void preDelete()/postDelete()、void preGet()/void postGet()。。。。。。。。
3)RegionCoprocessorEnvironment類
實(shí)現(xiàn)RegionObserver類的協(xié)處理器環(huán)境類是基于RegionCoprocessorEnvironment類的,通過(guò)該類可以訪問(wèn)管理Region實(shí)例和共享RegionServerService實(shí)例
4)ObserverContext
RegionObserver類提供的所有回調(diào)函數(shù)都需要一個(gè)特殊的上下文作為共同參數(shù)。ObserverContext類提供了訪問(wèn)當(dāng)前系統(tǒng)環(huán)境的入口,同時(shí)也添加一些關(guān)鍵功能用以通知協(xié)處理器框架在回到函數(shù)完成后需要做什么。講解了byPass()/complete()方法,前者會(huì)停止當(dāng)前服務(wù)進(jìn)程處理過(guò)程,后者影響后面執(zhí)行的協(xié)處理器。
5)BaseRegionObserver類
該類的作用是:可以作為實(shí)現(xiàn)所有監(jiān)聽(tīng)類型協(xié)處理器的基類。需要注意的是要想實(shí)現(xiàn)自定義的功能必須重載這個(gè)類的方法。
8、MasterObserver類
協(xié)處理器定義明確為master服務(wù)器的所有回調(diào)函數(shù)。這些回調(diào)函數(shù)中的操作是類似DDL,創(chuàng)建、刪除、修改表。
1)MasterCoprocessorEnvironment
MasterCoprocessorEnvironment封裝了MasterObserver實(shí)例,通過(guò)該類可以訪問(wèn)MasterService實(shí)例。
2)BaseMasterServer
BaseMasterServer是MasterServer的空實(shí)現(xiàn),可以通過(guò)實(shí)現(xiàn)相應(yīng)的pre/post來(lái)自定義相關(guān)操作。 例如: void preCreateTable()/void postCreateTable() void preDeleteTable()/void postDeleteTable()。。。。。。
9、endPoint
提出endPoint原因?
CoprocessorProtocol接口
該接口可以使用戶自定義RPC協(xié)議,它的實(shí)現(xiàn)代碼被安裝在服務(wù)端,在客戶端HTable提供調(diào)用方法,使用該協(xié)議可以和協(xié)處理器實(shí)例之間通信。
評(píng)論
查看更多