來源:https://www.cnblogs.com/bainianminguo/p/12110077.html
作者:bainianminguo
一、Hbase簡介
1、什么是Hbase
Hbase的原型是google的BigTable論文,收到了該論文思想的啟發(fā),目前作為hadoop的子項(xiàng)目來開發(fā)維護(hù),用于支持結(jié)構(gòu)化的數(shù)據(jù)存儲。
Hbase是一個(gè)高可靠性(存儲在hdfs上,有副本機(jī)制),高性能,面向列,非關(guān)系型的數(shù)據(jù)庫(類似redis),可伸縮的分布式存儲系統(tǒng)(因?yàn)槭谴鎯υ趆dfs上),利用hbase技術(shù)可在廉價(jià)PC
server上搭建大規(guī)模結(jié)構(gòu)化的數(shù)據(jù)庫存儲集群。
Hbase的目標(biāo)是存儲并處理大型的數(shù)據(jù),更具體來說僅需使用普通的硬件,就能夠處理由成千上萬行和列所組成的大型數(shù)據(jù)。
Hbase是基于hdfs構(gòu)建的分布式存儲框架,但是Hbase在hdfs上實(shí)現(xiàn)隨機(jī)的讀寫改,解決了hdfs不支持的東西
2、Hbase的特點(diǎn)
A、海量存儲
B、列式存儲
這里的列式存儲其實(shí)說的是列族存儲,Hbase是根據(jù)列族來存儲數(shù)據(jù)的,列族下面可以有非常多的列,列族在創(chuàng)建表的時(shí)候必須指定
Hbase中的列和mysql的列不是一個(gè)東西,Hbase的列就是他的數(shù)據(jù)
C、極易擴(kuò)展
Hbase的擴(kuò)展性主要體現(xiàn)在兩個(gè)方面,一個(gè)是基于上層的梳理能力的擴(kuò)展(RegionServer,相當(dāng)于datanode,處理讀寫請求),一個(gè)是基于存儲的擴(kuò)展(hdfs)
通過橫向添加RegionServer的機(jī)器,進(jìn)行水平擴(kuò)展,提升Hbase上層的處理能力,提升Hbase服務(wù)更多的Region的能力。
備注:RegionServer的作用是管理Region)(類似mysql中的表的概念),承接客戶端的讀寫請求的訪問,這個(gè)后面會(huì)詳細(xì)的介紹通過橫向添加datanode的機(jī)器,進(jìn)行存儲層的擴(kuò)容,提升Bhbase的存儲能力和提升后端存儲的讀寫能力
D、稀疏
稀疏主要是針對于hbase列的靈活性,在列族中,你可以指定任意多的列,在列數(shù)據(jù)為空的情況下,是不會(huì)占用存儲空間的,這里和mysql等數(shù)據(jù)庫不一樣,mysql如果每個(gè)字段沒有值,那這個(gè)字段的值為null,不為空,且會(huì)占用存儲空間
3、Hbase的架構(gòu)
Hbase的架構(gòu)示意圖如下
Hbase由HMaster和HRegionServer組成,HMaster的高可用也依賴于zk,類似于hdfs中的Namenode;
HRegionServer相當(dāng)于hdfs中的datanode,實(shí)際處理讀寫請求的節(jié)點(diǎn);
a、Zookeeper
HBase通過zk來做Hmaster的高可用,RegionServer的監(jiān)控,元數(shù)據(jù)的入口以及集群配置的維護(hù)等工作,具體工作入下
通過zk來保證集群中只有一個(gè)master在運(yùn)行,如果master異常,會(huì)通過競爭機(jī)制產(chǎn)生新的master提供服務(wù)
通過zk來監(jiān)控RegionServer的狀態(tài),當(dāng)RegionServer有異常的時(shí)候,通過回調(diào)的形式通知master,RegionServer上下線的信息
通過zk存儲元數(shù)據(jù)的統(tǒng)一入口地址;
b、HMaster
為RegionServer分配Region
維護(hù)集群的負(fù)載均衡,就是分配Region
維護(hù)集群的元數(shù)據(jù)信息
發(fā)現(xiàn)失效的Region,并將失效的Region分配到正常的RegionServer上
當(dāng)RegionServer失效的時(shí)候,協(xié)調(diào)對應(yīng)的Hlog和hdfs的block進(jìn)行數(shù)據(jù)恢復(fù)
C、HRegionServer
HRegionServer直接對接用戶的讀寫請求,是真正的干活的節(jié)點(diǎn),他的功能概括如下
管理master為其分配的Region
處理來自客戶端的讀寫請求
負(fù)責(zé)和底層hdfs的交互,存儲數(shù)據(jù)到hdfs中
負(fù)責(zé)Region變大后的拆分
負(fù)責(zé)Storefile的合并工作
D、HDFS
Hdfs為hbase提供最終的底層數(shù)據(jù)存儲服務(wù)
提供元數(shù)據(jù)和表數(shù)據(jù)的底層分布式存儲服務(wù)
數(shù)據(jù)的多副本,保證高可靠和高可用
E、Hlog
一個(gè)HRegionServer中只有一個(gè)Hlog,Hlog相當(dāng)于hdfs中的edits文件,保存Hbase的修改記錄,當(dāng)對Hbase寫數(shù)據(jù)的時(shí)候,數(shù)據(jù)不是直接寫進(jìn)磁盤,他會(huì)在內(nèi)存中保留一段時(shí)間(時(shí)間i將數(shù)據(jù)量的閾值可以設(shè)定)。但把數(shù)據(jù)保存在內(nèi)存中可能有更高的概率引起數(shù)據(jù)丟失,為了解決這個(gè)問題,數(shù)據(jù)會(huì)先寫在一個(gè)叫做Hlog的文件中,Hlog存儲在磁盤上,也位于hdfs上,然后在寫入內(nèi)存,所以在系統(tǒng)出現(xiàn)故障或者內(nèi)存丟失的時(shí)候,數(shù)據(jù)可以通過這個(gè)日志文件進(jìn)行重建
F、Region
Region相當(dāng)于mysql中的表,一個(gè)HRegionServer可以有多個(gè)Region,一個(gè)HRegionServer會(huì)有多個(gè)Region;如果表的數(shù)據(jù)太大,會(huì)進(jìn)行拆分,按照數(shù)據(jù)量平均切分,所有HBase中的一張表會(huì)對應(yīng)一個(gè)或者多個(gè)Region,當(dāng)表的內(nèi)容很小,一張表就對應(yīng)一個(gè)Region,如果表很大的話,則這個(gè)Region會(huì)切分,切分Region會(huì)同時(shí)拆分這個(gè)Region的所有Store。
G、Store
Store相當(dāng)于列族,通俗的講就是列的家族,在hbase中,想創(chuàng)建一個(gè)列,必須要指定列族,也就是一個(gè)列必須屬于某個(gè)列族。一個(gè)表中可以有多個(gè)列族,一個(gè)store對應(yīng)一個(gè)列族,hbase官方不建議多個(gè)列族,一個(gè)列族就可以搞上百個(gè)列,足夠用了。但是如果一個(gè)HRegion被切分的話,是切分列族,所以就算一個(gè)HRegion只有一個(gè)列表,切分后一個(gè)Region也會(huì)對應(yīng)多個(gè)Store,多個(gè)strore會(huì)被分配到其他的HRegionServer節(jié)點(diǎn)進(jìn)行存儲
H、MemStore
MemStore就是列族中的數(shù)據(jù)放在內(nèi)存中,寫數(shù)據(jù)來了,會(huì)寫到內(nèi)存中,只要內(nèi)存寫入成功,則就返回。
I、StoreFile
StoreFile,數(shù)據(jù)放在內(nèi)存不安全,而且有大小限制,所以需要把內(nèi)存中的數(shù)據(jù)寫到磁盤中,以Hfile的格式存儲在hdfs上。每次memstore刷一次,形成一個(gè)storefile,所以storefile會(huì)很多,但是很小,因?yàn)閮?nèi)存本身就不大,后面storeFile也會(huì)合并,但是這個(gè)合并也僅僅是一個(gè)列族內(nèi)部的StoreFile進(jìn)行合并,不會(huì)跨列族合并的
J、HFile
這是磁盤上保存的原始數(shù)據(jù)的實(shí)際的物理文件,是實(shí)際的存儲文件,storefile是以Hfile的形式存儲在hdfs中
二、Hbase安裝
1、首先要安裝zk
2、 然后要安裝hdfs
3、 最后在安裝hbase
4、 解壓,修改配置文件
這里重點(diǎn)說下修改配置文件,前面的就不說了,因?yàn)槲以趯?shí)際使用過程中使用ambari工具來進(jìn)行安裝
首先修改hbase-env.sh
配置java的環(huán)境變量
export JAVA_HOME=/usr/lib/jvm/java
配置zk,Hbase也是強(qiáng)依賴于zookeeper的,是否要啟用自己的zookeeper。如果用則為true,如果用外部的zookeeper,則為false
export HBASE_MANAGES_ZK=false
配置hbase-site.xml
<property>
<name>hbase.rootdir</name>
<value>/apps/hbase/data</value>
</property>
配置hbase是否啟用集群
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
設(shè)置Hbase的服務(wù)的端口號,不是 web的端口號,web的端口號是16010
<property>
<name>hbase.master.info.port</name>
<value>16010</value>
</property>
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
配置要連接的zk
<property>
<name>hbase.zookeeper.quorum</name>
<value>abdi1,abdi2,abdi3</value>
</property>
Zk存儲數(shù)據(jù)的父目錄,主要是為了區(qū)分多個(gè)hbase集群
<property>
<name>zookeeper.znode.parent</name>
<value>/hbase-unsecure</value>
</property>
配置regionservers文件
指定RegionServer的節(jié)點(diǎn)
由于hbase是強(qiáng)依賴于hdfs的,需要拷貝hdfs的配置文件到hbase的conf目錄
我們一般情況會(huì)這樣操作,創(chuàng)建一個(gè)軟鏈接,鏈接到hdfs的core-site.xml和hdfs-
site.xml中,就是讓hbase知道我要連接哪個(gè)hadoop集群
但是在ambari安裝的hbase的配置文件中沒有找到相應(yīng)的配置,但是在hbase啟動(dòng)的時(shí)候有加載hdfs的環(huán)境變量
啟動(dòng)hbase,可以看到有Hmaster和HRegionServer的java進(jìn)程
ambari的web頁面顯示效果如下
注意:Hbase的Master和RegionServer安裝是一樣的,只是看我們是否要啟動(dòng)master
Hbase的web頁面,采用16010端口
三、Hbase的簡單shell操作
1、進(jìn)入hbase shell
[root@abdi2 bin]# /usr/hdp/current/hbase-client/bin/hbase shell
2、查看當(dāng)前有哪些表:list
hbase(main):003:0> list
TABLE
0 row(s)
Took 0.2713 seconds
=> []
hbase(main):004:0>
3、創(chuàng)建表操作。這里的列族是必須要指定的,就是和mysql的列一樣:create "student","info"
hbase(main):004:0> create "student","info"
Created table student
Took 1.3445 seconds
=> Hbase::Table - student
hbase(main):005:0>
hbase(main):006:0> list
TABLE
student
1 row(s)
Took 0.0055 seconds
=> ["student"]
4、插入數(shù)據(jù)。Hbase中的數(shù)據(jù)沒有什么類型,比如字符串,hash等,全部是字節(jié):put
"student","1001","info:name","laowang"
hbase(main):007:0> put "student","1001","info:name","laowang"
Took 0.1217 seconds
hbase(main):008:0> put "student","1001","info:age","18"
Took 0.0038 seconds
hbase(main):009:0> put "student","1001","info:sex","male"
Took 0.0049 seconds
hbase(main):010:0> put "student","1002","info:name","laoluo"
Took 0.0036 seconds
hbase(main):011:0> put "student","1002","info:age","20"
Took 0.0035 seconds
5、掃描查看數(shù)據(jù):scan “student”
6、掃描查看數(shù)據(jù),指定起始和截止Rowkey, 前閉后開
7、 查看指定Rowkey
8、 查看指定行的指定列
9、 更新數(shù)據(jù)
10、 查看表結(jié)構(gòu)
重點(diǎn)關(guān)注列族和版本即可,這里的版本是個(gè)數(shù)的意思,就一條數(shù)據(jù)存儲幾個(gè)版本
11、 修改列族的版本信息
多更新幾次數(shù)據(jù)
可以查看到有多個(gè)版本,這里的意思查看 3 個(gè)版本的數(shù)據(jù),所以有三條,下面的命令是查看 2 個(gè)版本的數(shù)據(jù),所以有兩條
12、 刪除操作
刪除某個(gè) Rowkey 的指定列,可以看到其他列的數(shù)據(jù)還在,刪除還可以指定時(shí)間戳,該時(shí)間戳之前的數(shù)據(jù)都會(huì)被刪除
刪除 Rowkey 對應(yīng)的所有數(shù)據(jù)
13、統(tǒng)計(jì)條數(shù)
統(tǒng)計(jì)條數(shù), Rowkey 有幾個(gè),條數(shù)就有幾條
14、清空表
15、刪除表
16、命名空間(namespace)操作
命令空間,相當(dāng)于數(shù)據(jù)庫中的 database
所有的表都是命名空間的成員,如果不指定,則默認(rèn)在 default 的命名空間中
命名空間可以設(shè)置權(quán)限,比如定義訪問控制列表,例如創(chuàng)建表,讀取表,刪除,更新操作,權(quán)限用的很少
Shell 命令查看 namespace 、創(chuàng)建 namespace
Hbase 就是存儲元數(shù)據(jù)的命名空間,是系統(tǒng)自己用的,不能給用戶使用
在指定命名空間下建表
四、Hbase的數(shù)據(jù)結(jié)構(gòu)
1、Rowkey
Rowkey 是用來檢索記錄的主鍵,訪問 Hbase table 中的行,只有三種方式
A、 通過單個(gè) Rowkey 訪問
B、 通過 Rowkey 的 range 訪問
C、 全表掃描
設(shè)計(jì) Rowkey 非常重要也是 Hbase 里最重要的一門學(xué)問,數(shù)據(jù)會(huì)按照 Rowkey 的字典序排序進(jìn)行存儲,所以設(shè)計(jì) Rowkey
要利用這個(gè)特性,把經(jīng)常一起讀取的行存儲在一起,學(xué)習(xí)Hbase,Rowkey設(shè)計(jì)是學(xué)習(xí)的重點(diǎn)
2、Column Family
列族, Hbase 表中的每個(gè)列,都會(huì)屬于某個(gè)列族,列族是表的結(jié)構(gòu)的一部分,列族在建表的時(shí)候必須要指定。列名都是以列族做為前綴。
在創(chuàng)建表的時(shí)候需要指定列族,列族可以指定多個(gè)
3、Cell
由 Rowkey , column Family :column , version 唯一確定的單元, cell
中的數(shù)據(jù)是沒有類型的,全部都是字節(jié)的形式存儲
4、Time Stamp
時(shí)間戳,每個(gè) cell 都保存著同一份數(shù)據(jù)的多個(gè)版本,版本通過時(shí)間戳來索引。時(shí)間戳可以由系統(tǒng)生成,也可以自己指定。每個(gè) cell
中,不同版本的數(shù)據(jù)按照時(shí)間倒序排列,即最新的數(shù)據(jù)在最前面
通過時(shí)間戳不同來確定版本的
五、Hbase的原理
Hbase 的寫比讀還快
1、讀流程, hmaster 沒有關(guān)系, hmaster 掛掉后,不影響讀流程
a、先獲取 meta 表的位置,也就元數(shù)據(jù)這張表存儲的位置
b、 去 meta 表所在位置獲取 meta 表的信息, meta 表存儲的內(nèi)容大致入下
Student 0 ----10000 rs1
Student 100001---20000 rs2
Stff 0---10000 rs3
Stff 10000—200000 rs4
c、 然后在去對應(yīng)的 regionserver 獲取對應(yīng)的數(shù)據(jù)
d、 獲取數(shù)據(jù),先去內(nèi)存中獲取,如果內(nèi)存中沒有,到 blockcache 中獲取,如果 blockcash
沒有,則去磁盤獲取,這里為什么先去內(nèi)存獲取數(shù)據(jù)?
e、 返回?cái)?shù)據(jù)的時(shí)候,先把數(shù)據(jù)寫到 blockcache 中,然后在返回給 client
Meta 表的位置
Zk 上查看 meta 表的存儲位置
查看meta表的內(nèi)容
2、 寫流程,和Hmaster沒有關(guān)系
a、client 到 zk 獲取 meta 表的位置
b、Zk 返回 meta 表的位置
c、Zk 去 regionserver 讀取 meta 表的內(nèi)容
d、Regionserver 將 meta 表的內(nèi)容返回
e、去對應(yīng)的 regionserver 開始執(zhí)行寫操作,先寫 Hlog 文件,然后寫到 memstore ,成功后,立刻返回,寫入流程完成
因?yàn)橄葘懙絻?nèi)存中,那么什么時(shí)候會(huì)刷到硬盤中呢
a、Regionserver 的使用的總內(nèi)存達(dá)到堆內(nèi)存的 40%
b、 滿足一個(gè)小時(shí)的條件,會(huì)刷 memstore 到硬盤中
c、單個(gè) region 里的所有的 Memstore 加起來達(dá)到 128MB ,則會(huì)刷 memstore 到硬盤中
這樣就會(huì)有很多小文件刷到 hdfs 中,但是 hdfs 不適合存儲很多的小文件
默認(rèn)是 7 天做一次合并
超過 7 天合并 storefile 文件
超過 3 個(gè) storefile 文件,會(huì)進(jìn)行合并
這個(gè)是合并一個(gè)列族的的 storefile ,不同列族的 storefile 文件不會(huì)進(jìn)行合并的
3、高可用
Hmaster是Active 和 standby 模式
高可用配置
掃描查看數(shù)據(jù)