HBase介紹、搭建、環境、安裝部署

1、搭建環境

部署節點操作系統爲CentOS,防火牆和SElinux禁用,創建了一個shiyanlou用戶並在系統根目錄下創建/app目錄,用於存放Hadoop等組件運行包。因爲該目錄用於安裝hadoop等組件程序,用戶對shiyanlou必須賦予rwx權限(一般做法是root用戶在根目錄下創建/app目錄,並修改該目錄擁有者爲shiyanlou(chown –R shiyanlou:shiyanlou /app)。

Hadoop搭建環境:

l 虛擬機操作系統: CentOS6.6 64位,單核,1G內存

l JDK:1.7.0_55 64位

l Hadoop:1.1.2

2、HBase介紹

HBase – Hadoop Database,是一個高可靠性、高性能、面向列、可伸縮的分佈式存儲系統,利用HBase技術可在廉價PC Server上搭建起大規模結構化存儲集羣。

HBase是Google Bigtable的開源實現,類似Google Bigtable利用GFS作爲其文件存儲系統,HBase利用Hadoop HDFS作爲其文件存儲系統;Google運行MapReduce來處理Bigtable中的海量數據,HBase同樣利用Hadoop MapReduce來處理HBase中的海量數據;Google Bigtable利用 Chubby作爲協同服務,HBase利用Zookeeper作爲對應來源:北京oracle培訓

 

 

上圖描述了Hadoop EcoSystem中的各層系統,其中HBase位於結構化存儲層,Hadoop HDFS爲HBase提供了高可靠性的底層存儲支持,Hadoop MapReduce爲HBase提供了高性能的計算能力,Zookeeper爲HBase提供了穩定服務和failover機制。

此外,Pig和Hive還爲HBase提供了高層語言支持,使得在HBase上進行數據統計處理變的非常簡單。 Sqoop則爲HBase提供了方便的RDBMS數據導入功能,使得傳統數據庫數據向HBase中遷移變的非常方便。

2.1 HBase訪問接口

1. Native Java API,最常規和高效的訪問方式,適合Hadoop MapReduce Job並行批處理HBase表數據

2. HBase Shell,HBase的命令行工具,最簡單的接口,適合HBase管理使用

3. Thrift Gateway,利用Thrift序列化技術,支持C++,PHP,Python等多種語言,適合其他異構系統在線訪問HBase表數據

4. REST Gateway,支持REST 風格的Http API訪問HBase, 解除了語言限制

5. Pig,可以使用Pig Latin流式編程語言來操作HBase中的數據,和Hive類似,本質最終也是編譯成MapReduce Job來處理HBase表數據,適合做數據統計

6. Hive,當前Hive的Release版本尚沒有加入對HBase的支持,但在下一個版本Hive 0.7.0中將會支持HBase,可以使用類似SQL語言來訪問HBase

2.2 HBase數據模型

2.2.1 Table & Column Family

 

 

l Row Key: 行鍵,Table的主鍵,Table中的記錄按照Row Key排序

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

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

2.2.2 Table & Region

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

 

 

-ROOT- && .META. Table

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

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

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

l Zookeeper中記錄了-ROOT-表的location

Client訪問用戶數據之前需要首先訪問zookeeper,然後訪問-ROOT-表,接着訪問.META.表,最後才能找到用戶數據的位置去訪問,中間需要多次網絡操作,不過client端會做cache緩存。

2.2.3 MapReduce on HBase

在HBase系統上運行批處理運算,最方便和實用的模型依然是MapReduce,如下圖:

 

 

HBase Table和Region的關係,比較類似HDFS File和Block的關係,HBase提供了配套的TableInputFormat和TableOutputFormat API,可以方便的將HBase Table作爲Hadoop MapReduce的Source和Sink,對於MapReduce Job應用開發人員來說,基本不需要關注HBase系統自身的細節。

2.3 HBase系統架構

 

 

2.3.1 Client

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

2.3.2 Zookeeper

Zookeeper Quorum中除了存儲了-ROOT-表的地址和HMaster的地址,HRegionServer也會把自己以Ephemeral方式註冊到 Zookeeper中,使得HMaster可以隨時感知到各個HRegionServer的健康狀態。此外,Zookeeper也避免了HMaster的 單點問題,見下文描述

2.3.3 HMaster

HMaster沒有單點問題,HBase中可以啓動多個HMaster,通過Zookeeper的Master Election機制保證總有一個Master運行,HMaster在功能上主要負責Table和Region的管理工作:

1. 管理用戶對Table的增、刪、改、查操作

2. 管理HRegionServer的負載均衡,調整Region分佈

3. 在Region Split後,負責新Region的分配

4. 在HRegionServer停機後,負責失效HRegionServer 上的Regions遷移

2.3.4 HRegionServer

HRegionServer主要負責響應用戶I/O請求,向HDFS文件系統中讀寫數據,是HBase中最核心的模塊。

 

 

HRegionServer內部管理了一系列HRegion對象,每個HRegion對應了Table中的一個 Region,HRegion中由多個HStore組成。每個HStore對應了Table中的一個Column Family的存儲,可以看出每個Column Family其實就是一個集中的存儲單元,因此最好將具備共同IO特性的column放在一個Column Family中,這樣最高效。

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上。下圖描述了Compaction和Split的過程:

 

 

在理解了上述HStore的基本原理後,還必須瞭解一下HLog的功能,因爲上述的HStore在系統正常工作的前提下是沒有問 題的,但是在分佈式系統環境中,無法避免系統出錯或者宕機,因此一旦HRegionServer意外退出,MemStore中的內存數據將會丟失,這就需要引入HLog了。每個HRegionServer中都有一個HLog對象,HLog是一個實現Write Ahead Log的類,在每次用戶操作寫入MemStore的同時,也會寫一份數據到HLog文件中(HLog文件格式見後續),HLog文件定期會滾動出新的,並 刪除舊的文件(已持久化到StoreFile中的數據)。當HRegionServer意外終止後,HMaster會通過Zookeeper感知 到,HMaster首先會處理遺留的 HLog文件,將其中不同Region的Log數據進行拆分,分別放到相應region的目錄下,然後再將失效的region重新分配,領取 到這些region的HRegionServer在Load Region的過程中,會發現有歷史HLog需要處理,因此會Replay HLog中的數據到MemStore中,然後flush到StoreFiles,完成數據恢復。

2.4 HBase存儲格式

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

1.HFile, HBase中KeyValue數據的存儲格式,HFile是Hadoop的二進制格式文件,實際上StoreFile就是對HFile做了輕量級包裝,即StoreFile底層就是HFile

2.HLog File,HBase中WAL(Write Ahead Log) 的存儲格式,物理上是Hadoop的Sequence File

2.4.1 HFile

下圖是HFile的存儲格式:

 

 

首先HFile文件是不定長的,長度固定的只有其中的兩塊:Trailer和FileInfo。正如圖中所示的,Trailer 中有指針指向其他數據塊的起始點。File Info中記錄了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等。Data Index和Meta Index塊記錄了每個Data塊和Meta塊的起始點。

Data Block是HBase I/O的基本單元,爲了提高效率,HRegionServer中有基於LRU的Block Cache機制。每個Data塊的大小可以在創建一個Table的時候通過參數指定,大號的Block有利於順序Scan,小號Block利於隨機查詢。 每個Data塊除了開頭的Magic以外就是一個個KeyValue對拼接而成, Magic內容就是一些隨機數字,目的是防止數據損壞。後面會詳細介紹每個KeyValue對的內部構造。

HFile裏面的每個KeyValue對就是一個簡單的byte數組。但是這個byte數組裏麪包含了很多項,並且有固定的結構。我們來看看裏面的具體結構:

 

 

開始是兩個固定長度的數值,分別表示Key的長度和Value的長度。緊接着是Key,開始是固定長度的數值,表示RowKey 的長度,緊接着是RowKey,然後是固定長度的數值,表示Family的長度,然後是Family,接着是Qualifier,然後是兩個固定長度的數 值,表示Time Stamp和Key Type(Put/Delete)。Value部分沒有這麼複雜的結構,就是純粹的二進制數據了。

2.4.2 HLogFile

 

 

上圖中示意了HLog文件的結構,其實HLog文件就是一個普通的Hadoop Sequence File,Sequence File 的Key是HLogKey對象,HLogKey中記錄了寫入數據的歸屬信息,除了table和region名字外,同時還包括 sequence number和timestamp,timestamp是“寫入時間”,sequence number的起始值爲0,或者是最近一次存入文件系統中sequence number。

HLog Sequece File的Value是HBase的KeyValue對象,即對應HFile中的KeyValue,可參見上文描述。

3、安裝部署HBase

3.1 安裝過程

3.1.1 下載HBase安裝包

從Apache網站上(hbase.apache.org)下載HBase穩定發佈包:

http://mirrors.cnnic.cn/apache/hbase/hbase-0.96.2/

 

 

也可以在/home/shiyanlou/install-pack目錄中找到該安裝包,解壓該安裝包並把該安裝包複製到/app目錄中

cd /home/shiyanlou/install-pack

tar -zxf hbase-0.96.2-hadoop1-bin.tar.gz

mv hbase-0.96.2-hadoop1 /app/hbase-0.96.2

 

 

3.1.2 設置環境變量

1. 使用sudo vi /etc/profile命令修改系統環境變量

export HBASE_HOME=/app/hbase-0.96.2

export PATH=$PATH:$HBASE_HOME/bin

 

 

2. 使環境變量生效並驗證環境變量生效

source /etc/profile

hbase version

 

 

3.1.3 編輯hbase-env.sh

1. 打開hbase-env.sh文件

cd /app/hbase-0.96.2/conf

sudo vi hbase-env.sh

2. 修改該文件配置

#Java環境

export JAVA_HOME=/app/lib/jdk1.7.0_55

#通過hadoop的配置文件找到hadoop集羣

export HBASE_CLASSPATH=/app/hadoop-1.1.2/conf

#使用HBASE自帶的zookeeper管理集羣

export HBASE_MANAGES_ZK=true

 

 

 

 

3.1.4 編輯hbase-site.xml

1. 打開hbase-site.xml配置文件

cd /app/hbase-0.96.2/conf

sudo vi hbase-site.xml

2. 配置hbase-site.xml文件

hbase.rootdir

hdfs://hadoop:9000/hbase

hbase.cluster.distributed

true

hbase.zookeeper.quorum

b393a04554e1

 

 

3.2 啓動並驗證

3.2.1 啓動HBase

通過如下命令啓動Hbase

cd /app/hbase-0.96.2/bin

./start-hbase.sh

 

 

3.2.2 驗證啓動

1. 在hadoop節點使用jps查看節點狀態

 

 

2. 進入hbase的shell命令行,創建表member並進行查看

hbase shell

hbase>create 'member', 'm_id', 'address', 'info'

 

發佈了22 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章