第1章 HBase簡介
1.1什麼是HBase
HBase是一個高可靠性、面向列的分布式存儲系統,利用HBASE技術可在廉價PC Server上搭建起大規模結構化存儲叢集。
HBase的目标是存儲并處理大型的資料,更具體來說是僅需使用普通的硬體配置,就能夠處理由成千上萬的行和列所組成的大型資料。
HBase是Google Bigtable的開源實作,但是也有很多不同之處。比如:Google Bigtable利用GFS作為其檔案存儲系統,HBase利用Hadoop HDFS作為其檔案存儲系統;Google運作MAPREDUCE來處理Bigtable中的海量資料,HBase同樣利用Hadoop MapReduce來處理HBase中的海量資料;Google Bigtable利用Chubby作為協同服務,HBase利用Zookeeper作為對應
1.2 Hbase特點
1)海量存儲
Hbase适合存儲PB級别的海量資料,在PB級别的資料以及采用廉價PC存儲的情況下,能在幾十到百毫秒内傳回資料。這與Hbase的極易擴充性相關。正是因為Hbase良好的擴充性,才為海量資料的存儲提供了便利。
2)列式存儲
這裡的列式存儲其實說的是列族存儲,Hbase是根據列族來存儲資料的。列族下面可以有非常多的列,列族在建立表的時候就必須指定。
3)極易擴充
Hbase的擴充性主要展現在兩個方面,一個是基于上層處理能力(RegionServer)的擴充,一個是基于存儲的擴充(HDFS)。
通過橫向添加RegionSever的機器,進行水準擴充,提升Hbase上層的處理能力,提升Hbsae服務更多Region的能力。
備注:RegionServer的作用是管理region、承接業務的通路,通過橫向添加Datanode的機器,進行存儲層擴容,提升Hbase的資料存儲能力和提升後端存儲的讀寫能力。
4)高并發
在并發的情況下,Hbase的單個IO延遲下降并不多。能獲得高并發、低延遲的服務。
5)稀疏
稀疏主要是針對Hbase列的靈活性,在列族中,你可以指定任意多的列,在列資料為空的情況下,是不會占用存儲空間的。
1.3 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上下線的資訊(就是使用zk完成的伺服器上下線機制)
通過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(每個regionserver都有一個Hlog)
5.執行壓縮
6.負責處理Region分片(自動分片)
1.2.3 其他元件
1.Write-Ahead logs(WAL,HLOG&edits日志)
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叢集的正常部署,并啟動之:
[[email protected] zookeeper-3.4.10]$ bin/zkServer.sh start
[[email protected] zookeeper-3.4.10]$ bin/zkServer.sh start
[[email protected] zookeeper-3.4.10]$ bin/zkServer.sh start
2.2 Hadoop正常部署
Hadoop叢集的正常部署并啟動:
[[email protected] hadoop-2.7.2]$ sbin/start-dfs.sh
[[email protected] hadoop-2.7.2]$ sbin/start-yarn.sh
2.3 HBase的解壓
解壓HBase到指定目錄:
[[email protected] 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://hadoop101: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>hadoop101:2181,hadoop102:2181,hadoop103:2181</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/opt/module/zookeeper-3.4.10/zkData</value> </property> </configuration> |
3)regionservers:
hadoop101 hadoop102 hadoop103 |
4)軟連接配接hadoop配置檔案到hbase:
[[email protected] module]$ ln -s /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml
/opt/module/hbase-1.3.1/conf/core-site.xml
[[email protected] module]$ ln -s /opt/module/hadoop-2.7.2/etc/hadoop/hdfs-site.xml
/opt/module/hbase-1.3.1/conf/hdfs-site.xml
2.5 HBase遠端發送到其他節點
2.6 HBase服務的啟動
1.啟動方式1
[[email protected] hbase]$ bin/hbase-daemon.sh start master
[[email protected] hbase]$ bin/hbase-daemon.sh start regionserver
提示:如果叢集之間的節點時間不同步,會導緻regionserver無法啟動,抛出ClockOutOfSyncException異常。
修複提示:
a、同步時間服務
b、屬性:hbase.master.maxclockskew設定更大的值
<property> <name>hbase.master.maxclockskew</name> <value>180000</value> <description>Time difference of regionserver from master</description> </property> |
2.啟動方式2
[[email protected] hbase]$ bin/start-hbase.sh
對應的停止服務:
[[email protected] hbase]$ bin/stop-hbase.sh
2.7 檢視HBase頁面
啟動成功後,可以通過“host:port”的方式來通路HBase管理頁面,例如:
http://hadoop:16010
第3章 HBase Shell操作
3.1 基本操作
1.進入HBase用戶端指令行(任意節點均可)
[[email protected] 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 => '1002'}
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 Time Stamp
HBASE 中通過rowkey和columns确定的為一個存貯單元稱為cell。cell中的資料是沒有類型的,全部是位元組數組形式存貯。每個 cell都儲存 着同一份資料的多個版本。版本通過時間戳來索引。時間戳的類型是 64位整型。時間戳可以由HBASE(在資料寫入時自動 )指派,此時時間戳是精确到毫秒 的目前系統時間。時間戳也可以由客戶顯式指派。如果應用程式要避免資料版 本沖突,就必須自己生成具有唯一性的時間戳。每個 cell中,不同版本的資料按照時間倒序排序,即最新的資料排在最前面。
為了避免資料存在過多版本造成的的管理 (包括存貯和索引)負擔,HBASE提供 了兩種資料版本回收方式。一是儲存資料的最後n個版本,二是儲存最近一段 時間内的版本(比如最近七天)。使用者可以針對每個列族進行設定。
4.5 命名空間
命名空間的結構:
1) Table:表,所有的表都是命名空間的成員,即表必屬于某個命名空間,如果沒有指定,則在default預設的命名空間中。Create_namespace
2) RegionServer group:一個命名空間包含了預設的RegionServer Group。
3) Permission:權限,命名空間能夠讓我們來定義通路控制清單ACL(Access Control List)。例如,建立表,讀取表,删除,更新等等操作。
4) Quota:限額,可以強制一個命名空間可包含的region的數量。