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