Hbase的簡介與安裝

目錄

Hbase的簡介與安裝

HBase簡介

HBase架構

HBase數據模型

邏輯模型

物理模型

Hbase和Hive的區別

HBase的部署與安裝

軟件準備

部署過程


Hbase的簡介與安裝

HBase簡介

HBase是基於Hadoop的開源分佈式數據庫,它以Google的BigTable爲原型,設計並實現了具有高可靠性、高性能、列存儲、可伸縮、實時讀寫的分佈式數據庫系統。HBase不僅僅在其設計上不同於一般的關係型數據庫,在功能上區別更大,表現在其適合於存儲非結構化數據,而且HBase是基於列的而不是基於行的模式。就像BigTable利用GFS(Google文件系統)所提供的分佈式存儲一樣,HBase在Hadoop之上提供了類似於BigTable的能力。

HBase架構

Hbase採用Master/Slave 架構,下圖是Hbase體系架構,主節點運行的服務稱頭HMaster,從節點服務稱爲HRegionServer, 底層採用HDFS存儲數據。爲提供高可靠性,Hbase可以有多個HMaster,但同一時刻只可能有一個HMaster 作爲主服務,爲Hbase使用了ZooKeeper 來選定主HMaster,下面簡單介紹體系架構中的各個實體。
 

(1)Client

Client端使用Hbase的RPC機制與HMaster和HRegionServer進行通信,對管理類操作,Client 與HMaster進行RPC;對於數據讀/寫類操作, 與HRegionServer進行RPC。

(2)Zookeeper

Zookeeper中存儲了root 表的地址、HMaster的地址和HRegionServer 地址,通過ZooKeeper, HMaster 可以隨時感知到各個HRegionServer 的健康狀態。此外,ZooKeeper也避免了HMaster 的單點故障問題,Hbase 中可以啓動多個HMaster, 通過ZooKeeper的選舉機制能夠確保只有一個爲當前整個Hbase集羣的master。

(3)HMaster

即Hbase主節點,集羣中每個時刻只有一個HMaster運行,HMaster 將Region分配給HRegionServer,協調HRegionServer 的負載並維護集羣狀態,HMaster 對外不提供數據服務,HRegionServer 負責所有Regions讀/寫請求。如果HRegionServer發生故障終止後,HMaster會通過ZooKeeper 感知到,HMaster 會根據相應的Log 文件,將失效的Regions重新分配,此外HMaster還管理用戶對Table的增、刪、改、查操作。

HMaster的功能包括:

1.監控RegionServer

2.處理RegionServer故障轉移

3.處理元數據的變更

4.處理region的分配或移除

5.在空閒時間進行數據的負載均衡

6.通過Zookeeper發佈自己的位置給客戶端

(4)HRegionServer

HRegionServer主要負責響應用戶IO請求,向HDFS文件系統中讀/寫數據,其內部管理了一系列HRegion對象,當StoreFile大小超過一定閾值後,會觸發Split 操作,即將當前Region拆成兩個Region, 父Region會下線,新Split出的兩個孩子Region 會被HMaster分配到相應的HRegionServer上。

功能包括:

1.負責存儲HBase的實際數據

2.處理分配給它的Region

3.刷新緩存到HDFS

4.維護HLog

5.執行壓縮

6.負責處理Region分片

組件包括:

1.Write-Ahead logs:HBase的修改記錄,當對HBase讀寫數據的時候,數據不是直接寫進磁盤,它會在內存中保留一段時間(時間以及數據量閾值可以設定)。但把數據保存在內存中可能有更高的概率引起數據丟失,爲了解決這個問題,數據會先寫在一個叫做Write-Ahead logfile的文件中,然後再寫入內存中。所以在系統出現故障的時候,數據可以通過這個日誌文件重建。

2. HFile:這是在磁盤上保存原始數據的實際的物理文件,是實際的存儲文件。

3.Store:HFile存儲在Store中,一個Store對應HBase表中的一個列簇。

4.MemStore:顧名思義,就是內存存儲,位於內存中,用來保存當前的數據操作,所以當數據保存在WAL中之後,RegsionServer會在內存中存儲鍵值對。

5.Region:Hbase表的分片,HBase表會根據RowKey值被切分成不同的region存儲在RegionServer中,在一個RegionServer中可以有多個不同的region。

HBase數據模型

數據庫一般以表的形式存儲結構化數據,HBase也以表的形式存儲數據,我們稱用戶對數據的組織形式位數據的邏輯模型,HBase裏數據在HDFS上的具體存儲形式則稱爲數據的物理模型。

邏輯模型

HBase以表的形式存儲數據,每個表由行和列組成,每個列屬於一個特定的列族(Column Family)。 表中的行和列確定的存儲單元稱爲一個元素(Cell), 每個元素保存了同一份數據的多個版本,由時間戳(Time Stamp)來標識。

Hbase邏輯視圖
區域(region) 行鍵(rowkey) 時間戳(timestamp) 列簇1(colume family)store
列1(colume) 列2(colume)
rowkey1 t2    
t1

 

RowKey: 行鍵,Table的主鍵,Table中的記錄默認按照RowKey升序排序。

Timestamp:時間戳,每次數據操作對應的時間戳,可以看作是數據的version number。

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

Table & Region:當Table隨着記錄數不斷增加而變大後,會逐漸分裂成多份splits,成爲regions,一個region由[startkey,endkey)表示,不同的region會被Master分配給相應的RegionServer進行管理。.

可以把HBase看成一個多維度的Map模型去理解它的數據模型。正如下圖,一個行鍵映射一個列族數組,列族數組中的每個列族又映射一個列標識數組,列標識數組中的每一個列標識(Column Qualifier)又映射到一個時間戳數組,裏面是不同時間戳映射下不同版本的值,但是默認取最近時間的值,所以可以看成是列標識(Column Qualifier)和它所對應的值的映射。用戶也可以通過HBase的API去同時獲取到多個版本的單元數據的值。Row Key在HBase中也就相當於關係型數據庫的主鍵,並且Row Key在創建表的時候就已經設置好,用戶無法指定某個列作爲Row Key。

確定一個單元格的位置(cell),需要如下四個元素:

rowkey + Colume Family + Colume + timestamp(版本version),數據有版本的概念,即一個單元格可能有多個值,但是隻有最新得一個對外顯示。

 

物理模型

Hbase是按照列存儲的稀疏行/列矩陣,其物理模型實際上就是把概念模型中的一個行進行分割,並按照列族存儲。

HBase中有兩張特殊的Table,-ROOT-和.META:

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

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

Zookeeper中記錄了-ROOT-表的location,Client訪問用戶數據之前需要首先訪問zookeeper,然後訪問-ROOT-表,接着訪問.META.表,最後才能找到用戶數據的位置去訪問,中間需要多次網絡操作,不過client端會做cache緩存,注意:在0.96版本後,Hbase移除了-ROOT-表。

 

HBase中的所有數據文件都存儲在Hadoop HDFS文件系統上,主要包括兩種文件類型:

1.HFile, HBase中KeyValue數據的存儲格式,HFile是Hadoop的二進制格式文件,實際上StoreFile就是對HFile做了輕量級包裝,即StoreFile底層就是HFile。HStore存儲是HBase存儲的核心了,其中由兩部分組成,一部分是MemStore,一部分是StoreFiles。MemStore是Sorted Memory Buffer,用戶寫入的數據首先會放入MemStore,當MemStore滿了以後會Flush成一個StoreFile(底層實現是HFile),當StoreFile文件數量增長到一定閾值,會觸發Compact合併操作,將多個StoreFiles合併成一個StoreFile,合併過程中會進行版本合併和數據刪除,因此可以看出HBase其實只有增加數據,所有的更新和刪除操作都是在後續的compact過程中進行的,這使得用戶的寫操作只要進入內存中就可以立即返回,保證了HBase I/O的高性能。當StoreFiles Compact後,會逐步形成越來越大的StoreFile,當單個StoreFile大小超過一定閾值後,會觸發Split操作,同時把當前Region Split成2個Region,父Region會下線,新Split出的2個孩子Region會被HMaster分配到相應的HRegionServer上,使得原先1個Region的壓力得以分流到2個Region上。

2.HLog File,HBase中WAL(Write Ahead Log) 的存儲格式,物理上是Hadoop的Sequence File。每個HRegionServer中都有一個HLog對象,HLog是一個實現Write Ahead Log的類,在每次用戶操作寫入MemStore的同時,也會寫一份數據到HLog文件中,HLog文件定期會滾動出新的,並刪除舊的文件(已持久化到StoreFile中的數據)。當HRegionServer意外終止後,HMaster會通過Zookeeper感知到,HMaster首先會處理遺留的 HLog文件,將其中不同Region的Log數據進行拆分,分別放到相應region的目錄下,然後再將失效的region重新分配,領取 到這些region的HRegionServer在Load Region的過程中,會發現有歷史HLog需要處理,因此會Replay HLog中的數據到MemStore中,然後flush到StoreFiles,完成數據恢復。

Hbase和Hive的區別

Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射爲一張數據庫表,並提供簡單的sql查詢功能,可以將sql語句轉換爲MapReduce任務進行運行。

HBase是Hadoop的數據庫,一個分佈式、可擴展、大數據的存儲。

區別:

1.Hive中的表爲純邏輯表,僅僅對錶的元數據進行定義。Hive沒有物理存儲的功能,它完全依賴HDFS和MapReduce。這樣就可以將結構化的數據文件映射爲爲一張數據庫表,並提供完整的SQL查詢功能,並將SQL語句最終轉換爲MapReduce任務進行運行。HBase表則是物理表,適合存放非結構化的數據。

2.Hive是在MapReduce的基礎上對數據進行處理,而MapReduce的數據處理依照行模式;而HBase爲列模式,這樣使得對海量數據的隨機訪問變得可行。

3.HBase的存儲表存儲密度小,因而用戶可以對行定義成不同的列;而Hive是邏輯表,屬於稠密型,即定義列數,每一行對列數都有固定的數據。

4.Hive使用Hadoop來分析處理數據,而Hadoop系統是批處理系統,所以數據處理存在延時的問題;而HBase是準實時系統,可以實現數據的實時查詢。

5.Hive沒有row-level的更新,它適用於大量append-only數據集(如日誌)的批任務處理。而基於HBase的查詢,支持和row-level的更新。

6.Hive全面支持SQL,一般可以用來進行基於歷史數據的挖掘、分析。而HBase不適用於有join,多級索引,表關係複雜的應用場景。

總結:

Hive和Hbase是兩種基於Hadoop的不同技術–Hive是一種類SQL的引擎,並且運行MapReduce任務,Hbase是一種在Hadoop之上的NoSQL 的Key/vale數據庫。當然,這兩種工具是可以同時使用的。就像用Google來搜索,用FaceBook進行社交一樣,Hive可以用來進行統計查詢,HBase可以用來進行實時查詢,數據也可以從Hive寫到Hbase,設置再從Hbase寫回Hive。

HBase的部署與安裝

軟件準備

Zookeeper集羣、Hadoop集羣。

本文部署的Hbase文件爲:hbase-1.3.1-bin.tar.gz。

部署過程

(1)爲集羣所有服務器上傳壓縮包,並解壓:

(2)配置環境變量:

export HBASE_HOME=/opt/module/hbase-1.3.1
export PATH=$PATH:$HBASE_HOME/bin

(3)修改配置文件/opt/module/hbase-1.3.1/conf路徑下的hbase-env.sh:

export JAVA_HOME=/opt/module/jdk1.8.0_121
export HBASE_MANAGES_ZK=false

如果使用的是JDK8以上版本,註釋掉hbase-env.sh的45-47行,不然會報警告

(4)修改hbase-site.xml:

	<property>  
		<name>hbase.rootdir</name>  
		<value>hdfs://bigdata111:9000/hbase</value>  
	</property>

	<property>
		<name>hbase.cluster.distributed</name>
		<value>true</value>
	</property>

	<property>
		<name>hbase.master.port</name>
		<value>16000</value>
	</property>

	<property>  
		<name>hbase.zookeeper.quorum</name>
		<value>bigdata111:2181,bigdata112:2181,bigdata113:2181</value>
	</property>

	<property>  
		<name>hbase.zookeeper.property.dataDir</name>
	 <value>/opt/module/zookeeper-3.4.10/zkData</value>
	</property>

<property>
<name>hbase.master.maxclockskew</name>
<value>180000</value>
</property>

(5)修改regionservers文件:

(6)啓動Hbase

啓動之前一定要先啓動hadoop集羣和zookeeper集羣:

啓動Hbase:

(7)訪問web頁面:

Hbase配置成功。
參考文獻:

[1]https://www.cnblogs.com/fmgao-technology/p/10416542.html#_label1

[2]https://blog.csdn.net/wshyb0314/article/details/81475475

[3]https://www.jianshu.com/p/ba9171784b65

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章