HBase – Hadoop Database,是一個高可靠性、高性能、面向列、可伸縮的分佈式存儲系統,利用HBase技術可在廉價PC Server上搭建起大規模結構化存儲集羣。html
HBase是Google Bigtable的開源實現,相似Google Bigtable利用GFS做爲其文件存儲系統,HBase利用Hadoop HDFS做爲其文件存儲系統;Google運行MapReduce來處理Bigtable中的海量數據,HBase一樣利用Hadoop MapReduce來處理HBase中的海量數據;Google Bigtable利用Chubby做爲協同服務,HBase利用Zookeeper做爲對應。
node
上圖描述了Hadoop EcoSystem中的各層系統,其中HBase位於結構化存儲層,Hadoop HDFS爲HBase提供了高可靠性的底層存儲支持,Hadoop MapReduce爲HBase提供了高性能的計算能力,Zookeeper爲HBase提供了穩定服務和failover機制。linux
此外,Pig和Hive還爲HBase提供了高層語言支持,使得在HBase上進行數據統計處理變的很是簡單。 Sqoop則爲HBase提供了方便的RDBMS數據導入功能,使得傳統數據庫數據向HBase中遷移變的很是方便。數據庫
一、Table & Column Family
編程
Ø Row Key: 行鍵,Table的主鍵,Table中的記錄按照Row Key排序數組
Ø 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進行管理:負載均衡
三、-ROOT- && .META. Table
HBase中有兩張特殊的Table,-ROOT-和.META.
Ø .META.:記錄了用戶表的Region信息,.META.能夠有多個regoin
Ø -ROOT-:記錄了.META.表的Region信息,-ROOT-只有一個region
Ø Zookeeper中記錄了-ROOT-表的location
Client訪問用戶數據以前須要首先訪問zookeeper,而後訪問-ROOT-表,接着訪問.META.表,最後才能找到用戶數據的位置去訪問,中間須要屢次網絡操做,不過client端會作cache緩存。
在HBase系統上運行批處理運算,最方便和實用的模型依然是MapReduce,以下圖:
HBase Table和Region的關係,比較相似HDFS File和Block的關係,HBase提供了配套的TableInputFormat和TableOutputFormat API,能夠方便的將HBase Table做爲Hadoop MapReduce的Source和Sink,對於MapReduce Job應用開發人員來講,基本不須要關注HBase系統自身的細節。
HBase Client使用HBase的RPC機制與HMaster和HRegionServer進行通訊,對於管理類操做,Client與HMaster進行RPC;對於數據讀寫類操做,Client與HRegionServer進行RPC
Zookeeper Quorum中除了存儲了-ROOT-表的地址和HMaster的地址,HRegionServer也會把本身以Ephemeral方式註冊到 Zookeeper中,使得HMaster能夠隨時感知到各個HRegionServer的健康狀態。此外,Zookeeper也避免了HMaster的 單點問題,見下文描述
HMaster沒有單點問題,HBase中能夠啓動多個HMaster,經過Zookeeper的Master Election機制保證總有一個Master運行,HMaster在功能上主要負責Table和Region的管理工做:
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,完成數據恢復。
HBase中的全部數據文件都存儲在Hadoop HDFS文件系統上,主要包括上述提出的兩種文件類型:
下圖是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部分沒有這麼複雜的結構,就是純粹的二進制數據了。
上圖中示意了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,可參見上文描述。
一、Hbase版本選擇
挑選一個Apache Download Mirror(Apache下載鏡像),下載一個Hbase的穩定發佈版本,解壓以下:
tar zxvf hbase-1.0.3-bin.tar.gz -C /home/hadoop/
設置Hbase環境變量
# hbase env export HBASE_HOME=/home/hadoop/hbase export PATH=$PATH:$HBASE_HOME/bin
#獲取Hbase選項列表及版本信息
hbase version
二、測試驅動
#啓動一個使用本地文件系統/tmp目錄做爲持久化存儲的Hbase臨時實例
start-hbase.sh starting master, logging to /home/hadoop/hbase/logs/hbase-root-master-linux-node1.out
#新建一個名爲test的表,使其只包含一個名爲data的列,表和列族屬性都爲默認值
hbase(main):001:0> create 'test','data' 0 row(s) in 0.4150 seconds
#經過鍵入help查看幫助命令,運行list查看新建的表是否存在
hbase(main):003:0> list TABLE test 1 row(s) in 0.0230 seconds
#在列族data中二個不一樣的行和列上插入數據,而後列出表內容
hbase(main):004:0> put 'test','row1','data:1','values1' 0 row(s) in 0.1280 seconds hbase(main):005:0> put 'test','row2','data:2','values2' 0 row(s) in 0.0090 seconds hbase(main):006:0> scan 'test' ROW COLUMN+CELL row1 column=data:1, timestamp=1473585137461, value=values1 row2 column=data:2, timestamp=1473585158072, value=values2 2 row(s) in 0.0200 seconds
#刪除剛建立的表test,須要先設爲禁用,而後刪除,不設置會報錯:
ERROR: Table test is enabled. Disable it first. hbase(main):009:0> disable 'test' 0 row(s) in 1.1800 seconds hbase(main):010:0> drop 'test' 0 row(s) in 0.1570 seconds
本文轉載地址:https://www.linuxprobe.com/hadoop-hbase-deploy-use.html