HBase 简介
HBase 是一個通過大量廉價機器解決海量數據的調整存儲和讀取的分布式數據庫解決方案
HBase 的特點:
- 高并發,易擴展,解決海量數據集的隨機實時增刪改查
- HBase 本質依然是 Key-Value 數據庫,不支持 join 等復雜操作
- 不支持復雜的事務,只支持行級的事務
- HBase 中支持的數據類型:byte[] (底層所有數據的存儲都是字節數組)
- 主要用來存儲結構化和半結構化的松散數據
HBase 中表的特點:
- 大:一個表可以有上十億行,上百萬列
- 面向列:列可以靈活指定,面向列(族)的存儲和權限控制,列(族)獨立檢索
- 稀疏:對于為空(null)的列,并不占用存儲空間,因此,表可以設計的非常稀疏
- 無嚴格模式:每行都有一個可排序的主鍵和任意多的列,列可以根據需要動態的增加,同一張表中不同的行可以有截然不同的列
1. HBase 的表結構
HBase 的本質是 Key-Value 數據庫,Key 是行鍵 RowKey,value 是所有真實 key-value 的集合。
HBase 可以抽象成為一張四維表格,四維分別是:行鍵(RowKey)、列簇(Column Family)、列(Column)、時間戳(TimeStamp)。其中,一張 HBase 的所有列劃分為若干個列簇(Column Family),即一個列簇包含一個或多個列。
1.1 行鍵(RowKey)
與 NoSQL 數據庫一樣,RowKey 是用來檢索記錄的主鍵。訪問 HBase Table 中的行,有如下三種方式:
RowKey 可以是任意字符串(最大長度是 64KB,實際應用中一般為 10-100bytes),最好是 16bytes。在 HBase 內部,RowKey 保存為字節數組。HBase 會對表中的數據按照 RowKey 排序(字典排序)
在進行數據存儲時要將經常一起讀取的數據存放在一起(通過 RowKey 的字典排序的特性實現)
Note:行的一次讀寫是原子操作(無論一次讀寫多少列)
1.2 列簇(Column)
HBase 表中的每個列,都歸屬于某個列簇。Column Family 是表 Schema 中的一部分(Column 不是),必須在創建表的時候指定。指定好了列簇就不能更改。列簇可以增加或者刪除,刪除的時候會刪除這個列簇中的所有數據。
列名都是心列簇作為前綴,例如:courses:History, courses:Math 都屬于 courses 這個列簇。訪問控制、磁盤和內存的使用統計都是在列簇層面進行的。
列簇越多,在讀取一行的數據時所要參與 IO、搜尋的文件就越多,所以,如無必要,不要設置太多的列簇,官網推薦是小于等于 3(最好就是一個列簇)
1.3 時間戳(TimeStamp)
HBase 中通過 RowKey 和 Column 確定的為一個存儲單元,稱為 Cell。每個 Cell 都保存著同一份數據的多個版本。版本通過時間戳來索引。
時間戳的類型是 64 位整型,時間戳可以由 HBase (在數據寫入時自動)賦值,此時,時間戳是精確到毫秒的當前系統時間。時間戳也可以由客戶顯式賦值。
如果應用程序要避免數據版本沖突,就必須自己生成具有唯一性的時間戳。每個 Cell 中,不同版本的數據按照時間倒序排序,即最新的數據排在最前面。HBase 在查詢的時候,默認返回最新版本/最近的數據。如果需要讀取舊版本的數據,可以指定時間戳。
為避免數據存在過多版本造成的管理(包括存儲和索引)負擔,HBase 提供了兩種數據版本回收方式:
保存數據的最新 n 個版本
保存最近一段時間內的所有版本(設置數據的生命周期 TTL–>Time To Live)
用戶可以針對每個列簇進行設置
1.4 單元格(Cell)
由 {RowKey, Column(= + ), Version} 唯一確定的單元。
Cell 中的數據是沒有類型的,全部都是字節碼形式存儲。
2. HBase 的應用場景
-
半結構化或非結構化數據
對于數據結構字段不夠確定或雜亂無章很難按一個概念去進行抽取的數據適合用 HBase,而且 HBase 是面向列的,HBase 支持動態增加字段。 -
記錄非常稀疏
RDBMS 的行有多少列是固定的,為 null 的列浪費了存儲空間。而 HBase 為 null 的 Column 是不會被存儲的,這樣既節省了空間又提高了讀性能。 -
多版本數據
對于需要存儲變動歷史記錄的數據,使用 HBase 就再合適不過了。HBase 根據 RowKey 和 Column Key 定位到的 Value 可以有任意數量的版本值。 -
超大數據量的隨機、實時讀寫
當數據量越來越大,RDBMS 數據庫就撐不住了,此時就出現了讀寫分享策略,通過一個 Master 專門負責寫操作,多個 Slave 負責讀操作,服務器成 本倍增。隨著壓力增加,Master 撐不住了,這時就要分庫了,把關聯不大的數據分開部署,一些 join 查詢就不能用了,需要借助中間層。隨著數據量的進一步增加,一個表的記錄越來越大,查詢就變得很慢,于是又得分表,比如按 ID 取模分成多個表以減少單個表的記錄數。而采用 HBase 就簡單的多,只需要增加節點即可,HBase 會自動水平切分擴展,跟 Hadoop(HDFS) 的無縫集成保障了其數據可靠性和數據分析的高性能(MapReduce)。
3. HBase 集群結構
- Region:
是 HBase 將一個表中的所有數據按照 RowKey 的不同范圍進行切割的邏輯單元,每個 Region 負責一定范圍數據的讀寫訪問。Region 由 RegionServer 負責管理。HBase 中的 Region 的概念就和 HDFS 中的數據塊概念差不多,Region 是 HBase 表切分出來的一個 Block,數據塊是 HDFS 中的一個大文件切片出來的一個 Block。
HMaster: HBase 的主節點,負責整個集群的狀態感知、負載分配、負責用戶表的元數據(Schema)管理(可以配置多個用來實現 HA),HMaster 負載壓力相對于 HDFS 的 NameNode 會小很多。HBase 的 HMaster 其實就算是宕機一段時間也可以正常對外提供服務。 - RegionServer:
HBase 中真正負責管理 Region 的服務器,也就是負責為客戶端進行表數據讀寫的服務器。每一臺 RegionServer 會管理很多的 Region,一個 RegionServer 上面管理的所有 Region 并不屬于同一張表。負責 Region 的拆分,負責和底層的 HDFS 的存儲交互,負責 StoreFile 的合并。 - ZooKeeper:
整個 HBase 中的主從節點協調,元數據的入口,主節點之間的選舉,集群節點之間的上下線感知等都是通過 ZooKeeper 來實現。 - HDFS:
用來存儲 HBase 的系統文件,或者表的 Region 文件。 - Client:
Client 包含了訪問 HBase 的接口,另外 Client 還維護了對應的 Cache 來加速 HBase 的訪問,比如 Cache 的 .META 元數據。
4. HBase 和 Hive 的比較
-
相同點:
HBase 和 Hive 都是架構在 Hadoop 之上,用 HDFS 做底層的數據存儲,用 MapReduce 做數據計算。 -
不同點:
HBase 是為了彌補 Hadoop 對實時操作不足的缺陷
HBase 是物理表,提供了一張超大內存 Hash 表來存儲索引,方便查詢
HBase 是數據庫,需要索引訪問,則用 HBase,因為 HBase 是面向列的 NoSQL數據庫
HBase 表插入數據時,會和 RDBMS 一樣做 Schema 校驗,所以屬于寫模式系統
HBase 支持單行記錄的 CRUD,并且是實時處理,效率比 Hive 高得多
總結
- 上一篇: ul 原点显示_web前端开发学习教程,
- 下一篇: 套接字有哪些类型?socket有哪些类型