摘要: 今天我們介紹可在廉價PC Server上搭建起大規模結構化存儲集群的分布式存儲系統——HBase。
博主福利 給大家贈送一套hadoop視頻課程
授課老師是百度 hadoop 核心架構師
內容包括hadoop入門、hadoop生態架構以及大型hadoop商業實戰案例。
講的很細致, MapReduce 就講了 15 個小時。
學完后可以勝任 hadoop 的開發工作,很多人學的這個課程找到的工作。
(包括指導書、練習代碼、和用到的軟件都打包了)
先到先得先學習。聯系老師微信ganshiyu1026,備注OSchina。即可免費領取
部分視頻截圖展示
前面的文章我們介紹了HDFS文件系統、Mapreduce計算框架、Zookeeper協作服務今天我們介紹可在廉價PC Server上搭建起大規模結構化存儲集群的分布式存儲系統——HBase。
HBase
HBase – Hadoop Database,是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統,利用HBase技術可在廉價PC Server上搭建起大規模結構化存儲集群。
本章內容:
1) Hbase簡介
2) Hbase數據模型
3) Hbase基礎原理
4) Hbase系統架構
5) Hbase基礎操作
1. Hbase簡介
HBase是Apache Hadoop中的一個子項目,Hbase依托於Hadoop的HDFS作為最基本存儲基礎單元,通過使用hadoop的DFS工具就可以看到這些這些數據存儲文件夾的結構,還可以通過Map/Reduce的框架(算法)對HBase進行操作。
上圖描述了Hadoop EcoSystem中的各層系統,其中HBase位於結構化存儲層,Hadoop HDFS為HBase提供了高可靠性的底層存儲支持,Hadoop MapReduce為HBase提供了高性能的計算能力,Zookeeper為HBase提供了穩定服務和failover機制。
Hbase適用場景:
1) 大數據量存儲,大數據量高並發操作
2) 需要對數據隨機讀寫操作
3) 讀寫訪問均是非常簡單的操作
Hbase與HDFS對比:
l 兩者都具有良好的容錯性和擴展性,都可以擴展到成百上千個節點;
l HDFS適合批處理場景,但不支持數據隨機查找,不適合增量數據處理,不支持數據更新
2. Hbase數據模型
HBase以表的形式存儲數據。表由行和列族組成。列划分為若干個列族(row family),其邏輯視圖如下:
行健 |
時間戳 |
列族contents |
列族anchor |
列族mime |
“com.cnn.www” |
T9 |
Anchor:cnnsi.com=“CNN” |
||
T8 |
Anchor:my.look.ca=“CNN.com” |
|||
T6 |
Contents:html=“<html>……” |
Mime.type=“text/html” |
||
T5 |
Contents:html=“<html>……” |
|||
T3 |
Contents:html=“<html>……” |
幾個關鍵概念:
1) 行鍵(RowKey)
l 行鍵是字節數組, 任何字符串都可以作為行鍵;
l 表中的行根據行鍵進行排序,數據按照Row key的字節序(byte order)排序存儲;
l 所有對表的訪問都要通過行鍵 (單個RowKey訪問,或RowKey范圍訪問,或全表掃描)
2) 列族(ColumnFamily)
l CF必須在表定義時給出
l 每個CF可以有一個或多個列成員(ColumnQualifier),列成員不需要在表定義時給出,新的列族成員可以隨后按需、動態加入
l 數據按CF分開存儲,HBase所謂的列式存儲就是根據CF分開存儲(每個CF對應一個Store),這種設計非常適合於數據分析的情形
3) 時間戳(TimeStamp)
l 每個Cell可能又多個版本,它們之間用時間戳區分
4) 單元格(Cell)
l Cell 由行鍵,列族:限定符,時間戳唯一決定
l Cell中的數據是沒有類型的,全部以字節碼形式存儲
5) 區域(Region)
l HBase自動把表水平(按Row)划分成多個區域(region),每個region會保存一個表里面某段連續的數據;
l 每個表一開始只有一個region,隨着數據不斷插入表,region不斷增大,當增大到一個閥值的時候,region就會等分會兩個新的region;
l 當table中的行不斷增多,就會有越來越多的region。這樣一張完整的表被保存在多個Region 上。
l Region雖然是分布式存儲的最小單元,但並不是存儲的最小單元。Region由一個或者多個Store組成,每個store保存一個columns family;每個Strore又由一個memStore和0至多個StoreFile組成,StoreFile包含HFile;memStore存儲在內存中,StoreFile存儲在HDFS上。
3. Hbase架構及基本組件
從上圖看到HBase的基本組件:
1) Client:
l 包含訪問HBase的接口,並維護cache來加快對HBase的訪問,比如region的位置信息。
2) Master
l 為Region server分配region
l 負責Region server的負載均衡
l 發現失效的Region server並重新分配其上的region
l 管理用戶對table的增刪改查操作
3) Region Server
l Regionserver維護region,處理對這些region的IO請求
l Regionserver負責切分在運行過程中變得過大的region
4) Zookeeper作用
l 通過選舉,保證任何時候,集群中只有一個Master,Master與RegionServers 啟動時會向ZooKeeper注冊
l 存儲所有Region的尋址入口
l 實時監控Region server的上線和下線信息,並實時通知給Master
l 存儲HBase的schema和table元數據
l 默認情況下,HBase 管理ZooKeeper 實例,比如, 啟動或者停止ZooKeeper
Zookeeper的引入使得Master不再是單點故障
4. Hbase容錯與恢復
每個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容錯性:
1) Master容錯:Zookeeper重新選擇一個新的Master
l 無Master過程中,數據讀取仍照常進行;
l 無master過程中,region切分、負載均衡等無法進行;
2) RegionServer容錯:定時向Zookeeper匯報心跳,如果一旦時間內未出現心跳,Master將該RegionServer上的Region重新分配到其他RegionServer上,失效服務器上“預寫”日志由主服務器進行分割並派送給新的RegionServer
3) Zookeeper容錯:Zookeeper是一個可靠地服務,一般配置3或5個Zookeeper實例
Region定位流程:
尋找RegionServer過程:ZooKeeper--> -ROOT-(單Region)--> .META.--> 用戶表
1) -ROOT-
l 表包含.META.表所在的region列表,該表只會有一個Region;
l Zookeeper中記錄了-ROOT-表的location。
2) .META.
l 表包含所有的用戶空間region列表,以及RegionServer的服務器地址。
5. Hbase基礎操作
1) 進入hbase shell console
$HBASE_HOME/bin/hbase shell |
表的管理:
2) 查看有哪些表
list |
3) 創建表
# 語法:create <table>, {NAME => <family>, VERSIONS => <VERSIONS>}
# 例如:創建表t1,有兩個family name:f1,f2,且版本數均為2 > create 't1',{NAME => 'f1', VERSIONS => 2},{NAME => 'f2', VERSIONS => 2} |
4) 刪除表
# 分兩步:首先disable,然后drop
# 例如:刪除表t1 > disable 't1' > drop 't1' |
5) 查看表的結構
# 語法:describe <table>
# 例如:查看表t1的結構 > describe 't1' |
6) 修改表結構
# 修改表結構必須先disable
# 語法:alter 't1', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}
# 例如:修改表test1的cf的TTL為180天 > disable 'test1' > alter 'test1',{NAME=>'body',TTL=>'15552000'},{NAME=>'meta', TTL=>'15552000'} > enable 'test1' |
權限管理:
1) 分配權限
# 語法 : grant <user> <permissions> <table> <column family> <column qualifier> 參數后面用逗號分隔 # 權限用五個字母表示: "RWXCA". # READ('R'), WRITE('W'), EXEC('X'), CREATE('C'), ADMIN('A')
# 例如,給用戶‘test'分配對表t1有讀寫的權限, > grant 'test','RW','t1' |
2) 查看權限
# 語法:user_permission <table>
# 例如,查看表t1的權限列表 > user_permission 't1' |
3) 收回權限
# 與分配權限類似,語法:revoke <user> <table> <column family> <column qualifier>
# 例如,收回test用戶在表t1上的權限 > revoke 'test','t1' |
表數據的增刪改查:
1) 添加數據
# 語法:put <table>,<rowkey>,<family:column>,<value>,<timestamp>
# 例如:給表t1的添加一行記錄:rowkey是rowkey001,family name:f1,column name:col1,value:value01,timestamp:系統默認 > put 't1','rowkey001','f1:col1','value01' |
2) 查詢數據——查詢某行記錄
# 語法:get <table>,<rowkey>,[<family:column>,....]
# 例如:查詢表t1,rowkey001中的f1下的col1的值 > get 't1','rowkey001', 'f1:col1' # 或者: > get 't1','rowkey001', {COLUMN=>'f1:col1'}
# 查詢表t1,rowke002中的f1下的所有列值 hbase(main)> get 't1','rowkey001' |
3) 查詢數據——掃描表
# 語法:scan <table>, {COLUMNS => [ <family:column>,.... ], LIMIT => num} # 另外,還可以添加STARTROW、TIMERANGE和FITLER等高級功能
# 例如:掃描表t1的前5條數據 > scan 't1',{LIMIT=>5} |
4) 查詢表中的數據行數
# 語法:count <table>, {INTERVAL => intervalNum, CACHE => cacheNum} # INTERVAL設置多少行顯示一次及對應的rowkey,默認1000;CACHE每次去取的緩存區大小,默認是10,調整該參數可提高查詢速度
# 例如,查詢表t1中的行數,每100條顯示一次,緩存區為500 > count 't1', {INTERVAL => 100, CACHE => 500} |
5) 刪除數據——刪除行中的某個列值
# 語法:delete <table>, <rowkey>, <family:column> , <timestamp>,必須指定列名
# 例如:刪除表t1,rowkey001中的f1:col1的數據 > delete 't1','rowkey001','f1:col1' |
6) 刪除數據——刪除行
# 語法:deleteall <table>, <rowkey>, <family:column> , <timestamp>,可以不指定列名,刪除整行數據
# 例如:刪除表t1,rowk001的數據 > deleteall 't1','rowkey001' |
7) 刪除數據——刪除表中的所有數據
# 語法: truncate <table> # 其具體過程是:disable table -> drop table -> create table
# 例如:刪除表t1的所有數據 > truncate 't1' |
Region管理:
1) 移動Region
# 語法:move 'encodeRegionName', 'ServerName' # encodeRegionName指的regioName后面的編碼,ServerName指的是master-status的Region Servers列表
# 示例 >move '4343995a58be8e5bbc739', 'db-41.xxx.xxx.org,60020,139' |
2) 開啟/關閉region
# 語法:balance_switch true|false hbase(main)> balance_switch |
3) 手動split
# 語法:split 'regionName', 'splitKey' |
4) 手動觸發major compaction
#語法: #Compact all regions in a table: > major_compact 't1' #Compact an entire region: > major_compact 'r1' #Compact a single column family within a region: > major_compact 'r1', 'c1' #Compact a single column family within a table: > major_compact 't1', 'c1' |
此時你已經學會了安裝hadoop集群,了解了HDFS文件系統,MapReduce計算框架和Zookeeper協作服務(Zookeeper數據模型、訪問控制、應用場景),今天學完了HBase,下一篇我們介紹hadoop的數據庫工具——Hive。