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