1. 程式人生 > >大資料學習——HBase 入門

大資料學習——HBase 入門

HBase

學習環境

shiyanlou 《HBase介紹、安裝與應用案例》
- CentOS6.6 64位
- JDK 1.7.0_55 64位
- Hadoop 1.1.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作為對應。

這裡寫圖片描述

HBase位於結構化儲存層,HDFS為HBase提供了高可靠性的底層儲存支援,MapReduce為HBase提供了高效能的計算能力,Zookeeper為HBase提供了穩定服務和failover機制。

此外,Pig和Hive為Hbase提供了高層語言支援,使得在HBase上進行資料統計處理變得簡單。
Sqoop則為HBase提供了方便的RDBMS資料匯入功能。

HBase特點

  • 強一致性讀寫:HBase 不是“eventually consistent(最終一致性)”資料儲存。這讓它很適合高速計數聚合類任務;
  • 自動分片(Automatic sharding): HBase 表通過 region 分佈在叢集中。資料增長時,region 會自動分割並重新分佈;
  • RegionServer 自動故障轉移;
  • Hadoop/HDFS 整合:HBase 支援開箱即用地支援 HDFS 作為它的分散式檔案系統;
  • MapReduce: HBase 通過 MapReduce 支援大併發處理;
  • Java 客戶端 API:HBase 支援易於使用的 Java API 進行程式設計訪問;
  • Thrift/REST API:HBase 也支援 Thrift 和 REST 作為非 Java 前端的訪問;
  • Block Cache 和 Bloom Filter:對於大容量查詢優化, HBase 支援 Block Cache 和 Bloom Filter;
  • 運維管理:HBase 支援 JMX 提供內建網頁用於運維。

HBase應用場景

  • 足夠多資料,上億或上千億行資料
  • 不依賴RDBMS的特性,如列型別、第二索引、事務、高階查詢等
  • 有足夠的硬體,少於5節點Hadoop時,基本體現不出優勢

優缺點

優點

  • 列的可以動態增加,並且列為空就不儲存資料,節省儲存空間
  • Hbase 自動切分資料,使得資料儲存自動具有水平擴充套件
  • Hbase 可以提供高併發讀寫操作的支援
  • 與 Hadoop MapReduce 相結合有利於資料分析
  • 容錯性
  • 版權免費
  • 非常靈活的模式設計(或者說沒有固定模式的限制)
  • 可以跟 Hive 整合,使用類 SQL 查詢
  • 自動故障轉移
  • 客戶端介面易於使用
  • 行級別原子性,即,PUT 操作一定是完全成功或者完全失敗

缺點

  • 不能支援條件查詢,只支援按照 row key 來查詢
  • 容易產生單點故障(在只使用一個 HMaster 的時候)
  • 不支援事務
  • JOIN 不是資料庫層支援的,而需要用 MapReduce
  • 只能在逐漸上索引和排序
  • 沒有內建的身份和許可權認證

HBase 訪問介面

  • Native Java API
  • HBase Shell
  • Thrift Gateway
  • REST Gateway:支援REST網格的HTTP API訪問HBase
  • Pig:Pig Latin流式程式語言來操作HBase中的資料。
  • Hive:0.7.0版本的Hive加入HBase

HBase 資料模型

這裡寫圖片描述

  • 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進行管理。
這裡寫圖片描述

HBase中有兩張特殊的Table, -ROOT- 和 .META.
- .META. :記錄了使用者表的Region資訊,.META.可以有多個region
- -ROOT-:記錄了.META.表的Region資訊,-ROOT-只有一個region
- Zookeeper中記錄了-ROOT-表的location
Client訪問使用者資料之前需要先訪問zookeeper,然後訪問-ROOT-表,接著訪問.META.表,最後才能找到使用者資料的位置去訪問,中間需要多次網路操作,不過client端會做cache快取。

MapReduce on HBase

這裡寫圖片描述

HBase 系統架構

這裡寫圖片描述

Client

HBase Client使用HBase的RPC機制與HMaster和HRegionServer進行通訊,對於管理類操作,Client與HMaster進行RPC;對於資料讀寫類操作,Client與HRegionServer進行RPC。

Zookeeper

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

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 儲存格式

HBase中的所有資料檔案都儲存在Hadoop HDFS檔案系統上,主要包括上述提出的兩種檔案型別:

HFile, HBase中KeyValue資料的儲存格式,HFile是Hadoop的二進位制格式檔案,實際上StoreFile就是對HFile做了輕量級包裝,即StoreFile底層就是HFile
HLog File,HBase中WAL(Write Ahead Log) 的儲存格式,物理上是Hadoop的Sequence File

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部分沒有這麼複雜的結構,就是純粹的二進位制資料了。

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,可參見上文描述。

Hadoop與HBase版本對應關係

版本

HBase-0.94.x HBase-0.98.x HBase-1.0.x HBase-1.1.x HBase-1.2.x Hadoop-1.0.x
X X X X X
Hadoop-1.1.x S NT X X X
Hadoop-0.23.x S X X X X
Hadoop-2.0.x-alpha NT X X X X
Hadoop-2.1.0-beta NT X X X X
Hadoop-2.2.0 NT S NT NT X
Hadoop-2.3.x NT S NT NT X
Hadoop-2.4.x NT S S S S
Hadoop-2.5.x NT S S S S
Hadoop-2.6.0 X X X X X
Hadoop-2.6.1+ NT NT NT NT S
Hadoop-2.7.0 X X X X X
Hadoop-2.7.1+ NT NT NT NT S
  • S = supported and tested,支援
  • X = not supported,不支援
  • NT = not tested enough.可以執行但測試不充分

Hadoop和JDK版本對應關係

Hbase版本 JDK 6 JDK 7 JDK 8
1.2 Not Supported yes yes
1.1 Not Supported yes Not Supported
1 Not Supported yes Not Supported
0.98 yes yes Not Supported
0.94 yes yes N/A

資料模型操作

GetPutScanDelete

安裝部署HBase

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
sudo vi /etc/profile
export HBASE_HOME=/app/hbase-0.96.2
export PATH=$PATH:$HBASE_HOME/bin
source /etc/profile
hbase version
cd /app/hbase-0.96.2/conf
sudo vi hbase-env.sh
export JAVA_HOME=/app/lib/jdk1.7.0_55
export HBASE_CLASSPATH=/app/hadoop-1.1.2/conf
export HBASE_MANAGES_ZK=true

cd /app/hbase-0.96.2/conf
sudo vi hbase-site.xml
<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://hadoop:9000/hbase</value>
  </property>
  <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
  </property>
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>bb5264235bb1</value>
  </property>
</configuration>

啟動並驗證

cd /app/hadoop-1.1.2/bin
./start-all.sh
cd /app/hbase-0.96.2/bin
./start-hbase.sh
hbase shell

建立表

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

示例

學生成績表:

name grad course:math course:art
Tom 1 87 97
Jerry 2 100 80

這裡grad對於表來說是一列,course對於表來說是一個列族,這個列族由兩個列組成:math和art。

hbase> create 'scores','grade','course'
hbase> describe 'scores'

新建Tom行

hbase> put 'scores','Tome','grade:','1'
hbase> put 'scores','Tome','course:math','87'
hbase> put 'scores','Tome','course:art','97'

新建 Jerry行

hbase> put 'scores','Jerry','grade:','2'
hbase> put 'scores','Jerry','course:math','100'
hbase> put 'scores','Jerry','course:art','80'

查看錶

hbase> get 'scores','Tom'

檢視scores表所有資料

hbase> scan 'scores'