1. 程式人生 > >一起學HBase——簡單介紹HBase各種元件

一起學HBase——簡單介紹HBase各種元件

HBase是谷歌BigTble的開源實現。谷歌的三篇論文拉開了大資料江湖的序幕,鑄就了現在以Hadoop為主的大資料技術生態圈。而HBase是開源的大資料資料庫,和傳統的行式資料庫不同的是,HBase是列式資料庫。列式資料的特點是開源橫向擴充套件,將一張表的資料儲存在hadoop叢集的不同datanode中,一張表的儲存量可以達到T級別。這是行式關係型資料庫無法實現的。本文主要講解HBase的基本概念,只有概念清楚了才能更好的在我們的系統中使用HBase。

核心元件介紹

Table:可理解為傳統資料庫中的一個表,但因為SchemaLess的設計,它較之傳統資料庫的表而言,在設計上更加靈活。

Region:將表橫向切割為一個個子表,子表在HBase中被稱之為Region。

RegionServer:資料服務程序,Region必須部署在某一個RegionServer上才可以提供讀寫服務。

HFile:HBase資料庫在底層分散式檔案系統中的檔案組織形式。

Column Family:一些列的集合。不同的Column Family資料被儲存在不同的路徑中。

MemStore:用來在記憶體中快取一定大小的資料,達到設定的閾值後批量寫入到底層檔案系統中。資料是有序的。

下圖清晰的展示了Table,Region,RegionServer,HFile,MemStore,Column Family在HBase的邏輯關係。
HBase基礎知識

下圖顯示了HBase叢集中的關鍵程序
HBase基礎知識
Zookeeper:HBase叢集的排程器,可以用於將HBase RegionServer資訊註冊到zookeeper中,查詢HBase RegionServer狀態資訊,HMaster啟動時會將HBase系統表-ROOT-載入到zookeeper叢集中,通過zookeeper叢集可以獲取當前系統表.META.的儲存所對應的RegionServer資訊

Master,通過jps命令顯示的程序名稱是HMaster,在負責表管理操作,Region到各個RegionServer的分配以及RegionServer Failover的處理等。

RegionServer程序提供資料讀寫服務。

NameNode,Hadoop程序,處理來自Master的請求,H管理DFS檔案系統的名稱空間NameSpace。

DataNode,Hadoop資料節點程序,HBase的所有資料都存在Hadoop的DataNode中。

KeyValue資料儲存結構

HBase所儲存的資料是以KeyValue形式存放的,KeyValue有特定的資料結構,如下圖所示,一個KeyValue可以理解成HBase表中的一個列,當一行存在多個列時,將包含多個KeyValue,同一行的KeyValue有可能儲存在不同的檔案中,但在讀取時,會按需合併在一起返回給客戶端。
HBase基礎知識

使用者寫資料時,需要定義使用者資料的RowKey,指定每一列所存放的Column Family,並且為其定義相應的Qualifier(列名),Value部分存放使用者資料。Hbase中每一行可擁有不同的KeyValues,這就是HBase Schema-less的特點。

HBase中支援資料的多版本,通過帶有不同時間戳的多個KeyValue版本來實現的,如下圖所示。
HBase基礎知識

HBase所儲存的版本資料是可配置的,預設存放3個版本。在普通的讀取流程中,舊版本的資料時不可見的,但通過制定版本數或者版本號的讀取,可以獲取舊版本資料。下圖是普通讀取劉恆與多版本讀取流程的對比。

靈活的列定義

使用者資料存入到HBase表中時,需要進行Qualifier(KeyValue/列)設計。一個最簡單的設計是保持HBase的列與使用者資料的列一致,如下圖1的設計。這種設計,基本上與關係型資料庫的設計是一致的,但這種設計會帶來較大的資料冗餘(KeyValue結構開銷)。但HBase基於KeyValue的介面,決定了這種設計可以是非常靈活的,例如,我們也可以考慮為HBase的每一行只設置兩個列,其中,Name為一個列,其他內容合併到一個列中,如下圖2所示。
HBase基礎知識

儘管我們在使用HBase表存放資料的時候,需要預先做好列的設計。但這個設計僅僅由應用層感知,HBase並沒有存放任何的Schema資訊來描述這個設計。也就是說,應用層需要知道為每一個表/每一行設計了什麼樣的列(KeyValue),然後在地區的時候做相應的解析。既然HBase中並沒有Schema資訊,name,每一行中的列,也可以是任意新增的。如下圖所示,綠色背景的KeyValue為後續增加的。
HBase基礎知識

Column Family

假設為表設定了兩個列族,而且,定義了每一個列簇中要存放的列,如下圖所示:
{Name} -> Column Family - A, {City,Phone,Gender} -> Column Familly-B。不同列簇的資料會被儲存在不同的路徑中。即,設定多個列簇時一行資料可能存在於兩個路徑中。整行讀取的時候,需要將兩個路徑中的資料合併在一起蔡可以獲取完整的一行記錄。但如果僅僅讀取Name一列的話,只需要讀取Column Family-A即可。
HBase基礎知識