1. 程式人生 > 其它 >HBase 體系結構

HBase 體系結構

HBase 的系統模型

原文連線

簡介

NoSQL

Hbase 是一種 NoSQL 資料庫,其實它更是一個分散式資料庫,從技術上講,相較於資料庫,HBase更像是一個數據儲存。因為HBase缺少很多關係型資料庫的特性,例如有型別的列,耳機索引,觸發器,高階的查詢語句。

但是HBase提供了很多支援線性及模組化的擴充套件。HBase可以通過增加RegionServer來擴充套件叢集。如果一個叢集的RegionServer的個數從10增加到20,那麼他的儲存和處理能力都增加一倍。關係型資料庫,雖然也可以擴充套件,但都是單節點的擴充套件。但是單點的資料庫,如果要提高效能,還需要硬體和儲存效能的提升。HBase的特性如下:

  • 強一致性的讀寫:HBase 不是最終一致性的資料庫,這個特性很適合使用者高速的資料收集。
  • 自動分片:HBase的表分佈在叢集的region上,隨著資料的增多,region會自動split成兩個region。
  • 基於Zookeeper保證RegionServer的高可用。
  • HBase基於HDFS的檔案儲存系統,本身就是一個分散式的檔案系統,保證了檔案的多備份,高可用,不丟失等問題。
  • MapReduce:支援基於MapReduce的大量任務並行讀取。
  • Java Client API:提供了java API,可以很方便的使用java接入。
  • Thrift/REST API:同時也支援 Thrift和Rest非java語言的接入。
  • Block Cache and Bloom Filter:HBase在讀取資料是支援Block Cache快取及依據Bloom 過濾器實現的判斷 rowkey 可能存在和一定不存在的機制,優化查詢效率。
  • 可操作性的控制介面:HBase提供了內建的web話的管理介面。

使用場景

  • 1,資料量較大。如果需要處理數億計的資料時,HBase是一個很好的備選方案,如果只有上千或者上萬條資料,使用關係型資料庫可能是更好的選擇。因為資料量太少時,資料被分散到多個節點上反而降低了查詢和儲存效率。
  • 2,確定在業務處理的過程中沒有使用RDBMS 中的特殊特性(例如 有型別的列,二級索引,事務,高階的查詢語言)。一個基於RDBMS的應用,需要確認使用沒有使用關係型資料庫的高姐特性才能移動到HBase上儲存。
  • 3,確保有足夠的硬體支援,HDFS要求至少有5個DataNode和一個NameNode。至少需要6臺機器。雖然HBase可以使用stand-alone模式,但是這個最好只在開發環境使用,生產環境最好部署為分散式的系統。

HBase 與 Hadoop/HDFS的區別

HDFS是一個分散式的檔案系統,比較適合儲存大檔案,他的文件指出,他不是通用的文件系統,因為其無法提供快速檔案或記錄查詢服務。HBase基於HDFS構建,可以提供大資料表中記錄的快速查詢。HBase內部將資料儲存到可索引的StoreFiles檔案中,這些檔案儲存在HDFS上。可以通過檢視HBase的資料模型瞭解。

目錄表

目錄表hbase:meta作為一個table存在於HBase中,在在使用list查詢時,返回結果會將其排除在外。不做展示。

hbase:meta

hbase:meta表儲存了叢集的所有region資訊,hbase:meta的位置資訊在zookeeper的meta-region-server中儲存。hbase:meta的表結果如下:

Key

key的結構為(table,region start key,region id)三個部分組成。

Values

  • info:regioninfo,儲存這Region對應的HRegionInfo的序列化資訊。
  • info:server ,儲存負責管理當前Region的RegionServer的server:port新資訊。
  • info:serverstartcode,儲存這RegionServer開始負責這個region的時間。

當表的region發生split時,將會再建立兩列info:splitA和info:splitB。這兩列代表這個被分開的region。這些列資訊也會反序列化為HRegionInfo 例項。在split完成之後,最終這一行資料會被刪除。

空的key用來標註標的開始和結束,如果一個region以空key開始,那麼這個region是表的第一個region,如果一個region以空key開始和結尾,那麼這個表,只有當前一個region

客戶端 Client

HBase 客戶端通過請求hbase:meta 來獲取叢集的的RegionServer集合。在定位需要查詢的region集合後,客戶端直接連線管理Region的RegionServer,傳送讀寫請求。這些資訊緩緩在client端,後續的請求不需要在進行上面的處理。如果RegionServer掛了,client會重新請求catalog tables;

連線叢集

具體的連線API可參考連結:https://hbase.apache.org/book.html#client_dependencies

1.0.0版本 API

使用者從ConnectionFactory獲取連線物件Connection,然後從連線物件中獲取Table,Admin,RegionLocator等物件,在使用完成後,需要關閉連線,並確認釋放Connection物件。 Connections是一個很重的物件,但是執行緒安全,s顒我們在應用中建立一個連線即可。Table,Admin和RegionLocator這些物件是輕量的,在使用時建立,使用完成銷燬即可。詳細API

1.0.0版本之前的API

建立HTable是在HBase1.0.0之前的連線方式,Table是非執行緒安全的,Table只能給一個執行緒使用,HBaseConfiguration 物件是比較推薦的使用方式,他維持著到zookeeper一級RegionServer的連線,示例如下:

HBaseConfiguration conf = HBaseConfiguration.create();
HTable table1 = new HTable(conf, "myTable");
HTable table2 = new HTable(conf, "myTable");

而不是每個表都建立一個HBaseConfiguration

HBaseConfiguration conf1 = HBaseConfiguration.create();
HTable table1 = new HTable(conf1, "myTable");
HBaseConfiguration conf2 = HBaseConfiguration.create();
HTable table2 = new HTable(conf2, "myTable");

更多的連線資訊可以參照ConnectionFactory

如果應用要求多執行緒訪問HBase,可以提前建立一個Connection

// Create a connection to the cluster.
Configuration conf = HBaseConfiguration.create();
try (Connection connection = ConnectionFactory.createConnection(conf);
     Table table = connection.getTable(TableName.valueOf(tablename))) {
  // use table as needed, the table returned is lightweight
}

非同步客戶端

在HBase2.0引入了可以非同步處理HBase的API,我們可以從ConnectionFactory獲取一個AsyncConnection,然後獲取一個非同步的table例項訪問HBase。非同步table中,大部分的介面和Table的意思相同,唯一的區別是返回結果使用CompletableFuture包裹。因為是非同步的,所有table不需要顯示的關閉,而且table也是執行緒安全的。但是在做掃描時還是有些不同的:

  • getSanner方法返回ResultScanner,工作方式和老的ClientAsyncPrefetchScanner類似。
  • scanAll介面一次返回所有的結果,這個方法的初衷是一次返回所有需要的少量資料
  • 觀察者模式,scan方法需要傳入一個ScanResultConsumer作為引數,當查詢完成後,資料將資料傳送給消費者進行消費。

AsyncTable中的介面是模板話的,模板引數確定了使用ScanResultConsumerBase 哪個實現類完成掃描結果的消費。目前有連個消費實現類ScanResultConsumerAdvancedScanResultConsumer

  • ScanResultConsumer需要一個單獨的執行緒池處理返回的CompletableFuture。使用的單獨的執行緒池,釋放了RPC執行緒,所以callback不需要做任何其他額外的操作,這種比較適合callback不太快的掃描。
  • AdvancedScanResultConsumer執行callback的處理任務在框架的執行緒裡,他不允許做比較耗時的操作,也不允許block,因為這可能影響礦建的效能。他主要為高階使用者提供的,用來自己編寫更高效能的消費者。

Asynchronous Admin

我們可以從ConnectionFactory獲取一個AsyncConnection,然後獲取一個AsyncAdmin。getAdmin有兩個方法,其中一個方法需要傳入一個執行緒池,用來執行callback。這個方法用來給普通使用者使用的,另外一個沒有執行緒池的方法使用框架的執行緒執行callback,他同樣不允許在callback中執行耗時的操作,這個也是提供給高階開發者的。

Master

HMaster是一個Master Server的實現,主要負責監控所有的RegionServer例項,提供元資料修改的介面。在一個分散式叢集中,主節點已NameNode的角色執行。當叢集中存在多個Masters時,所有的Master競爭成為cluster真正的Master,如果一個活躍的Master與zookeeper斷鏈,剩下的Masters競爭成為j群的Master。

RegionServer

HRegionServer 為RegionServer的一個實現,他負責管理Region,在分散式叢集中,他的角色相當於DataNode。

多執行緒處理任務

他的主要功能在後臺啟動多種執行緒,管理Region。其中的執行緒的分類如下:

  • CompactSplitThread,檢查Region的split,處理minor 映象的合併;
  • MajorCompactionChecker 檢查major 合併;minor 合併,只合並部分的HFile,無法做到整體合併,這樣就無法清理delete的資料,所以需要major合併。
  • MemStoreFlusher,HBase基於LSM實現的,其分為記憶體部分和磁碟部分,MemStore達到閾值後,需要將資料重新整理到StoreFiles中
  • LogRoller 檢查WAL(Hlog)是否過期,是否刪除,HBase為了保證高可用,在寫入記憶體時,會將資料寫入WAL中,這樣需要定期的檢查WAL的資料是否已經存入磁碟,如果已經存入,則需要清理WAL。

Block Cache

為了加快資料的讀取速度,HBase設計了Block Cache 其中Block的大小為64k,儲存這磁碟上連續儲存的KV資料。Block Cache存在兩種實現方式:LruBlockCache和BucketCache。預設為LruBlockCache

  • LruBlockCache,是JVM的堆上快取,需要設定working set size。
  • BucketCache,是一個非堆快取,存在三種模式,分別為offheap,file和mmaped file。

Region

Region是分散式表的最基礎元素。當資料表超過一定大小會水平切分,分裂成兩個Region。Region是叢集負載均衡的基本單位,Region由一個或者多個store組成,store的個數取決於列簇的個數。每個Store由一個MemStore和一個或多個HFile組成,資料會首先寫入MemStore中,當MemStore寫滿後,系統會將資料非同步flush到HFile中。隨著資料的不斷寫入,HFile的數量會不斷增多,這時候系統會執行Compact操作合併檔案。