您好,登錄后才能下訂單哦!
Hbase 安裝,架構,使用
安裝 hbase :
下載安裝包:
hbase-1.0.0-bin.tar.gz
mdkir /data/hbase
mdkir /data/hbase/tmp
mkdir /data/hbase/
hadoop dfs -mkdir /user/hadoop/rongxin/hbase
2.解壓
[hadoop@master hbase]$ tar -zxvf hbase-1.0.0-bin.tar.gz
3. 進入 hbase 的 lib 目錄,替換 hadoop jar 包的版本
修改配置文件
hbase-env.sh
hbase-site.xml
[hadoop@master hbase]$ vim hbase-1.0.0/conf/regionservers
slave1
slave2
vim /etc/profile
export HBASE_HOME=/data/hbase/hbase-1.0.0
export PATH=$PATH:$HBASE_HOME/bin
source /etc/profile
啟動 hbase:
[hadoop@master hbase]$ start-hbase.sh
通過 jps 檢查是否已經啟動:
[hadoop@master hbase]$ jps
32211 HMaster
[hadoop@slave1 lib]$ jps
20584 HRegionServer
[hadoop@slave2 lib]$ jps
2698 HRegionServer
通過 web 檢查是否已經啟動了 hbase:
http://master:16030/master-status
H He base 的 常用命令行工具:
名稱 命令表達式
創建表 create '表名稱', '列名稱 1','列名稱 2','列名稱 N'
添加記錄 put '表名稱', '行名稱', '列名稱:', '值'
查看記錄 get '表名稱', '行名稱'
查看表中的記錄總數 count '表名稱'
刪除記錄 delete '表名' ,'行名稱' , '列名稱'
刪除一張表
先要屏蔽該表,才能對該表進行刪除,第一步 disable '表名稱' 第
二步 drop '表名稱'
查看所有記錄 scan "表名稱"
查看某個表某個列中所
有數據
scan "表名稱" , ['列名稱:']
更新記錄 就是重寫一遍進行覆蓋
下面是一些常見命令的說明,在 hbaseshell 中輸入 help 的幫助信息,在本文中,我們先介
紹前 3 個,后面 2 個,將在下一篇博文中介紹。
COMMAND GROUPS:
Group name: general
Commands: status, version
Group name: ddl
Commands: alter, create, describe, disable,drop, enable, exists, is_disabled, is_enabled, list
Group name: dml
Commands: count, delete, deleteall, get,get_counter, incr, put, scan, truncate
Group name: tools
Commands: assign, balance_switch, balancer,close_region, compact, flush, major_compact, move,
split, unassign, zk_dump
Group name: replication
Commands: add_peer, disable_peer,enable_peer, remove_peer, start_replication, stop_replication
一、一般操作
1.查詢服務器狀態
hbase(main):024:0>status
3 servers, 0 dead,1.0000 average load
2.查詢 hive 版本
hbase(main):025:0>version
0.90.4, r1150278,Sun Jul 24 15:53:29 PDT 2011
二、L DDL 操作
1.創建一個表
hbase(main):011:0>create 'member','member_id','address','info'
0 row(s) in 1.2210seconds
2.獲得表的描述
hbase(main):012:0>list
TABLE
member
1 row(s) in 0.0160seconds
hbase(main):006:0>describe 'member'
DESCRIPTION ENABLED
{NAME => 'member', FAMILIES => [{NAME=> 'address', BLOOMFILTER => 'NONE',
REPLICATION_SCOPE => '0', true
VERSIONS => '3', COMPRESSION => 'NONE',TTL => '2147483647', BLOCKSIZE =>
'65536', IN_MEMORY => 'fa
lse', BLOCKCACHE => 'true'}, {NAME =>'info', BLOOMFILTER => 'NONE',
REPLICATION_SCOPE => '0', VERSI
ONS => '3', COMPRESSION => 'NONE', TTL=> '2147483647', BLOCKSIZE => '65536',
IN_MEMORY => 'false',
BLOCKCACHE =>
'true'}]}
1 row(s) in 0.0230seconds
3.刪除一個列族,alter,disable,enable
我們之前建了 3 個列族,但是發現 member_id 這個列族是多余的,因為他就是主鍵,所以
我們要將其刪除。
hbase(main):003:0>alter 'member',{NAME=>'member_id',METHOD=>'delete'}
ERROR: Table memberis enabled. Disable it first before altering.
報錯,刪除列族的時候必須先將表給 disable 掉。
hbase(main):004:0>disable 'member'
0 row(s) in 2.0390seconds
hbase(main):005:0>alter'member',{NAME=>'member_id',METHOD=>'delete'}
0 row(s) in 0.0560seconds
hbase(main):006:0>describe 'member'
DESCRIPTION ENABLED
{NAME => 'member', FAMILIES => [{NAME=> 'address', BLOOMFILTER => 'NONE',
REPLICATION_SCOPE => '0',false
VERSIONS => '3', COMPRESSION => 'NONE',TTL => '2147483647', BLOCKSIZE =>
'65536', IN_MEMORY => 'fa
lse', BLOCKCACHE => 'true'}, {NAME =>'info', BLOOMFILTER => 'NONE',
REPLICATION_SCOPE => '0', VERSI
ONS => '3', COMPRESSION => 'NONE', TTL=> '2147483647', BLOCKSIZE => '65536',
IN_MEMORY => 'false',
BLOCKCACHE =>
'true'}]}
1 row(s) in 0.0230seconds
該列族已經刪除,我們繼續將表 enable
hbase(main):008:0> enable 'member'
0 row(s) in 2.0420seconds
4.列出所有的表
hbase(main):028:0>list
TABLE
member
temp_table
2 row(s) in 0.0150seconds
5.drop 一個表
hbase(main):029:0>disable 'temp_table'
0 row(s) in 2.0590seconds
hbase(main):030:0>drop 'temp_table'
0 row(s) in 1.1070seconds
6.查詢表是否存在
hbase(main):021:0>exists 'member'
Table member
doesexist
0 row(s) in 0.1610seconds
7.判斷表是否 enable
hbase(main):034:0>is_enabled 'member'
true
0 row(s) in 0.0110seconds
8.判斷表是否 disable
hbase(main):032:0>is_disabled 'member'
false
0 row(s) in 0.0110seconds
三、 DML 操作
1.插入幾條記錄
put'member','scutshuxue','info:age','24'
put'member','scutshuxue','info:birthday','1987-06-17'
put'member','scutshuxue','info:company','alibaba'
put'member','scutshuxue','address:contry','china'
put'member','scutshuxue','address:province','zhejiang'
put'member','scutshuxue','address:city','hangzhou'
put'member','xiaofeng','info:birthday','1987-4-17'
put'member','xiaofeng','info:favorite','movie'
put'member','xiaofeng','info:company','alibaba'
put'member','xiaofeng','address:contry','china'
put'member','xiaofeng','address:province','guangdong'
put'member','xiaofeng','address:city','jieyang'
put'member','xiaofeng','address:town','xianqiao'
2.獲取一條數據
獲取一個 id 的所有數據
hbase(main):001:0>get 'member','scutshuxue'
COLUMN CELL
address:city timestamp=1321586240244,
value=hangzhou
address:contry timestamp=1321586239126,
value=china
address:province timestamp=1321586239197,
value=zhejiang
info:age timestamp=1321586238965,
value=24
info:birthday timestamp=1321586239015, value=1987-06-
17
info:company timestamp=1321586239071,
value=alibaba
6 row(s) in 0.4720seconds
獲取一個 id,一個列族的所有數據
hbase(main):002:0>get 'member','scutshuxue','info'
COLUMN CELL
info:age timestamp=1321586238965,
value=24
info:birthday timestamp=1321586239015, value=1987-06-
17
info:company timestamp=1321586239071,
value=alibaba
3 row(s) in 0.0210seconds
獲取一個 id,一個列族中一個列的所有數據
hbase(main):002:0>get 'member','scutshuxue','info:age'
COLUMN CELL
info:age timestamp=1321586238965,
value=24
1 row(s) in 0.0320seconds
6.更新一條記錄
將 scutshuxue 的年齡改成 99
hbase(main):004:0>put 'member','scutshuxue','info:age' ,'99'
0 row(s) in 0.0210seconds
hbase(main):005:0>get 'member','scutshuxue','info:age'
COLUMN CELL
info:age timestamp=1321586571843,
value=99
1 row(s) in 0.0180seconds
3.通過 timestamp 來獲取兩個版本的數據
hbase(main):010:0>get
'member','scutshuxue',{COLUMN=>'info:age',TIMESTAMP=>1321586238965}
COLUMN CELL
info:age timestamp=1321586238965,
value=24
1 row(s) in 0.0140seconds
hbase(main):011:0>get
'member','scutshuxue',{COLUMN=>'info:age',TIMESTAMP=>1321586571843}
COLUMN CELL
info:age timestamp=1321586571843,
value=99
1 row(s) in 0.0180seconds
4.全表掃描:
hbase(main):013:0>scan 'member'
ROW COLUMN+CELL
scutshuxue column=address:city, timestamp=1321586240244,
value=hangzhou
scutshuxue column=address:contry, timestamp=1321586239126,
value=china
scutshuxue column=address:province, timestamp=1321586239197,
value=zhejiang
scutshuxue column=info:age,timestamp=1321586571843,
value=99
scutshuxue column=info:birthday, timestamp=1321586239015, value=1987-06-
17
scutshuxue column=info:company, timestamp=1321586239071,
value=alibaba
temp column=info:age, timestamp=1321589609775,
value=59
xiaofeng column=address:city, timestamp=1321586248400,
value=jieyang
xiaofeng column=address:contry, timestamp=1321586248316,
value=china
xiaofeng column=address:province, timestamp=1321586248355,
value=guangdong
xiaofeng column=address:town, timestamp=1321586249564,
value=xianqiao
xiaofeng column=info:birthday, timestamp=1321586248202, value=1987-4-
17
xiaofeng column=info:company, timestamp=1321586248277,
value=alibaba
xiaofeng column=info:favorite, timestamp=1321586248241,
value=movie
3 row(s) in 0.0570seconds
5.刪除 id 為 temp 的值的‘info:age’字段
hbase(main):016:0>delete 'member','temp','info:age'
0 row(s) in 0.0150seconds
hbase(main):018:0>get 'member','temp'
COLUMN CELL
0 row(s) in 0.0150seconds
6.刪除整行
hbase(main):001:0>deleteall 'member','xiaofeng'
0 row(s) in 0.3990seconds
7.查詢表中有多少行:
hbase(main):019:0>count 'member'
2 row(s) in 0.0160seconds
8.給‘xiaofeng’這個 id 增加'info:age'字段,并使用 counter 實現遞增
hbase(main):057:0*incr 'member','xiaofeng','info:age'
COUNTER VALUE = 1
hbase(main):058:0>get 'member','xiaofeng','info:age'
COLUMN CELL
info:age timestamp=1321590997648,
value=\x00\x00\x00\x00\x00\x00\x00\x01
1 row(s) in 0.0140seconds
hbase(main):059:0>incr 'member','xiaofeng','info:age'
COUNTER VALUE = 2
hbase(main):060:0>get 'member','xiaofeng','info:age'
COLUMN CELL
info:age timestamp=1321591025110,
value=\x00\x00\x00\x00\x00\x00\x00\x02
1 row(s) in 0.0160seconds
獲取當前 count 的值
hbase(main):069:0>get_counter 'member','xiaofeng','info:age'
COUNTER VALUE = 2
9.將整張表清空:
hbase(main):035:0>truncate 'member'
Truncating 'member'table (it may take a while):
- Disabling table...
- Dropping table...
- Creating table...
0 row(s) in 4.3430seconds
可以看出,hbase 是先將掉 disable 掉,然后 drop 掉后重建表來實現 truncate 的功能的。
e Hbase 的架構:
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
HBase 數據模型
Table & Column Family
Row
Key
Timestamp
Column Family
URI Parser
r1
t3 url=http://www.taobao.com title=天天特價
t2 host=taobao.com
t1
r2 t5 url=http://www.alibaba.com content=每天…
t4 host=alibaba.com
? 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 緩存。
MapReduce on HBase
在 HBase 系統上運行批處理運算,最方便和實用的模型依然是 MapReduce,如下圖:
HBase Table 和 Region 的關系,比較類似 HDFS File 和 Block 的關系,HBase 提供了配套的
TableInputFormat 和 TableOutputFormat API,可以方便的將 HBase Table 作為 Hadoop
MapReduce 的 Source 和 Sink,對于 MapReduce Job 應用開發人員來說,基本不需要關注
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 的單點問題,見下文描述
HMaster
HMaster 沒有單點問題,HBase 中可以啟動多個 HMaster,通過 Zookeeper 的 Master Election
機制保證總有一個 Master 運行,HMaster 在功能上主要負責 Table 和 Region 的管理工作:
1. 管理用戶對 Table 的增、刪、改、查操作
2. 管理 HRegionServer 的負載均衡,調整 Region 分布
3. 在 Region Split 后,負責新 Region 的分配
4. 在 HRegionServer 停機后,負責失效 HRegionServer 上的 Regions 遷移
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,完成數據恢復。
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
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 部分沒有這么復雜的結構,就是純粹的二進
制數據了。
HLogFile
上圖中示意了 HLog 文件的結構,其實 HLog 文件就是一個普通的 Hadoop Sequence File,
Sequence File 的 Key 是 HLogKey 對象,HLogKey 中記錄了寫入數據的歸屬信息,除了 table
和 region 名字外,同時還包括 sequence number 和 timestamp,timestamp 是“寫入時間”,
sequence number 的起始值為 0,或者是最近一次存入文件系統中 sequence number。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。