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