一條數據的HBase之旅,簡明HBase入門教程-開篇

常見的HBase新手問題:

1. 什么樣的數據適合用HBase來存儲?

2. 既然HBase也是一個數據庫,能否用它將現有系統中昂貴的Oracle替換掉?

3. 存放于HBase中的數據記錄,為何不直接存放于HDFS之上?

4. 能否直接使用HBase來存儲文件數據?

5. Region(HBase中的數據分片)遷移后,數據是否也會被遷移?

6. 為何基于Spark/Hive分析HBase數據時性能較差?



開篇:

用慣了Oracle/MySQL的同學們,心目中的數據表,應該是長成這樣的:

這種表結構規整,每一行都有固定的列構成,因此,非常適合結構化數據的存儲。但在NoSQL領域,數據表的模樣卻往往換成了另外一種"畫風":

這種表結構規整,每一行都有固定的列構成,因此,非常適合結構化數據的存儲。但在NoSQL領域,數據表的模樣卻往往換成了另外一種"畫風":

行由看似"雜亂無章"的列組成,行與行之間也無須遵循一致的定義,而這種定義恰好符合半結構化數據或非結構化數據的特點。本文所要講述的HBase,就屬于該派系的一個典型代表。這些"雜亂無章"的列所構成的多行數據,被稱之為一個"稀疏矩陣",而上圖中的每一個"黑塊塊",在HBase中稱之為一個KeyValue。

Apache HBase官方給出了這樣的定義:

Apache HBase? is the Hadoop database, adistributed,scalable,big data store.

即:Apache HBase是基于Hadoop構建的一個分布式的、可伸縮海量數據存儲系統

HBase常被用來存放一些海量的(通常在TB級別以上)結構比較簡單的數據,如歷史訂單記錄,日志數據,監控Metris數據等等,HBase提供了簡單的基于Key值的快速查詢能力。HBase在國內市場已經取得了非常廣泛的應用,在搜索引擎中,也可以看出來,HBase在國內呈現出了逐年上升的勢態:

從Apache HBase所關聯的github項目的commits統計信息來看,也可以看出來該項目非常活躍:

需要說明的一點:HBase中的每一次Commit,都已經過社區Commiter成員嚴格的Review,在Commit之前,一個Patch可能已經被修改了幾十個版本,令人欣喜的是國內的開發者也積極參與到了HBase社區貢獻中,而且被社區接納多名PMC以及Committer成員。

關于國內committer成員信息參考另一篇文章 :?http://www.lxweimin.com/p/bf19986518ba

本文將以一條數據在HBase中的“旅程”為線索,介紹HBase的核心概念與流程,幾乎每一部分都可以展開成一篇獨立的長文,但本文旨在讓讀者能夠快速的了解HBase的架構輪廓,所以很多特性/流程被被一言帶過,但這些特性在社區中往往經歷了漫長的開發過程。至于講什么以及講到什么程度,本文都做了艱難的取舍,在講解的過程中,將會穿插解答本文開始所提出的針對初學者的一些常見問題。

本文適用于HBase新手,而對于具備一定經驗的HBase開發人員,相信本文也可以提供一些有價值的參考。本文內容基于HBase 2.0 beta 2版本,對比于1.0甚至是更早期的版本,2.0出現了大量變化,下面這些問題的答案將揭示部分關鍵的變化(新手可以直接跳過這些問題):

1. HBase?meta?Region在哪里提供服務?

2. HBase是否可以保證單行操作的原子性?

3. Region中寫WAL與寫MemStore的順序是怎樣的?

4. 你是否遇到過Region長時間處于RIT的狀態?

5. 你認為舊版本中Assignment Manager的主要問題是什么?

6. 在面對Full GC問題時,你嘗試做過哪些優化?

7.你是否深究過HBase Compaction帶來的“寫放大”有多嚴重?

8. HBase的RPC框架存在什么問題?導致查詢時延毛刺的原因有哪些?

本系列文章的整體行文思路如下:

1. 介紹HBase數據模型

2. 基于數據模型介紹HBase的適用場景

3. 快速介紹集群關鍵角色以及集群部署建議

4. 示例數據介紹

5. 寫數據流程

6. 讀數據流程

7. 數據更新

8. 負載均衡機制

9. HBase如何存儲小文件數據

這些內容將會被拆成幾篇文章。至于集群服務故障的處理機制,集群工具,周邊生態,性能調優以及最佳實踐等進階內容,暫不放在本系列文章范疇內。


約定:


1. 本文范圍內針對一些關鍵特性/流程,使用了加粗以及加下劃線的方式做了強調,如"ProcedureV2"。這些特性往往在本文中僅僅被粗淺提及,后續計劃以獨立的文章來介紹這些特性/流程。

2. 術語縮寫:對于一些進程/角色名稱,在本文范圍內可能通過縮寫形式來表述:


數據模型:


1. RowKey

用來表示唯一一行記錄的主鍵,HBase的數據是按照RowKey的字典順序進行全局排序的,所有的查詢都只能依賴于這一個排序維度。

通過下面一個例子來說明一下"字典排序"的原理:

RowKey列表{"abc", "a","bdf", "cdf", "def"} 按字典排序后的結果為 : {"a", "abc", "bdf", "cdf","defg"}

也就是說,當兩個RowKey進行排序時,先對比兩個RowKey的第一個字節,如果相同,則對比第二個字節,依次類推...如果在對比到第M個字節時,已經超出了其中一個RowKey的字節長度,那么,短的RowKey要被排在另外一個RowKey的前面。

2. 稀疏矩陣

參考了Bigtable,HBase中一個表的數據是按照稀疏矩陣的方式組織的,"開篇"部分給出了一張關于HBase數據表的抽象圖,我們再結合下表來加深大家關于"稀疏矩陣"的印象:

看的出來:每一行中,列的組成都是靈活的,行與行之間并不需要遵循相同的列定義, 也就是HBase數據表"schema-less"的特點。

3. Region

區別于Cassandra/DynamoDB的"Hash分區"設計,HBase中采用了"Range分區",將Key的完整區間切割成一個個的"Key Range" ,每一個"Key Range"稱之為一個Region。

也可以這么理解:將HBase中擁有數億行的一個大表,橫向切割成一個個"子表",這一個個"子表"就是Region

Region是HBase中負載均衡的基本單元,當一個Region增長到一定大小以后,會自動分裂成兩個。

4. Column Family

如果將Region看成是一個表的橫向切割,那么,一個Region中的數據列的縱向切割,稱之為一個Column Family。每一個列,都必須歸屬于一個Column Family,這個歸屬關系是在寫數據時指定的,而不是建表時預先定義。

5. KeyValue

KeyValue的設計不是源自Bigtable,而是要追溯至論文"The log-structured merge-tree(LSM-Tree)"。每一行中的每一列數據,都被包裝成獨立的擁有特定結構的KeyValue,KeyValue中包含了豐富的自我描述信息:

看的出來,KeyValue是支撐"稀疏矩陣"設計的一個關鍵點:一些Key相同的任意數量的獨立KeyValue就可以構成一行數據。但這種設計帶來的一個顯而易見的缺點:每一個KeyValue所攜帶的自我描述信息,會帶來顯著的數據膨脹


適用場景


在介紹完了HBase的數據模型以后,我們可以回答本文一開始的前兩個問題:

1.? ?什么樣的數據適合用HBase來存儲?

2.? ?既然HBase也是一個數據庫,能否用它將現有系統中昂貴的Oracle替換掉?

HBase的數據模型比較簡單,數據按照RowKey排序存放,適合HBase存儲的數據,可以簡單總結如下:

以實體為中心的數據

????實體可以包括但不限于如下幾種:描述這些實體的,可以有基礎屬性信息、實體關系(圖數據)、所發生的事件(如交易記錄、車輛軌跡點)等等。

? ? 1. 自然人/賬戶/手機號/車輛相關數據

? ? 2. 用戶畫像數據(含標簽類數據)

? ? 3. 圖數據(關系類數據)

以事件為中心的數據

????1. 監控數據

????2. 時序數據

????3. 實時位置類數據

????4. 消息/日志類數據

上面所描述的這些數據,有的是結構化數據,有的是半結構化非結構化數據

HBase的“稀疏矩陣”設計,使其應對非結構化數據存儲時能夠得心應手,但在我們的實際用戶場景中,結構化數據存儲依然占據了比較重的比例。由于HBase僅提供了基于RowKey的單維度索引能力,在應對一些具體的場景時,依然還需要基于HBase之上構建一些專業的能力,如:

? ? 1.?OpenTSDB時序數據存儲,提供基于Metrics+時間+標簽的一些組合維度查詢與聚合能力

? ? 2.?GeoMesa時空數據存儲,提供基于時間+空間范圍的索引能力

? ? 3.?JanusGraph圖數據存儲,提供基于屬性、關系的圖索引能力

HBase擅長于存儲結構簡單的海量數據但索引能力有限,而Oracle等傳統關系型數據庫(RDBMS)能夠提供豐富的查詢能力,但卻疲于應對TB級別的海量數據存儲,HBase對傳統的RDBMS并不是取代關系,而是一種補充


HBase與HDFS

我們都知道HBase的數據是存儲于HDFS里面的,相信大家也都有這么的認知:我們都知道HBase的數據是存儲于HDFS里面的,相信大家也都有這么的認知:

HBase是一個分布式數據庫,HDFS是一個分布式文件系統

理解了這一點,我們先來粗略回答本文已開始提出的其中兩個問題:

3. HBase中的數據為何不直接存放于HDFS之上?

HBase中存儲的海量數據記錄,通常在幾百Bytes到KB級別,如果將這些數據直接存儲于HDFS之上,會導致大量的小文件產生,為HDFS的元數據管理節點(NameNode)帶來沉重的壓力。

4. 文件能否直接存儲于HBase里面?

如果是幾MB的文件,其實也可以直接存儲于HBase里面,我們暫且將這類文件稱之為小文件,HBase提供了一個名為MOB的特性來應對這類小文件的存儲。但如果是更大的文件,強烈不建議用HBase來存儲,關于這里更多的原因,希望你在詳細讀完本系列文章所有內容之后能夠自己解答。



集群角色

關于集群環境,你可以使用國內外大數據廠商的平臺,如Cloudera,Hontonworks以及國內的華為,都發行了自己的企業版大數據平臺,另外,華為云、阿里云中也均推出了全托管式的HBase服務。

我們假設集群環境已經Ready了,先來看一下集群中的關鍵角色

相信大部分人對這些角色都已經有了一定程度的了解,我們快速的介紹一下各個角色在集群中的主要職責:

ZooKeeper

在一個擁有多個節點的分布式系統中,假設,只能有一個節點是主節點,如何快速的選舉出一個主節點而且讓所有的節點都認可這個主節點?這就是HBase集群中存在的一個最基礎命題。

利用ZooKeeper就可以非常簡單的實現這類"仲裁"需求,ZooKeeper還提供了基礎的事件通知機制,所有的數據都以 ZNode的形式存在,它也稱得上是一個"微型數據庫"。

NameNode

HDFS作為一個分布式文件系統,自然需要文件目錄樹的元數據信息,另外,在HDFS中每一個文件都是按照Block存儲的,文件與Block的關聯也通過元數據信息來描述。NameNode提供了這些元數據信息的存儲。

DataNode

HDFS的數據存放節點。

RegionServer

HBase的數據服務節點。

Master

HBase的管理節點,通常在一個集群中設置一個主Master,一個備Master,主備角色的"仲裁"由ZooKeeper實現。 Master主要職責:

①負責管理所有的RegionServer。

②建表/修改表/刪除表等DDL操作請求的服務端執行主體。

③管理所有的數據分片(Region)到RegionServer的分配。

④如果一個RegionServer宕機或進程故障,由Master負責將它原來所負責的Regions轉移到其它的RegionServer上繼續提供服務。

⑤Master自身也可以作為一個RegionServer提供服務,該能力是可配置的。

集群部署建議

如果基于物理機/虛擬機部署,通常建議:

1. RegionServer與DataNode聯合部署,RegionServer與DataNode按1:1比例設置。

這種部署的優勢在于,RegionServer中的數據文件可以存儲一個副本于本機的DataNode節點中,從而在讀取時可以利用HDFS中的"短路徑讀取(Short Circuit)"來繞過網絡請求,降低讀取時延。

2. 管理節點獨立于數據節點部署

如果是基于物理機部署,每一臺物理機節點上可以設置幾個RegionServers/DataNodes來提升資源使用率。

也可以選擇基于容器來部署,如在HBaseCon Asia 2017大會知乎的演講主題中,就提到了知乎基于Kubernetes部署HBase服務的實踐。

對于公有云HBase服務而言,為了降低總體擁有成本(TCO),通常選擇"計算與存儲物理分離"的方式,從架構上來說,可能導致平均時延略有下降,但可以借助于共享存儲底層的IO優化來做一些"彌補"。

HBase集群中的RegionServers可以按邏輯劃分為多個Groups,一個表可以與一個指定的Group綁定,可以將RegionServer Group理解成將一個大的集群劃分成了多個邏輯子集群,借此可以實現多租戶間的隔離,這就是HBase中的RegionServer Group特性。

示例數據

以我們日常生活都熟悉的手機通話記錄的存儲為例,先簡單給出示例數據的字段定義:

如上定義與電信領域的通話記錄字段定義相去甚遠,本文力求簡潔,僅給出了最簡單的示例。如下是"虛構"的樣例數據:

在本文大部分內容中所涉及的一條數據,是上面加粗的最后一行"MSISDN1"為"13400006666"這行記錄。

在本系列文章的流程圖中,我們將會使用一個紅色的五角星來表示該數據所在的位置。

寫數據之前:創建連接


Login

在啟用了安全特性的前提下,Login階段是為了完成用戶認證(確定用戶的合法身份),這是后續一切安全訪問控制的基礎。

當前Hadoop/HBase僅支持基于Kerberos的用戶認證,ZooKeeper除了Kerberos認證,還能支持簡單的用戶名/密碼認證,但都基于靜態的配置,無法動態新增用戶。如果要支持其它第三方認證,需要對現有的安全框架做出比較大的改動。

創建Connection

Connection可以理解為一個HBase集群連接的抽象,建議使用ConnectionFactory提供的工具方法來創建。因為HBase當前提供了兩種連接模式:同步連接,異步連接,這兩種連接模式下所創建的Connection也是不同的。我們給出ConnectionFactory中關于獲取這兩種連接的典型方法定義:

Connection中主要維護著兩類共享的資源

線程池

Socket連接

這些資源都是在真正使用的時候才會被創建,因此,此時的連接還只是一個"虛擬連接"。

寫數據之前:創建數據表

DDL操作的抽象接口 - Admin

Admin定義了常規的DDL接口,列舉幾個典型的接口:

預設合理的數據分片 - Region

分片數量會給讀寫吞吐量帶來直接的影響,因此,建表時通常建議由用戶主動指定劃分Region分割點,來設定Region的數量。

HBase中數據是按照RowKey的字典順序排列的,為了能夠劃分出合理的Region分割點,需要依據如下幾點信息:

1.Key的組成結構

2.Key的數據分布預估

如果不能基于Key的組成結構來預估數據分布的話,可能會導致數據在Region間的分布不均勻

3.讀寫并發度需求

依據讀寫并發度需求,設置合理的Region數量

為表定義合理的Schema

既然HBase號稱"schema-less"的數據存儲系統,那何來的是"schema "?的確,在數據庫范式的支持上,HBase非常弱,這里的"schema",主要指如下一些信息的設置:

1.?NameSpace設置

2. Column Family的數量

3. 每一個Column Family中所關聯的一些關鍵配置

① Compression

HBase當前可以支持Snappy,GZ,LZO,LZ4,Bzip2以及ZSTD壓縮算法

②?DataBlock Encoding

HBase針對自身的特殊數據模型所做的一種壓縮編碼

③?BloomFilter

可用來協助快速判斷一條記錄是否存在

④ TTL

指定數據的過期時間

⑤?StoragePolicy

指定Column Family的存儲策略,可選項有:"ALL_SSD","ONE_SSD","HOT","WARM","COLD","LAZY_PERSIST"

HBase中并不需要預先設置Column定義信息,這就是HBase schema less設計的核心。

Client發送建表請求到Master

建表的請求是通過RPC的方式由Client發送到Master:

? ? 1.RPC接口基于Protocol Buffer定義

? ? 2.建表相關的描述參數,也由Protocol Buffer進行定義及序列化

Client端側調用了Master服務的什么接口,參數是什么,這些信息都被通過RPC通信傳輸到Master側,Master再依據這些接口\參數描述信息決定要執行的操作。2.0版本中,HBase目前已經支持基于Netty的異步RPC框架

關于HBase RPC框架早期的HBase RPC框架,完全借鑒了Hadoop中的實現,那時,Netty項目尚不盛行。

Master側接收到Client側的建表請求以后,一些主要操作包括:

1. 生成每一個Region的描述信息對象HRegionInfo,這些描述信息包括:Region ID, Region名稱,Key范圍,表名稱等信息。

2. 生成每一個Region在HDFS中的文件目錄。

3. 將HRegionInfo信息寫入到記錄元數據的hbase:meta表中。

說明:

meta表位于名為"hbase"的namespace中,因此,它的全稱為"hbase:meta"。但在本系列文章范疇內,常將其縮寫為"meta"。

整個過程中,新表的狀態也是記錄在hbase:meta表中的,而不用再存儲在ZooKeeper中。

如果建表執行了一半,Master進程故障,如何處理?這里是由HBase自身提供的一個名為Procedure(V2)的框架來保障操作的事務性的,備Master接管服務以后,將會繼續完成整個建表操作。

一個被創建成功的表,還可以被執行如下操作:

1.Disable將所有的Region下線,該表暫停讀寫服務

2.Enable將一個Disable過的表重新Enable,也就是上線所有的Region來正常提供讀寫服務

3.Alter更改表或列族的描述信息

Master分配Regions


新創建的所有的Regions,通過AssignmentManager將這些Region按照輪詢(Round-Robin)的方式分配到每一個RegionServer中,具體的分配計劃是由LoadBalancer來提供的。

AssignmentManager負責所有Regions的分配/遷移操作,Master中有一個定時運行的線程,來檢查集群中的Regions在各個RegionServer之間的負載是否是均衡的,如果不均衡,則通過LoadBalancer生成相應的Region遷移計劃,HBase中支持多種負載均衡算法,有最簡單的僅考慮各RegionServer上的Regions數目的負載均衡算法,有基于遷移代價的負載均衡算法,也有數據本地化率優先的負載均衡算法,因為這一部分已經提供了插件化機制,用戶也可以自定義負載均衡算法。

總結


本文主要介紹了如下內容:

1. HBase項目概述,呈現了HBase社區的活躍度以及搜索引擎熱度等信息

2. HBase數據模型部分,講到了RowKey,稀疏矩陣,Region,Column Family,KeyValue等概念

3. 基于HBase的數據模型,介紹了HBase的適合場景(以實體/事件為中心的簡單結構的數據)

4. 介紹了HBase與HDFS的關系

5. 介紹了集群的關鍵角色:ZooKeeper, Master, RegionServer,NameNode, DataNode

6. 集群部署建議

7. 給出了一些示例數據

8. 寫數據之前的準備工作:建立集群連接,建表(建表時應該定義合理的Schema以及設置合理的Region數量),建表由Master處理,新創建的Regions由Region AssignmentManager負責分配到各個RegionServer。

下一篇文章將正式開始介紹寫數據的流程。

致謝


感謝Apache HBase PMC成員Ted Yu,李鈺,張鐸對本文中與2.0版本相關特性/流程描述內容方面的Review,感謝王瓊、向宏偉以及陳土炎等幾位同學給本文內容方面提出的寶貴意見。感謝畢美杰為本文提供的漂亮的封面圖片:)

原文出自:

https://mp.weixin.qq.com/s/CXsGcbbsKTMXotlwRFQ5xw

更多技術交流,可關注微信交流群,微信公眾號等:?

或參考文章:?HBase中文社區官網、交流群

1.? 微信群

添加小編微信好友,回復: HBase 加群

2. 釘釘群:

3. 微信公眾號:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容