HBase(一):概述

一、HBase簡介

1.1 HBase定義

HBase是一種分佈式、可擴展、支持海量數據存儲的NoSQL數據庫。利用HBase技術可在廉價PC Server上搭建起大規模結構化存儲集羣。HBase的目標是存儲並處理大型的數據,更具體來說是僅需使用普通的硬件配置,就能夠處理由成千上萬的行和列所組成的大型數據。

1.2 HBase特點

  1. 海量存儲
    HBase適合存儲PB級別的海量數據,在PB級別的數據以及採用廉價PC存儲的情況下,能在幾十到百毫秒內返回數據。這與HBase的極易擴展性息息相關。正式因爲HBase良好的擴展性,才爲海量數據的存儲提供了便利。
  2. 列式存儲
    這裏的列式存儲其實說的是列族(ColumnFamily)存儲,HBase是根據列族來存儲數據的。列族下面可以有非常多的列,列族在創建表的時候就必須指定。
  3. 極易擴展
    HBase的擴展性主要體現在兩個方面,一個是基於上層處理能力(RegionServer)的擴展,一個是基於存儲的擴展(HDFS)。通過橫向添加RegionSever的機器,進行水平擴展,提升HBase上層的處理能力,提升HBase服務更多Region的能力。
  4. 高併發(多核)
    由於目前大部分使用HBase的架構,都是採用的廉價PC,因此單個IO的延遲其實並不小,一般在幾十到上百ms之間。這裏說的高併發,主要是在併發的情況下,HBase的單個IO延遲下降並不多。能獲得高併發、低延遲的服務。
  5. 稀疏
    稀疏主要是針對HBase列的靈活性,在列族中,你可以指定任意多的列,在列數據爲空的情況下,是不會佔用存儲空間的。

1.3 HBase數據模型

邏輯上,HBase的數據模型同關係型數據庫很類似,數據存儲在一張表中,有行有列。但從HBase的底層物理存儲結構(K-V) 來看,HBase更像是一個multi-dimensional map

①HBase邏輯結構
在這裏插入圖片描述

  • 列族Hbase是根據列族來存儲數據的。列族下面可以有非常多的列,列族在創建表的時候就必須指定,不同的列族數據存儲在不同的位置。通過列族可以將寬表進行拆分。
  • RegionRegion類似於分區,將同一張的數據進行拆分。通過Region可以將高表進行拆分。
  • Row key:類似於索引,Row key是有序的,根據字典順序進行排序。
  • :縱向數據
  • store:數據存儲在store中,一個store對應HBase表中的一個列族

②HBase物理存儲結構
在這裏插入圖片描述
③數據模型

  1. Name Space
    命名空間類似於關係型數據庫的database概念,每個命名空間下有多個表。Hbase有兩個自帶的命名空間,分別是hbasedefaulthbase中存放的是HBase內置的表,default表是用戶默認使用的命名空間。
  2. Region
    類似於關係型數據庫的表概念。不同的是,HBase定義表時只需要聲明列族即可,不需要聲明具體的列。這意味着,往HBase寫入數據時,字段可以動態、按需指定。因此,和關係型數據庫相比,HBase能夠輕鬆應對字段變更的場景。
  3. Row
    HBase表中的每行數據都由一一個RowKey和多個Column (列)組成,數據是按照RowKey的字典順序存儲的,並且查詢數據時只能根據RowKey進行檢索,所以RowKey的設計十分重要。
  4. Column
    HBase中的每個列都由Column Family (列族)和Column Qualifier(列限定符)進行限定,例如info: nameinfo: age。建表時,只需指明列族,而列限定符無需預先定義。。
  5. Time Stamp
    用於標識數據的不同版本(version) ,每條數據寫入時,如果不指定時間戳,系統會自動爲其加上該字段,其值爲寫入HBase的時間。
  6. Cell
    {rowkey, column Family: column Qualifier, time Stamp}唯一確定的單元。cell中的數據是沒有類型的,全部是字節碼形式存貯。

1.4 HBase基本架構

不完整版:
在這裏插入圖片描述
RegionServer的作用

  • Data(數據級別):getputdelete
  • RegionsplitRegion(切), compactRegion(合)

Master的作用

  • Table(表級別):createdeletealter
  • RegionServer:分配regions到每 個RegionServer,監控每個RegionServer的狀態。

1.5 HBase完整架構

在這裏插入圖片描述
從圖中可以看出HBase是由ClientZookeeperMasterHRegionServerHDFS等幾個組件組成,下面來介紹一下幾個組件的相關功能:

①Client

Client包含了訪問HBase的接口,另外Client還維護了對應的cache來加速HBase的訪問,比如cache.META元數據的信息。

②Zookeeper

HBase通過Zookeeper來做master的高可用、RegionServer的監控、元數據的入口以及集羣配置的維護等工作。具體工作如下:

  • 通過Zookeeper來保證集羣中只有1個master在運行,如果master異常,會通過競爭機制產生新的master提供服務
  • 通過Zookeeper來監控RegionServer的狀態,當RegionServer有異常的時候,通過回調的形式通知masterRegionServer上下線的信息
  • 通過Zookeeper存儲元數據的統一入口地址

③HMaster(類似NameNode)

master節點的主要職責如下:

  • RegionServer分配Region
  • 維護整個集羣的負載均衡
  • 維護集羣的元數據信息
  • 發現失效的Region,並將失效的Region分配到正常的RegionServer
  • RegionServer失效的時候,協調對應Hlog的拆分

④HregionServer(類似DataNode)

HregionServer直接對接用戶的讀寫請求,是真正的“幹活”的節點。它的功能概括如下:

  • 管理master爲其分配的Region
  • 處理來自客戶端的讀寫請求
  • 負責和底層HDFS的交互,存儲數據到HDFS
  • 負責Region變大以後的拆分
  • 負責Storefile的合併工作

⑤HDFS

HDFSHBase提供最終的底層數據存儲服務,同時爲HBase提供高可用(Hlog存儲在HDFS)的支持,具體功能概括如下:

  • 提供元數據和表數據的底層分佈式存儲服務
  • 數據多副本,保證的高可靠和高可用性

⑥Region

HBase表的分片,HBase表會根據RowKey值被切分成不同的region存儲在RegionServer中,在一個RegionServer中可以有多個不同的Region

⑦HFile

這是在磁盤上保存原始數據的實際的物理文件,是實際的存儲文件。StoreFile是以HFile的形式存儲在HDFS的。

⑧Store

HFile存儲在Store中,一個Store對應HBase表中的一個列族。

⑨MemStore

內存存儲存當前的數據操作,所以當數據保存在WAL中之後,RegsionServer會在內存中存儲鍵值對。

⑩WAL(Write-Ahead logs)

當對HBase讀寫數據的時候,數據不是直接寫進磁盤,它會在內存中保留一段時間(時間以及數據量閾值可以設定)。但把數據保存在內存中可能有更高的概率引起數據丟失,爲了解決這個問題,數據會先寫在一個叫做Write-Ahead logfile的文件中,然後再寫入內存中。所以在系統出現故障的時候,數據可以通過這個日誌文件重建。

1.6 HBase Meta表

HBase有一個叫做Meta的特殊的目錄表,用於保存集羣中Regions的位置信息(Region列表)。ZooKeeper存儲着Meta表的位置。
在這裏插入圖片描述

二、HBase安裝

前提Hadoop集羣和ZooKeeper集羣的正常啓動。

HBase的解壓

[root@hadoop100 software]# tar -zxvf hbase-1.3.1-bin.tar.gz -C /opt/module

②修改hbase-env.sh

export JAVA_HOME=/opt/module/jdk1.8.0_144
export HBASE_MANAGES_ZK=false

③修改hbase-site.xml

	<property>     
		<name>hbase.rootdir</name>     
		<value>hdfs://hadoop100: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>hadoop100:2181,hadoop101:2181,hadoop102:2181</value>
	</property>

	<property>   
		<name>hbase.zookeeper.property.dataDir</name>
	     <value>/opt/module/zookeeper-3.4.10/zkData</value>
	</property>

④修改regionservers

hadoop100
hadoop101
hadoop102

⑤軟連接hadoop配置文件到hbase

[root@hadoop100 module]# ln -s /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml 
/opt/module/hbase-1.3.1/conf/core-site.xml

[root@hadoop100 module]# ln -s /opt/module/hadoop-2.7.2/etc/hadoop/hdfs-site.xml 
/opt/module/hbase-1.3.1/conf/hdfs-site.xml

⑥分發HBase

[root@hadoop100 module]# xsync hbase-1.3.1

HBase服務的啓動

啓動方式1:

[root@hadoop100 module]# bin/hbase-daemon.sh start master
[root@hadoop100 module]# bin/hbase-daemon.sh start regionserver

啓動方式2:

[root@hadoop100 hbase-1.3.1]$ bin/start-hbase.sh

停止:

[root@hadoop100 hbase-1.3.1]$ bin/stop-hbase.sh

提示:如果集羣之間的節點時間不同步,會導致regionserver無法啓動,拋出ClockOutOfSyncException異常。

解決①(推薦):集羣內時間同步:參考https://hucheng.blog.csdn.net/article/details/106266688

解決②:hbase-site.xml中屬性:hbase.master.maxclockskew設置更大的值

<property>
	<name>hbase.master.maxclockskew</name>
	<value>180000</value>
	<description>Time difference of regionserver from master</description>
</property>

啓動成功後,訪問http://hadoop102:16010進入HBase管理頁面:
在這裏插入圖片描述

三、HBase進階原理

3.1 寫流程

在這裏插入圖片描述

  1. Client先訪問ZooKeeper,獲取hbase:meta表位於哪個RegionServer
  2. 訪問對應的RegionServer,獲取hbase:meta表,根據讀請求的namespace:table/rowkey,查詢出目標數據位於哪個Region Server中的哪個Region中。並將該tableregion信息以及meta表的位置信息緩存在客戶端的meta cache,方便下次訪問;
  3. 與目標RegionServer進行通訊;
  4. 將數據順序寫入(追加)到WAL
  5. 將數據寫入對應的MemStore,數據會在MemStore進行排序;
  6. 向客戶端發送ack
  7. 等達到MemStore的刷寫時機後,將數據刷寫到HFile

3.2 讀流程

在這裏插入圖片描述

  1. Client先訪問ZooKeeper,獲取hbase:meta表位於哪個RegionServer
  2. 訪問對應的RegionServer,獲取hbase:meta表,根據讀請求的namespace:table/rowkey,查詢出目標數據位於哪個Region Server中的哪個Region中。並將該tableregion信息以及meta表的位置信息緩存在客戶端的meta cache,方便下次訪問;
  3. 查詢數據,如果Block Cache沒有對應數據,同時讀取內存(MemStore)和磁盤(StoreFile)中的數據(並將磁盤的數據緩存到Block CacheLRU算法),比較時間戳返回對應的數據。
  4. 如果Block Cache有對應數據,直接比較和MemStore中數據的最大時間戳,返回該數據。

3.3 MemStore Flush

在這裏插入圖片描述
MemStore數據達到閾值,將數據刷到硬盤。將內存中的數據刪除,同時刪除HLog中的歷史數據。

MemStore刷寫時機:

  1. 當某個MemStore的大小達到了hbase.hregion.memstore.flush.size (默認值128M),其所在Region的所有MemStore都會刷寫。
  2. RegionServer中的MemStore大小超過hbase.regionserver.global.memstore.size(默認大小爲堆大小的40%)
  3. 到達自動刷寫的時間也會觸發MemStore Flush,自動刷新的時間間隔由該屬性進行配置hbase.regionserver.optionalcacheflushinterval (默認1小時)。

3.4 StoreFile Compaction

在這裏插入圖片描述
由於MemStore每次刷寫都會生成一個新的HFile,且同一個字段的不同版本(timestamp)和不同類型(Put/Delete)有可能會分佈在不同的HFile中,因此查詢時需要遍歷所有的HFile。爲了減少HFile的個數,以及清理掉過期和刪除的數據,會進行StoreFile Compaction

Compaction分爲兩種,分別是Minor CompactionMajor CompactionMinor Compaction會將臨近的若干個較小的HFile合併成一個較大的HFile,但不會清理過期和刪除的數據。Major Compaction會將一個Store下的所有的HFile合併成一個大HFile,並且會清理掉過期和刪除的數據。

StoreFile Compaction觸發時機:當數據塊達到 4 塊,Hmaster觸發合併操作,Region將數據塊加載到本地,進行合併;當合並的數據超過 256M,進行拆分,將拆分後的Region分配給不同的HRegionServer管理(一個表中的Region就會被不同的HRegionServer管理,分佈式存儲,高可用容災); 當 HRegionServer宕機後,將 HRegionServer上的HLog拆分,然後分配給不同的HRegionServer加載,修改.META.

3.5 Region Split

默認情況下,每個Table起初只有一個Region,隨着數據的不斷寫入,Region會自動進行拆分。剛拆分時,兩個子Region都位於當前的Region Server,但處於負載均衡的考慮,HMaster有可能會將某個Region轉移給其他的RegionServer
在這裏插入圖片描述
Region Split時機:

  1. 當1個Region中的某個Store下所有StoreFile的總大小超過hbase.hregion.max.filesize,該Region就會進行拆分(0.94 版本之前)。
  2. 當1個Region中的某個Store下所有StoreFile的總大小超過Min(R^2 * "hbase.hregion.memstore.flush.size",hbase.hregion.max.filesize"),該Region就會進行拆分,其中R爲當前Region Server中屬於該Table的個數(0.94 版本之後)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章