Hbase概念原理掃盲

1、Hbase簡介

一、什麼是Hbase

Hbase的原型是google的BigTable論文,收到了該論文思想的啓發,目前做爲hadoop的子項目來開發維護,用於支持結構化的數據存儲。html

Hbase是一個高可靠性(存儲在hdfs上,有副本機制),高性能,面向列,非關係型的數據庫(相似redis),可伸縮的分佈式存儲系統(由於是存儲在hdfs上),利用hbase技術可在廉價PC server上搭建大規模結構化的數據庫存儲集羣。java

Hbase的目標是存儲並處理大型的數據,更具體來講僅需使用普通的硬件,就可以處理由成千上萬行和列所組成的大型數據。node

Hbase是基於hdfs構建的分佈式存儲框架,可是Hbase在hdfs上實現隨機的讀寫改,解決了hdfs不支持的東西python

 

二、Hbase的特色

A、海量存儲mysql

B、列式存儲web

這裏的列式存儲其實說的是列族存儲,Hbase是根據列族來存儲數據的,列族下面能夠有很是多的列,列族在建立表的時候必須指定redis

Hbase中的列和mysql的列不是一個東西,Hbase的列就是他的數據sql

C、極易擴展shell

Hbase的擴展性主要體如今兩個方面,一個是基於上層的梳理能力的擴展(RegionServer,至關於datanode,處理讀寫請求),一個是基於存儲的擴展(hdfs)數據庫

經過橫向添加RegionServer的機器,進行水平擴展,提高Hbase上層的處理能力,提高Hbase服務更多的Region的能力。

備註:RegionServer的做用是管理Region)(相似mysql中的表的概念),承接客戶端的讀寫請求的訪問,這個後面會詳細的介紹經過橫向添加datanode的機器,進行存儲層的擴容,提高Bhbase的存儲能力和提高後端存儲的讀寫能力

D、稀疏

稀疏主要是針對於hbase列的靈活性,在列族中,你能夠指定任意多的列,在列數據爲空的狀況下,是不會佔用存儲空間的,這裏和mysql等數據庫不同,mysql若是每一個字段沒有值,那這個字段的值爲null,不爲空,且會佔用存儲空間

 

三、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中

 

2、Hbase安裝

一、首先要安裝zk

二、 而後要安裝hdfs

三、 最後在安裝hbase

四、 解壓,修改配置文件

這裏重點說下修改配置文件,前面的就不說了,由於我在實際使用過程當中使用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端口

 

 

 

3、Hbase的簡單shell操做

一、進入hbase shell

[root@abdi2 bin]# /usr/hdp/current/hbase-client/bin/hbase shell

  

二、查看當前有哪些表:list

hbase(main):003:0> list
TABLE                                                                                                                                                                                                                                                                         
0 row(s)
Took 0.2713 seconds                                                                                                                                                                                                                                                           
=> []
hbase(main):004:0>

  

三、建立表操做。這裏的列族是必需要指定的,就是和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"]

  

 

 

 

 

 

 

四、插入數據。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

  

 

 

 

五、掃描查看數據:scan 「student」

 

 

六、掃描查看數據,指定起始和截止Rowkey,前閉後開

 

 

七、查看指定Rowkey

 

 

 

八、查看指定行的指定列

 

 

 

九、更新數據

 

 

 

十、查看錶結構

重點關注列族和版本便可,這裏的版本是個數的意思,就一條數據存儲幾個版本

 

 

 

十一、修改列族的版本信息

 

 

 

多更新幾回數據

 

 

 

能夠查看到有多個版本,這裏的意思查看3個版本的數據,因此有三條,下面的命令是查看2個版本的數據,因此有兩條

 

 

 

 

十二、刪除操做

刪除某個Rowkey的指定列,能夠看到其餘列的數據還在,刪除還能夠指定時間戳,該時間戳以前的數據都會被刪除

 

 

 

 

 

 

刪除Rowkey對應的全部數據

 

 

 

 

 

1三、統計條數

統計條數,Rowkey有幾個,條數就有幾條

 

 

 

1四、清空表

 

 

1五、刪除表

 

 

 

 

1六、命名空間(namespace)操做

命令空間,至關於數據庫中的database

全部的表都是命名空間的成員,若是不指定,則默認在default的命名空間中

 

命名空間能夠設置權限,好比定義訪問控制列表,例如建立表,讀取表,刪除,更新操做,權限用的不多

 

Shell命令查看namespace、建立namespace

 

 

 

 

 

Hbase就是存儲元數據的命名空間,是系統本身用的,不能給用戶使用

在指定命名空間下建表

 

 

 

 

 

 

 

 

 

4、Hbase的數據結構

一、Rowkey

Rowkey是用來檢索記錄的主鍵,訪問Hbase table中的行,只有三種方式

A、經過單個Rowkey訪問

B、經過Rowkeyrange訪問

 

C、全表掃描

設計Rowkey很是重要也是Hbase裏最重要的一門學問,數據會按照Rowkey的字典序排序進行存儲,因此設計Rowkey要利用這個特性,把常常一塊兒讀取的行存儲在一塊兒,學習Hbase,Rowkey設計是學習的重點

 

二、Column Family

列族,Hbase表中的每一個列,都會屬於某個列族,列族是表的結構的一部分,列族在建表的時候必需要指定。列名都是以列族作爲前綴。

 

在建立表的時候須要指定列族,列族能夠指定多個

 

三、Cell

 

Rowkeycolumn Familycolumnversion惟一肯定的單元,cell中的數據是沒有類型的,所有都是字節的形式存儲

 

 

四、Time Stamp

時間戳,每一個cell都保存着同一份數據的多個版本,版本經過時間戳來索引。時間戳能夠由系統生成,也能夠本身指定。每一個cell中,不一樣版本的數據按照時間倒序排列,即最新的數據在最前面

 

經過時間戳不一樣來肯定版本的

 

5、Hbase的原理

Hbase的寫比讀還快

 

一、讀流程,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表的內容

 

 

二、寫流程,和Hmaster沒有關係

 

a、clientzk獲取meta表的位置

b、Zk返回meta表的位置

c、Zkregionserver讀取meta表的內容

d、Regionservermeta表的內容返回

e、去對應的regionserver開始執行寫操做,先寫Hlog文件,而後寫到memstore,成功後,馬上返回,寫入流程完成

 

由於先寫到內存中,那麼何時會刷到硬盤中呢

 

 

a、Regionserver的使用的總內存達到堆內存的40%

 

 

b、知足一個小時的條件,會刷memstore到硬盤中

 

 

c、單個region裏的全部的Memstore加起來達到128MB,則會刷memstore到硬盤中

 

 

這樣就會有不少小文件刷到hdfs中,可是hdfs不適合存儲不少的小文件

 

默認是7天作一次合併

 

 

 

 超過7天合併storefile文件

超過3storefile文件,會進行合併

這個是合併一個列族的的storefile,不一樣列族的storefile文件不會進行合併的

 

 三、高可用

Hmaster是Activestandby模式

 

 

 

 高可用配置

 

 

 

掃描查看數據

原文出處:https://www.cnblogs.com/bainianminguo/p/12110077.html

相關文章
相關標籤/搜索