
HBase 特點
海量存儲
Hbase 適合存儲 PB 級別的海量數據,在 PB 級別的數據以及采用廉價 PC 存儲的情況下,
能在幾十到百毫秒內返回數據。這與 Hbase 的極易擴展性息息相關。正式因為 Hbase 良好的
擴展性,才為海量數據的存儲提供了便利。
2)列式存儲
這里的列式存儲其實說的是列族存儲,Hbase 是根據列族來存儲數據的。列族下面可以
有非常多的列,列族在創建表的時候就必須指定。
3)極易擴展
Hbase 的擴展性主要體現在兩個方面,一個是基于上層處理能力(RegionServer)的擴
展,一個是基于存儲的擴展(HDFS)。
通過橫向添加 RegionSever 的機器,進行水平擴展,提升 Hbase 上層的處理能力,提升 Hbsae
服務更多 Region 的能力。
備注:RegionServer 的作用是管理 region、承接業務的訪問,這個后面會詳細的介紹通
過橫向添加 Datanode 的機器,進行存儲層擴容,提升 Hbase 的數據存儲能力和提升后端存
儲的讀寫能力。
4)高并發
由于目前大部分使用 Hbase 的架構,都是采用的廉價 PC,因此單個 IO 的延遲其實并不
小,一般在幾十到上百 ms 之間。這里說的高并發,主要是在并發的情況下,Hbase 的單個
IO 延遲下降并不多。能獲得高并發、低延遲的服務。
5)稀疏
稀疏主要是針對 Hbase 列的靈活性,在列族中,你可以指定任意多的列,在列數據為空
的情況下,是不會占用存儲空間的。
HBase 架構

從圖中可以看出 Hbase 是由 Client、Zookeeper、Master、HRegionServer、HDFS 等
幾個組件組成,下面來介紹一下幾個組件的相關功能:
1)Client
Client 包含了訪問 Hbase 的接口,另外 Client 還維護了對應的 cache 來加速 Hbase 的訪
問,比如 cache 的.META.元數據的信息。
2)Zookeeper
HBase 通過 Zookeeper 來做 master 的高可用、RegionServer 的監控、元數據的入口以及
集群配置的維護等工作。具體工作如下:
通過 Zoopkeeper 來保證集群中只有 1 個 master 在運行,如果 master 異常,會通過競爭
機制產生新的 master 提供服務
通過 Zoopkeeper 來監控 RegionServer 的狀態,當 RegionSevrer 有異常的時候,通過回
調的形式通知 Master RegionServer 上下線的信息
通過 Zoopkeeper 存儲元數據的統一入口地址
3)Hmaster
master 節點的主要職責如下:
為 RegionServer 分配 Region
維護整個集群的負載均衡
維護集群的元數據信息
發現失效的 Region,并將失效的 Region 分配到正常的 RegionServer 上
當 RegionSever 失效的時候,協調對應 Hlog 的拆分
4)HregionServer
HregionServer 直接對接用戶的讀寫請求,是真正的“干活”的節點。它的功能概括如下:
管理 master 為其分配的 Region
處理來自客戶端的讀寫請求
負責和底層 HDFS 的交互,存儲數據到 HDFS
負責 Region 變大以后的拆分
負責 Storefile 的合并工作
5)HDFS
HDFS 為 Hbase 提供最終的底層數據存儲服務,同時為 HBase 提供高可用(Hlog 存儲在
HDFS)的支持,具體功能概括如下:
提供元數據和表數據的底層分布式存儲服務
數據多副本,保證的高可靠和高可用性
1.3 HBase 中的角色
1.3.1 HMaster
功能
1.監控 RegionServer
2.處理 RegionServer 故障轉移
3.處理元數據的變更
4.處理 region 的分配或轉移
5.在空閑時間進行數據的負載均衡
6.通過 Zookeeper 發布自己的位置給客戶端
1.3.2 RegionServer
功能
1.負責存儲 HBase 的實際數據
2.處理分配給它的 Region
3.刷新緩存到 HDFS
4.維護 Hlog
5.執行壓縮
6.負責處理 Region 分片
1.2.3 其他組件
1.Write-Ahead logs
HBase 的修改記錄,當對 HBase 讀寫數據的時候,數據不是直接寫進磁盤,它會在內
存中保留一段時間(時間以及數據量閾值可以設定)。但把數據保存在內存中可能有更高的
概率引起數據丟失,為了解決這個問題,數據會先寫在一個叫做 Write-Ahead logfile 的文件
中,然后再寫入內存中。所以在系統出現故障的時候,數據可以通過這個日志文件重建。
2.Region
Hbase 表的分片,HBase 表會根據 RowKey 值被切分成不同的 region 存儲在 RegionServer
中,在一個 RegionServer 中可以有多個不同的 region。
3.Store
HFile 存儲在 Store 中,一個 Store 對應 HBase 表中的一個列族。
4.MemStore
顧名思義,就是內存存儲,位于內存中,用來保存當前的數據操作,所以當數據保存在
WAL 中之后,RegsionServer 會在內存中存儲鍵值對。
5.HFile
這是在磁盤上保存原始數據的實際的物理文件,是實際的存儲文件。StoreFile 是以 Hfile
的形式存儲在 HDFS 的。
第 2 章 HBase 安裝
2.1 Zookeeper 正常部署
首先保證 Zookeeper 集群的正常部署,并啟動之:
[atguigu@hadoop102 zookeeper-3.4.10]$ bin/zkServer.sh start
[atguigu@hadoop103 zookeeper-3.4.10]$ bin/zkServer.sh start
[atguigu@hadoop104 zookeeper-3.4.10]$ bin/zkServer.sh start
2.2 Hadoop 正常部署
Hadoop 集群的正常部署并啟動:
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
[atguigu@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh
2.3 HBase 的解壓
解壓 HBase 到指定目錄:
[atguigu@hadoop102 software]$ tar -zxvf hbase-1.3.1-bin.tar.gz -C
/opt/module
2.4 HBase 的配置文件
修改 HBase 對應的配置文件。
1)hbase-env.sh 修改內容:
export JAVA_HOME=/opt/module/jdk1.8.0_144
export HBASE_MANAGES_ZK=false
2)hbase-site.xml 修改內容:
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop102:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 0.98 后的新變動,之前版本沒有.port,默認端口為 60000 -->
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</
value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/opt/module/zookeeper-3.4.10/zkData</value>
</property>
</configuration>
3)regionservers:
hadoop102
hadoop103
hadoop104
4)軟連接 hadoop 配置文件到 hbase:
[atguigu@hadoop102 module]$ ln -s
/opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml
/opt/module/hbase/conf/core-site.xml
[atguigu@hadoop102 module]$ ln -s
/opt/module/hadoop-2.7.2/etc/hadoop/hdfs-site.xml
/opt/module/hbase/conf/hdfs-site.xml
2.5 HBase 遠程發送到其他集群
[atguigu@hadoop102 module]$ xsync hbase/
2.6 HBase 服務的啟動
1.啟動方式 1
[atguigu@hadoop102 hbase]$ bin/hbase-daemon.sh start master
[atguigu@hadoop102 hbase]$ bin/hbase-daemon.sh start regionserver
提示:如果集群之間的節點時間不同步,會導致 regionserver 無法啟動,拋出
ClockOutOfSyncException 異常。
修復提示:
a、同步時間服務
屬性:hbase.master.maxclockskew 設置更大的值
<property>
<name>hbase.master.maxclockskew</name>
<value>180000</value>
<description>Time difference of regionserver from
master</description>
</property>
2.啟動方式 2
[atguigu@hadoop102 hbase]$ bin/start-hbase.sh
對應的停止服務:
[atguigu@hadoop102 hbase]$ bin/stop-hbase.sh
2.7 查看 HBase 頁面
啟動成功后,可以通過“host:port”的方式來訪問 HBase 管理頁面,例如:
http://hadoop102:16010
第 3 章 HBase Shell 操作
3.1 基本操作
1.進入 HBase 客戶端命令行
[atguigu@hadoop102 hbase]$ bin/hbase shell
2.查看幫助命令
hbase(main):001:0> help
3.查看當前數據庫中有哪些表
hbase(main):002:0> list
3.2 表的操作
1.創建表
hbase(main):002:0> create 'student','info'
2.插入數據到表
hbase(main):003:0> put 'student','1001','info:sex','male'
hbase(main):004:0> put 'student','1001','info:age','18'
hbase(main):005:0> put 'student','1002','info:name','Janna'
hbase(main):006:0> put 'student','1002','info:sex','female'
hbase(main):007:0> put 'student','1002','info:age','20'
3.掃描查看表數據
hbase(main):008:0> scan 'student'
hbase(main):009:0> scan 'student',{STARTROW => '1001', STOPROW =>
'1001'}
hbase(main):010:0> scan 'student',{STARTROW => '1001'}
4.查看表結構
hbase(main):011:0> describe ‘student’
5.更新指定字段的數據
hbase(main):012:0> put 'student','1001','info:name','Nick'
hbase(main):013:0> put 'student','1001','info:age','100'
6.查看“指定行”或“指定列族:列”的數據
hbase(main):014:0> get 'student','1001'
hbase(main):015:0> get 'student','1001','info:name'
7.統計表數據行數
hbase(main):021:0> count 'student'
8.刪除數據
刪除某 rowkey 的全部數據:
hbase(main):016:0> deleteall 'student','1001'
刪除某 rowkey 的某一列數據:
hbase(main):017:0> delete 'student','1002','info:sex'
9.清空表數據
hbase(main):018:0> truncate 'student'
提示:清空表的操作順序為先 disable,然后再 truncate。
10.刪除表
首先需要先讓該表為 disable 狀態:
hbase(main):019:0> disable 'student'
然后才能 drop 這個表:
hbase(main):020:0> drop 'student'
提示:如果直接 drop 表,會報錯:ERROR: Table student is enabled. Disable it first.
11.變更表信息
將 info 列族中的數據存放 3 個版本:
hbase(main):022:0> alter 'student',{NAME=>'info',VERSIONS=>3}
hbase(main):022:0> get
'student','1001',{COLUMN=>'info:name',VERSIONS=>3}
第 4 章 HBase 數據結構
4.1 RowKey
與 nosql 數據庫們一樣,RowKey 是用來檢索記錄的主鍵。訪問 HBASE table 中的行,只
有三種方式:
1.通過單個 RowKey 訪問
2.通過 RowKey 的 range(正則)
3.全表掃描
RowKey 行鍵 (RowKey)可以是任意字符串(最大長度是 64KB,實際應用中長度一般為
10-100bytes),在 HBASE 內部,RowKey 保存為字節數組。存儲時,數據按照 RowKey 的字
典序(byte order)排序存儲。設計 RowKey 時,要充分排序存儲這個特性,將經常一起讀取的
行存儲放到一起。(位置相關性)
4.2 Column Family
列族:HBASE 表中的每個列,都歸屬于某個列族。列族是表的 schema 的一部 分(而列
不是),必須在使用表之前定義。列名都以列族作為前綴。例如 courses:history,courses:math
都屬于 courses 這個列族。
4.3 Cell
由{rowkey, column Family:columu, version} 唯一確定的單元。cell 中的數據是沒有類型
的,全部是字節碼形式存貯。
關鍵字:無類型、字節碼
4.4 Time Stamp
HBASE 中通過 rowkey 和 columns 確定的為一個存貯單元稱為 cell。每個 cell 都保存 著
同一份數據的多個版本。版本通過時間戳來索引。時間戳的類型是 64 位整型。時間戳可以
由 HBASE(在數據寫入時自動 )賦值,此時時間戳是精確到毫秒 的當前系統時間。時間戳
也可以由客戶顯式賦值。如果應用程序要避免數據版 本沖突,就必須自己生成具有唯一性
的時間戳。每個 cell 中,不同版本的數據按照時間倒序排序,即最新的數據排在最前面。
為了避免數據存在過多版本造成的的管理 (包括存貯和索引)負擔,HBASE 提供 了兩
種數據版本回收方式。一是保存數據的最后 n 個版本,二是保存最近一段 時間內的版本(比
如最近七天)。用戶可以針對每個列族進行設置。
4.5 命名空間
命名空間的結構:

1) Table:表,所有的表都是命名空間的成員,即表必屬于某個命名空間,如果沒有指定,
則在 default 默認的命名空間中。
2) RegionServer group:一個命名空間包含了默認的 RegionServer Group。
3) Permission:權限,命名空間能夠讓我們來定義訪問控制列表 ACL(Access Control List)。
例如,創建表,讀取表,刪除,更新等等操作。
4) Quota:限額,可以強制一個命名空間可包含的 region 的數量。
HBase 原理
5.1 讀流程
HBase 讀數據流程如圖 3 所示

1)Client 先訪問 zookeeper,從 meta 表讀取 region 的位置,然后讀取 meta 表中的數據。meta
中又存儲了用戶表的 region 信息;
2)根據 namespace、表名和 rowkey 在 meta 表中找到對應的 region 信息;
3)找到這個 region 對應的 regionserver;
4)查找對應的 region;
5)先從 MemStore 找數據,如果沒有,再到 BlockCache 里面讀;
6)BlockCache 還沒有,再到 StoreFile 上讀(為了讀取的效率);
7)如果是從 StoreFile 里面讀取的數據,不是直接返回給客戶端,而是先寫入 BlockCache,
再返回給客戶端。
5.2 寫流程
Hbase 寫流程如圖 2 所示

1)Client 向 HregionServer 發送寫請求;
2)HregionServer 將數據寫到 HLog(write ahead log)。為了數據的持久化和恢復;
3)HregionServer 將數據寫到內存(MemStore);
4)反饋 Client 寫成功。
5.3 數據 Flush 過程
1)當 MemStore 數據達到閾值(默認是 128M,老版本是 64M),將數據刷到硬盤,將內存
中的數據刪除,同時刪除 HLog 中的歷史數據;
2)并將數據存儲到 HDFS 中;
3)在 HLog 中做標記點。
5.4 數據合并過程
1)當數據塊達到 4 塊,Hmaster 觸發合并操作,Region 將數據塊加載到本地,進行合并;
2)當合并的數據超過 256M,進行拆分,將拆分后的 Region 分配給不同的 HregionServer
管理;
3)當 HregionServer 宕機后,將 HregionServer 上的 hlog 拆分,然后分配給不同的 HregionServer
加載,修改.META.;
4)注意:HLog 會同步到 HDFS。