Hbase 详细介绍以及简单的Hbase命令操作(入门必备)
Hbase
- 1、Hbase簡介
- (1)基礎介紹
- (2)Hbase特點
- 2、Hbase體系結構
- (1) Client
- (2)Master
- (3)HRegionServer
- (4)Zookeeper
- (6 )HBase存儲格式
- 3、Hbase和其他數據庫的區別
- 4、Hbase生態圈的技術
- 5、Hbase 邏輯架構
- 6、Hbase 的基礎命令
- (1)命名空間NAMESPACE
- (2)表 TABLE
- (3)簡單命令
1、Hbase簡介
(1)基礎介紹
HBase的原型是Google的BigTable論文,受到了該論文思想的啟發,目前作為Hadoop的子項目來開發維護,用于支持結構化的數據存儲。
HBase是Google Bigtable的開源實現,但是也有很多不同之處。比如:Google
Bigtable利用GFS作為其文件存儲系統,HBase利用Hadoop
HDFS作為其文件存儲系統;Google運行MAPREDUCE來處理Bigtable中的海量數據,HBase同樣利用Hadoop
MapReduce來處理HBase中的海量數據;Google
Bigtable利用Chubby作為協同服務,HBase利用Zookeeper作為對應。
(2)Hbase特點
海量存儲
- Hbase適合存儲PB級別的海量數據,在PB級別的數據以及采用廉價PC存儲的情況下,能在幾十到百毫秒內返回數據。這與Hbase的極易擴展性息息相關。正式因為Hbase良好的擴展性,才為海量數據的存儲提供了便利。
- 傳統關系型數據庫,單表不會超過五百萬,超過要做分表分庫,不會超過30列。
- Hbase單表可以有百億行、百萬列,數據矩陣橫向和縱向兩個維度所支持的數據量級都非常具有彈性
列式存儲
- 這里的列式存儲其實說的是列族存儲,Hbase是根據列族來存儲數據的。列族下面可以有非常多的列,列族在創建表的時候就必須指定。
- 面向列的存儲和權限控制,并支持獨立檢索,可以動態增加列,即,可單獨對列進行各方面的操作。
- 列式存儲,其數據在表中是按照某列存儲的,這樣在查詢只需要少數幾個字段的時候,能大大減少讀取的數量
極易擴展
- Hbase的擴展性主要體現在兩個方面,一個是基于上層處理能力(RegionServer)的擴展,一個是基于存儲的擴展(HDFS)。
- 通過橫向添加RegionSever的機器,進行水平擴展,提升Hbase上層的處理能力,提升Hbsae服務更多Region的能力。
- 備注:RegionServer的作用是管理region、承接業務的訪問,這個后面會詳細的介紹通過橫向添加Datanode的機器,進行存儲層擴容,提升Hbase的數據存儲能力和提升后端存儲的讀寫能力。
高并發
- 由于目前大部分使用Hbase的架構,都是采用的廉價PC,因此單個IO的延遲其實并不小,一般在幾十到上百ms之間。這里說的高并發,主要是在并發的情況下,Hbase的單個IO延遲下降并不多。能獲得高并發、低延遲的服務。
稀疏
- 稀疏主要是針對Hbase列的靈活性,在列族中,你可以指定任意多的列,在列數據為空的情況下,是不會占用存儲空間的。
- 為空的列并不占用存儲空間,表可以設計的非常稀疏。不必像關系型數據庫那樣需要預先知道所有列名然后再進行null填充
總結
- 面向列,容量大,寫入比mysql快但是讀取沒有,超過五百萬條數據的話建議讀寫用Hbase
2、Hbase體系結構
HBase的服務器體系結構遵從簡單的主從服務器架構,它由HRegion Server群和HBase Master服務器構成。
HBase Master負責管理所有的HRegion Server,而HBase中的所有RegionServer都是通過ZooKeeper來協調,并處理HBase服務器運行期間可能遇到的錯誤。
HBase Master Server本身并不存儲HBase中的任何數據,HBase邏輯上的表可能會被劃分成多個Region,然后存儲到HRegion Server群中。HBase Master Server中存儲的是從數據到HRegion Server的映射。因此HBase體系結構如下圖
(1) Client
- HBase Client 使用HBase的RPC機制與HMaster和HRegionServer進行通信:對于管理類操作,Client與HMaster進行RPC;對于數據讀寫類操作,Client與HRegionServer進行RPC;
(2)Master
- HBase Master 用于協調多個 Region Server,偵測各個 Region Server 之間的狀態,并平衡 Region Server 之間的負載。HBase Master 還有一個職責就是負責分配 Region 給 Region Server。HBase 允許多個 Master 節點共存,但是這需要 Zookeeper 的幫助。不過當多個 Master 節點共存時,只有一個 Master 是提供服務的,其他的 Master 節點處于待命的狀態。當正在工作的 Master 節點宕機時,其他的 Master 則會接管 HBase 的集群。
(3)HRegionServer
-
0.94之后的HRegionServer:圖片來自Map-R網站
-
0.94之前的HRegionServer
-
對于一個 Region Server 而言,其包括了多個 Region。Region Server 的作用只是管理表格,以及實現讀寫操作。Client 直接連接 Region Server,并通信獲取 HBase 中的數據。對于 Region 而言,則是真實存放 HBase 數據的地方,也就說 Region 是 HBase 可用性和分布式的基本單位。如果當一個表格很大,并由多個 CF 組成時,那么表的數據將存放在多個 Region 之間,并且在每個 Region 中會關聯多個存儲的單元(Store)。
-
HRegionServer內部管理了一系列HRegion對象,每個HRegion對應了Table中的一個Region,HRegion中由多個HStore組成。每個HStore對應了Table中的一個Column Family的存儲,可以看出每個Column Family其實就是一個集中的存儲單元,因此最好將具備共同IO特性的column放在一個Column Family中,這樣最高效。
-
HStore存儲是HBase存儲的核心了,其中由兩部分組成,一部分是MemStore,一部分是StoreFiles。MemStore是Sorted Memory Buffer,用戶寫入的數據首先會放入MemStore,當MemStore滿了以后會Flush成一個StoreFile(底層實現是HFile),當StoreFile文件數量增長到一定閾值,會觸發Compact合并操作,將多個StoreFiles合并成一個StoreFile,合并過程中會進行版本合并和數據刪除,因此可以看出HBase其實只有增加數據,所有的更新和刪除操作都是在后續的compact過程中進行的,這使得用戶的寫操作只要進入內存中就可以立即返回,保證了HBase I/O的高性能。當StoreFiles Compact后,會逐步形成越來越大的StoreFile,當單個StoreFile大小超過一定閾值后,會觸發Split操作,同時把當前Region Split成2個Region,父Region會下線,新Split出的2個孩子Region會被HMaster分配到相應的HRegionServer上,使得原先1個Region的壓力得以分流到2個Region上。下圖描述了Compaction和Split的過程
-
在理解了上述HStore的基本原理后,還必須了解一下HLog的功能,因為上述的HStore在系統正常工作的前提下是沒有問題的,但是在分布式系統環境中,無法避免系統出錯或者宕機,因此一旦HRegionServer意外退出,MemStore中的內存數據將會丟失,這就需要引入HLog了。每個HRegionServer中都有一個HLog對象,HLog是一個實現Write Ahead Log的類,在每次用戶操作寫入MemStore的同時,也會寫一份數據到HLog文件中(HLog文件格式見后續),HLog文件定期會滾動出新的,并刪除舊的文件(已持久化到StoreFile中的數據)。當HRegionServer意外終止后,HMaster會通過Zookeeper感知到,HMaster首先會處理遺留的 HLog文件,將其中不同Region的Log數據進行拆分,分別放到相應region的目錄下,然后再將失效的region重新分配,領取 到這些region的HRegionServer在Load Region的過程中,會發現有歷史HLog需要處理,因此會Replay HLog中的數據到MemStore中,然后flush到StoreFiles,完成數據恢復。
(4)Zookeeper
- 對于 HBase 而言,Zookeeper 的作用是至關重要的。首先 Zookeeper 是作為 HBase Master 的 HA 解決方案。也就是說,是 Zookeeper 保證了至少有一個 HBase Master 處于運行狀態。并且 Zookeeper 負責 Region 和 Region Server 的注冊。其實 Zookeeper 發展到目前為止,已經成為了分布式大數據框架中容錯性的標準框架。不光是 HBase,幾乎所有的分布式大數據相關的開源框架,都依賴于 Zookeeper 實現 HA。
(6 )HBase存儲格式
HBase中的所有數據文件都存儲在Hadoop HDFS文件系統上,主要包括上述提出的兩種文件類型:
1.HFile, HBase中KeyValue數據的存儲格式,HFile是Hadoop的二進制格式文件,實際上StoreFile就是對HFile做了輕量級包裝,即StoreFile底層就是HFile2.HLog File,HBase中WAL(Write Ahead Log) 的存儲格式,物理上是Hadoop的Sequence File在分布式系統環境中,無法避免系統出錯或者宕機,因此一旦HRegionServer意外退出,MemStore中的內存數據將會丟失,這就需要引入HLog了。每個HRegionServer中都有一個HLog對象,HLog是一個實現Write Ahead Log的類,在每次用戶操作寫入MemStore的同時,也會寫一份數據到HLog文件中(HLog文件格式見后續),HLog文件定期會滾動出新的,并刪除舊的文件(已持久化到StoreFile中的數據)。當HRegionServer意外終止后,HMaster會通過Zookeeper感知到,HMaster首先會處理遺留的 HLog文件,將其中不同Region的Log數據進行拆分,分別放到相應region的目錄下,然后再將失效的region重新分配,領取 到這些region的HRegionServer在Load Region的過程中,會發現有歷史HLog需要處理,因此會Replay HLog中的數據到MemStore中,然后flush到StoreFiles,完成數據恢復。
HFile
下圖是HFile的存儲格式:
首先HFile文件是不定長的,長度固定的只有其中的兩塊:Trailer和FileInfo。正如圖中所示的,Trailer中有指針指向其他數據塊的起始點。File Info中記錄了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等。Data Index和Meta Index塊記錄了每個Data塊和Meta塊的起始點。
Data Block是HBase I/O的基本單元,為了提高效率,HRegionServer中有基于LRU的Block Cache機制。每個Data塊的大小可以在創建一個Table的時候通過參數指定,大號的Block有利于順序Scan,小號Block利于隨機查詢。每個Data塊除了開頭的Magic以外就是一個個KeyValue對拼接而成, Magic內容就是一些隨機數字,目的是防止數據損壞。后面會詳細介紹每個KeyValue對的內部構造。
HFile
HFile里面的每個KeyValue對就是一個簡單的byte數組。但是這個byte數組里面包含了很多項,并且有固定的結構。我們來看看里面的具體結構:
開始是兩個固定長度的數值,分別表示Key的長度和Value的長度。緊接著是Key,開始是固定長度的數值,表示RowKey的長度,緊接著是RowKey,然后是固定長度的數值,表示Family的長度,然后是Family,接著是Qualifier,然后是兩個固定長度的數值,表示Time Stamp和Key Type(Put/Delete)。Value部分沒有這么復雜的結構,就是純粹的二進制數據了。
HLogFile
上圖中示意了HLog文件的結構,其實HLog文件就是一個普通的Hadoop Sequence File,Sequence File 的Key是HLogKey對象,HLogKey中記錄了寫入數據的歸屬信息,除了table和region名字外,同時還包括 sequence number和timestamp,timestamp是“寫入時間”,sequence number的起始值為0,或者是最近一次存入文件系統中sequence number。HLog Sequece File的Value是HBase的KeyValue對象,即對應HFile中的KeyValue,可參見上文描述。
3、Hbase和其他數據庫的區別
| 存儲格式 | 文檔、鍵值對、圖結構 | 表格式,行和列 |
| 存儲規范 | 鼓勵冗余 | 規范性,避免重復 |
| 存儲擴展 | 橫向擴展,分布式 | 縱向擴展(橫向擴展有限) |
| 查詢方式 | 結構化查詢語言SQL | 非結構化查詢 |
| 事務 | 不支持事務一致性 | 支持事務 |
| 性能 | 讀寫性能高 | 讀寫性能差 |
| 成本 | 簡單易部署,開源,成本低 | 成本高 |
4、Hbase生態圈的技術
Lily – 基于HBase的CRM
OpenTSDB – HBase面向時間序列數據管理
Kylin – HBase上的OLAP
Phoenix – SQL操作HBase工具
Splice Machine – 基于HBase的OLTP
Apache Tephra – HBase事務支持
TiDB – 分布式SQL DB
Apache Omid - 優化事務管理
Yarn application timeline server v.2 遷移到HBase
Hive metadata存儲可以遷移到HBase
Ambari Metrics Server將使用HBase做數據存儲
5、Hbase 邏輯架構
RowKey : 主鍵(最大64kb,實際使用10~100bytes)
-
數據根據RowKey排序
-
HRegion大小達到一定值時,裂變
-
HBase Table中的行的三種方式:
1.通過單個 RowKey 訪問 get 'TAB_NAME','COL_FAMILY_NAME'2.通過 RowKey 的 range(正則) 3.全表掃描 scan 'TAB_NAME'
ColumnFamily
- 列族在在物理存儲上對應于 HDFS 上的一個目錄。
- HBase 表中的每個列,都歸屬于某個列族。
- 列族是表的 schema 的一部分(而列不是),必須在使用表之前定義。
- 列名都以列族作為前綴。例如 courses:history,courses:math 都屬于 courses 這個列族。
- 每一個列族對應一個 Store,也對應 HDFS 一個目錄,類似于 Hive 分區操作一樣,HBase相當于按列族進行了分區
Cell
- 由{RowKey, ColumnFamily, Version} 唯一確定的單元
- 類似于excel的一個單元格,數據以字節存儲,沒有類型
Time Stamp
- rowkey -> ColumnFamily:Column 確定cell
- 每個Cell中保存著一份數據的多個版本:以由精確到毫秒的64位整數存儲,可以由HBase寫入是自動生成或用戶指定
- 若用戶指定為避免版本沖突,一定要用單Cell中不重復的時間戳
- 單元格中的數據以時間戳倒序排序
- 為避免Cell數據過大,HBase提供兩種機制:保留最新的N條數據,或保留截止當下多長時間的數據
6、Hbase 的基礎命令
| 命令類別 | 命令 |
| General | version,status,whoami,help |
| DDL | alter,create, describe, disable,drop, enable, exists, is_disabled, is_enabled, list |
| DML | count,delete,deleteall,get,get_counter, incr,put,scan,truncate |
| Tools | assign,balance_switch,balancer,close_region,compact,flush,major_compact,move,split,unassign,zk_dump |
| Replication | add_peer,disable_peer,enable_peer,remove_peer,start_replication,stop_replication |
(1)命名空間NAMESPACE
- list_namespace
- create_namespace ‘NS_NAME’
- describe_namespace ‘NS_NAME’
- 兩個特殊命名空間
- 1、hbase => 存hbase內部表
- 2、default => 沒有指定命令空間的表,默認存在該default下
(2)表 TABLE
- list
- ist_namespace_tables ‘NS’
- create
- 完整方式:create ‘NS:表名’,{NAME=>‘列族1名’,VERSION=‘版本號’,TTL=‘超時時間’,BLOCKCACHE=‘是否緩存’},{…}…
- VERSION: 版本號:默認最小版本號:0
- TTL: 超時設定:默認值FOREVER
- BLOCKCACHE: 設定列族是否緩存:默認為true
- 簡易方式:create ‘[NS:]表名’,‘列族1名’,‘列族2名’…
- 完整方式:create ‘NS:表名’,{NAME=>‘列族1名’,VERSION=‘版本號’,TTL=‘超時時間’,BLOCKCACHE=‘是否緩存’},{…}…
- hp.enable
- hp.disable
- hp.drop 禁用后才可以刪除
(3)簡單命令
create 'kb08:handphone',{NAME=>'base',VERSION=>'0'},{NAME=>'price'} desc 'kb08:handphone' exists 'kb08:handphone' is_disabled 'kb08:handphone'put 'kb08:handphone','huawei','base:seriesNo','nova4' put 'kb08:handphone','huawei','base:cpu','4c8t' put 'kb08:handphone','huawei','base:resolution','1024*768'### SELECT ####hp = get_table 'kb08:handphone'hp.scanhp.get 'huawei'[,'base:cpu']### UPDATE ####hp.put 'huawei','base:cpu','8c16t'#### DELETE ####hp.delete 'iphone','price:retailPrice'hp.deleteall 'iphone'truncate 'kb08:handphone'參考
https://www.cnblogs.com/ggjucheng/p/3380169.html
https://my.oschina.net/u/189445/blog/596325
https://developer.ibm.com/zh/technologies/analytics/articles/ba-cn-bigdata-hbase/
總結
以上是生活随笔為你收集整理的Hbase 详细介绍以及简单的Hbase命令操作(入门必备)的全部內容,希望文章能夠幫你解決所遇到的問題。