帶你漲姿勢,Hbase 概念原理掃盲 !

來源: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)示意圖如下

image

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)境變量

image
    export JAVA_HOME=/usr/lib/jvm/java

配置zk,Hbase也是強(qiáng)依賴于zookeeper的,是否要啟用自己的zookeeper。如果用則為true,如果用外部的zookeeper,則為false

image
    export HBASE_MANAGES_ZK=false

配置hbase-site.xml

image
    <property>
          <name>hbase.rootdir</name>
          <value>/apps/hbase/data</value>
        </property>

配置hbase是否啟用集群

image
        <property>
          <name>hbase.cluster.distributed</name>
          <value>true</value>
        </property>

設(shè)置Hbase的服務(wù)的端口號,不是 web的端口號,web的端口號是16010

image
      <property>
          <name>hbase.master.info.port</name>
          <value>16010</value>
        </property>
image
        <property>
          <name>hbase.master.port</name>
          <value>16000</value>
        </property>

配置要連接的zk

image
       <property>
          <name>hbase.zookeeper.quorum</name>
          <value>abdi1,abdi2,abdi3</value>
        </property>

Zk存儲數(shù)據(jù)的父目錄,主要是為了區(qū)分多個(gè)hbase集群

image
        <property>
          <name>zookeeper.znode.parent</name>
          <value>/hbase-unsecure</value>
        </property>

配置regionservers文件

指定RegionServer的節(jié)點(diǎn)

image

由于hbase是強(qiáng)依賴于hdfs的,需要拷貝hdfs的配置文件到hbase的conf目錄

我們一般情況會(huì)這樣操作,創(chuàng)建一個(gè)軟鏈接,鏈接到hdfs的core-site.xml和hdfs-
site.xml中,就是讓hbase知道我要連接哪個(gè)hadoop集群

image

但是在ambari安裝的hbase的配置文件中沒有找到相應(yīng)的配置,但是在hbase啟動(dòng)的時(shí)候有加載hdfs的環(huán)境變量

image

啟動(dòng)hbase,可以看到有Hmaster和HRegionServer的java進(jìn)程

image

ambari的web頁面顯示效果如下

image

注意:Hbase的Master和RegionServer安裝是一樣的,只是看我們是否要啟動(dòng)master

Hbase的web頁面,采用16010端口

image

三、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"]
image
image

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  
image

5、掃描查看數(shù)據(jù):scan “student”

image

6、掃描查看數(shù)據(jù),指定起始和截止Rowkey, 前閉后開

image

7、 查看指定Rowkey

image

8、 查看指定行的指定列

image

9、 更新數(shù)據(jù)

image

10、 查看表結(jié)構(gòu)

重點(diǎn)關(guān)注列族和版本即可,這里的版本是個(gè)數(shù)的意思,就一條數(shù)據(jù)存儲幾個(gè)版本

image

11、 修改列族的版本信息

image

多更新幾次數(shù)據(jù)

image

可以查看到有多個(gè)版本,這里的意思查看 3 個(gè)版本的數(shù)據(jù),所以有三條,下面的命令是查看 2 個(gè)版本的數(shù)據(jù),所以有兩條

image

12、 刪除操作

刪除某個(gè) Rowkey 的指定列,可以看到其他列的數(shù)據(jù)還在,刪除還可以指定時(shí)間戳,該時(shí)間戳之前的數(shù)據(jù)都會(huì)被刪除

image

刪除 Rowkey 對應(yīng)的所有數(shù)據(jù)

image

13、統(tǒng)計(jì)條數(shù)

統(tǒng)計(jì)條數(shù), Rowkey 有幾個(gè),條數(shù)就有幾條

image

14、清空表

image

15、刪除表

image

16、命名空間(namespace)操作

命令空間,相當(dāng)于數(shù)據(jù)庫中的 database

所有的表都是命名空間的成員,如果不指定,則默認(rèn)在 default 的命名空間中

命名空間可以設(shè)置權(quán)限,比如定義訪問控制列表,例如創(chuàng)建表,讀取表,刪除,更新操作,權(quán)限用的很少

Shell 命令查看 namespace 、創(chuàng)建 namespace

image

Hbase 就是存儲元數(shù)據(jù)的命名空間,是系統(tǒng)自己用的,不能給用戶使用

在指定命名空間下建表

image
image

四、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é)的形式存儲

image

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 掛掉后,不影響讀流程

image

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 表的位置

image

Zk 上查看 meta 表的存儲位置

image

查看meta表的內(nèi)容

image

2、 寫流程,和Hmaster沒有關(guān)系

image

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%

image

b、 滿足一個(gè)小時(shí)的條件,會(huì)刷 memstore 到硬盤中

image

c、單個(gè) region 里的所有的 Memstore 加起來達(dá)到 128MB ,則會(huì)刷 memstore 到硬盤中

image

這樣就會(huì)有很多小文件刷到 hdfs 中,但是 hdfs 不適合存儲很多的小文件

默認(rèn)是 7 天做一次合并

image
image

超過 7 天合并 storefile 文件

超過 3 個(gè) storefile 文件,會(huì)進(jìn)行合并

這個(gè)是合并一個(gè)列族的的 storefile ,不同列族的 storefile 文件不會(huì)進(jìn)行合并的

3、高可用

Hmaster是Active 和 standby 模式

image
image

高可用配置

image

掃描查看數(shù)據(jù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容