hbase如何根據列查詢「hbase查詢命令及使用方法」

1.1 什麼是HBase

HBASE是一個高可靠性、高性能、面向列、可伸縮的分散式存儲系統,利用HBASE技術可在廉價PC Server上搭建起大規模結構化存儲集群。

HBASE的目標是存儲並處理大型的數據,更具體來說是僅需使用普通的硬體配置,就能夠處理由成千上萬的行和列所組成的大型數據。

HBASE是Google Bigtable的開源實現,但是也有很多不同之處。比如:Google Bigtable使用GFS作為其文件存儲系統,HBASE利用Hadoop HDFS作為其文件存儲系統;Google運行MAPREDUCE來處理Bigtable中的海量數據,HBASE同樣利用Hadoop MapReduce來處理HBASE中的海量數據;Google Bigtable利用Chubby作為協同服務,HBASE利用Zookeeper作為協同服務。

1.2 與傳統資料庫的對比

1、傳統資料庫遇到的問題:

1)數據量很大的時候無法存儲;

2)沒有很好的備份機制;

3)數據達到一定數量開始緩慢,很大的話基本無法支撐;

2、HBASE優勢:

1)線性擴展,隨著數據量增多可以通過節點擴展進行支撐;

2)數據存儲在hdfs上,備份機制健全;

3)通過zookeeper協調查找數據,訪問速度快。

1.3 HBase集群中的角色

1、一個或者多個主節點,Hmaster;

2、多個從節點,HregionServer;

3、HBase依賴項,zookeeper;

2. HBase數據模型

HBase基本概念與基本使用

2.1 HBase的存儲機制

HBase是一個面向列的資料庫,在表中它由行排序。表模式定義只能列族,也就是鍵值對。一個表有多個列族以及每一個列族可以有任意數量的列。後續列的值連續存儲在磁碟上。表中的每個單元格值都具有時間戳。總之,在一個HBase:

  • 表是行的集合。
  • 行是列族的集合。
  • 列族是列的集合。
  • 列是鍵值對的集合。

這裡的列式存儲或者說面向列,其實說的是列族存儲,HBase是根據列族來存儲數據的。列族下面可以有非常多的列,列族在創建表的時候就必須指定。

HBase 和 RDBMS的比較

HBase基本概念與基本使用

RDBMS的表:

HBase基本概念與基本使用

HBase的表:

HBase基本概念與基本使用

2.2 Row Key 行鍵

與nosql資料庫一樣,row key是用來表示唯一一行記錄的主鍵,HBase的數據時按照RowKey的字典順序進行全局排序的,所有的查詢都只能依賴於這一個排序維度。訪問HBASE table中的行,只有三種方式:

1. 通過單個row key訪問;

2. 通過row key的range(正則)

3. 全表掃描

Row key 行鍵(Row key)可以是任意字元串(最大長度是64KB,實際應用中長度一般為10-1000bytes),在HBASE內部,row key保存為位元組數組。存儲時,數據按照Row key的字典序(byte order)排序存儲。設計key時,要充分排序存儲這個特性,將經常一起讀取的行存儲放到一起。(位置相關性)

2.3 Columns Family 列族

列簇:HBASE表中的每個列,都歸屬於某個列族。列族是表的schema的一部分(而列不是),必須在使用表之前定義。列名都以列族作為前綴。例如courses:history,courses:math 都屬於courses這個列族。

2.4 Cell

由{row key,columnFamily,version} 唯一確定的單元。cell中的數據是沒有類型的,全部是位元組碼形式存儲。

關鍵字:無類型、位元組碼

2.5 Time Stamp 時間戳

HBASE中通過rowkey和columns確定的為一個存儲單元稱為cell。每個cell都保存著同一份數據的多個版本。版本通過時間戳來索引。時間戳的類型是64位整型。時間戳可以由HBASE(在數據寫入時自動)賦值,此時時間戳是精確到毫秒的當前系統時間。時間戳也可以由客戶顯示賦值。如果應用程序要避免數據版本衝突,就必須自己生成具有唯一性的時間戳。每個cell中,不同版本的數據按照時間倒序排序,即最新的數據排在最前面。

為了避免數據存在過多版本造成的管理(包括存儲和索引)負擔,HBASE提供了兩種數據版本回收方式。一是保存數據的最後n個版本,而是保存最近一段時間內的版本(比如最近7天)。用戶可以針對每個列族進行設置。

3. HBase原理

HBase系統架構體系圖

HBase基本概念與基本使用

組成部件說明:

Client:

使用HBase RPC機制與HMaster和HRegionServer進行通信

Client與HMaster進行管理類操作

Client與HRegionServer進行數據讀寫類操作

Zookeeper:

Zookeeper Quorum存儲-ROOT-表地址、HMaster地址

HRegionServer把自己以Ephedral方式註冊到Zookeeper中,HMaster隨時感知各個HRegionServer的健康狀況

Zookeeper避免HMaster單點問題

Zookeeper的主要作用:客戶端首先聯繫ZooKeeper子集群(quorum)(一個由ZooKeeper節點組成的單獨集群)查找行健。上述過程是通過ZooKeeper獲取含有-ROOT-的region伺服器名(主機名)來完成的。通過含有-ROOT-的region伺服器可以查詢到含有.META.表中對應的region伺服器名,其中包含請求的行健信息。這兩處的主要內容都被緩存下來了,並且都只查詢一次。最終,通過查詢.META伺服器來獲取客戶端查詢的行健數據所在region的伺服器名。一旦知道了數據的實際位置,即region的位置,HBase會緩存這次查詢的信息,同時直接聯繫管理實際數據的HRegionServer。所以,之後客戶端可以通過緩存信息很好地定位所需的數據位置,而不用再次查找.META.表。

HMaster:

HMaster沒有單點問題,HBase可以啟動多個HMaster,通過Zookeeper的Master Election機制保證總有一個Master在運行

主要負責Table和Region的管理工作:

1. 管理用戶對錶的增刪改查操作

2. 管理HRegionServer的負載均衡,調整Region分布

3. Region Split後,負責新Region的分布

4. 在HRegionServer停機後,負責失效HRegionServer上Region遷移

HRegionServer:

HBase中最核心的模塊,主要負責響應用戶I/O請求,向HDFS文件系統中讀寫

HBase基本概念與基本使用
HBase基本概念與基本使用

HRegionServer管理一系列HRegion對象;

每個HRegion對應Table中一個Region,HRegion由多個HStore組成;

每個HStore對應Table中一個Column Family的存儲;

Column Family就是一個集中的存儲單元,故將具有相同IO特性的Column放在一個Column Family會更高效。

可以看到,client訪問hbase上的數據並不需要master參與(定址訪問zookeeper和region server,數據讀寫訪問region server),master僅僅維護table和region的元數據信息(table的元數據信息保存在zookeeper上),負載很低。HRegionServer存取一個子表時,會創建一個HRegion對象,然後對錶的每個列族創建一個Store實例,每個Store都會有一個MemStore和0個或多個StoreFile與之對應,每個StoreFile都會對應一個HFile,HFile就是實際的存儲文件。因此,一個HRegion(表)有多少個列族就有多少個Store。一個HRegionServer會有多個HRegion和一個HLog。

HRegion:

table在行的方向上分隔為多個Region。Region是HBase中分散式存儲和負載均衡的最小單元,即不同的region可以分別在不同的Region Server上,但同一個Region是不會拆分到多個server上。

Region按大小分隔,每個表一般是只有一個region。隨著數據不斷插入表,region不斷增大,當region的某個列族達到一個閥值(默認256M)時就會分成兩個新的region。

每個region由以下信息標識:

  1. <表名,startRowKey,創建時間>
  2. 由目錄表(-ROOT-和.META.)記錄該region的endRowKey

HRegion定位:Region被分配給哪個RegionServer是完全動態的,所以需要機制來定位Region具體在哪個region server。

HBase使用三層結構來定位region:

  1. 通過zookeeper里的文件/hbase/rs得到-ROOT-表的位置。-ROOT-表只有一個region。
  2. 通過-ROOT-表查找.META.表的第一個表中相應的region的位置。其實-ROOT-表是.META.表的第一個region;.META.表中的每一個region在-ROOT-表中都是一行記錄。
  3. 通過.META.表找到所要的用戶表region的位置。用戶表中的每個region在.META表中都是一行記錄。

注意:

-ROOT-表永遠不會被分隔為多個region,保證了最多需要三次跳轉,就能定位到任意的region。client會將查詢的位置信息緩存起來,緩存不會主動失效,因此如果client上的緩存全部失效,則需要進行6次網路來回,才能定位到正確的region,其中三次用來發現緩存失效,另外三次用來獲取位置信息。

table和region的關係

table默認最初只有一個region,隨著記錄數的不斷增加而變大,起初的region會逐漸分裂成多個region,一個region有【startKey, endKey】表示,不同的region會被master分配給相應的regionserver管理。

region是hbase分散式存儲和負載均衡的最小單元,不同的region分不到不同的regionServer。

注意:region雖然是分散式存儲的最小單元,但並不是存儲的最小單元。region是由一個或者多個store組成的,每個store就是一個column family。每個store又由memStore和1至多個store file 組成(memstore到一個閥值會刷新,寫入到storefile,有hlog來保證數據的安全性,一個regionServer有且只有一個hlog)

HStore:

HBase存儲的核心。由MemStore和StoreFile組成。MemStore是Stored Memory Buffer。

HLog:

引入HLog原因:在分散式系統環境中,無法避免系統出錯或者宕機,一旦HRegionServer意外退出,MemStore中的內存數據就會丟失,引入HLog就是防止這種情況。

工作機制:

每個HRegionServer中都會有一個HLog對象,HLog是一個實現Write Ahead Log的類,每次用戶操作寫入MemStore的同時,也會寫一份數據到HLog文件,HLog文件定期會滾動出新,並刪除舊的文件(已持久化到StoreFile中的數據)。當HRegionServer意外終止後,HMaster會通過Zookeeper感知,HMaster首先處理遺留的HLog文件,將不同region的log數據拆分,分別放到相應region目錄下,然後再將失效的region重新分配,領取到這些region的HRegionServer在Load Region的過程中,會發現有歷史HLog需要處理,因此會Replay HLog中的數據到MemStore中,然後flush到StoreFiles,完成數據恢復。

3.1 HBase的存儲格式

HBase中的所有數據文件都存儲在Hadoop HDFS文件系統上,格式主要有兩種:

1. HFile,HBase中Key-Value數據的存儲格式,HFile是Hadoop的二進位格式文件,實際上StoreFile就是對HFile做了輕量級包裝,即StoreFile底層就是HFile。

2. HLog File,HBase中WAL(Write Ahead Log)的存儲格式,物理上是Hadoop的Sequence File

HFile

HBase基本概念與基本使用

圖片解釋:

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內容就是一些隨機數字,目的是防止數據損壞

HFile裡面的每個KeyValue對就是一個簡單的byte數組。這個byte數組裡面包含了很多項,並且有固定的結構。

HBase基本概念與基本使用

KeyLength和ValueLength:兩個固定的長度,分別代表Key和Value的長度

Key部分:Row Length是固定長度的數值,表示RowKey的長度,Row 就是RowKey

Column Family Length是固定長度的數值,表示Family的長度

接著就是Column Family,再接著是Qualifier,然後是兩個固定長度的數值,表示Time Stamp和Key Type(Put/Delete)

Value部分沒有這麼複雜的結構,就是純粹的二進位數據

HLog File

HBase基本概念與基本使用

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.2 寫流程

HBase基本概念與基本使用

1) Client通過Zookeeper的調度,向RegionServer發出寫數據請求,在Region中寫數據;

2) 數據被寫入Region的MemStore,知道MemStore達到預設閥值(即MemStore滿);

3) MemStore中的數據被Flush成一個StoreFile;

4) 隨著StoreFile文件的不斷增多,當其數量增長到一定閥值後,觸發Compact合併操作,將多個StoreFile合併成一個StoreFile,同時進行版本合併和數據刪除;

5) StoreFiles通過不斷的Compact合併操作,逐步形成越來越大的StoreFile;

6) 單個StoreFile大小超過一定閥值後,觸發Split操作,把當前Region Split成2個新的Region。父Region會下線,新Split出的2個子Region會被HMaster分配到相應的RegionServer上,使得原先1個Region的壓力得以分流到2個Region上。

可以看出HBase只有增添數據,所有的更新和刪除操作都是在後續的Compact歷程中舉行的,使得用戶的寫操作只要進入內存就可以立刻返回,實現了HBase I/O的高性能。

3.3 讀流程

1) Client訪問Zookeeper,查找-ROOT-表,獲取.META.表信息;

2) 從.META.表查找,獲取存放目標數據的Region信息,從而找到對應的RegionServer;

3) 通過RegionServer獲取需要查找的數據;

4) RegionServer的內存分為MemStore和BlockCache兩部分,MemStore主要用於寫數據,BlockCache主要用於讀數據。讀請求先到MemStore中查數據,查不到就到BlockCache中查,再查不到就會到StoreFile上讀,並把讀的結果放入BlockCache。

定址過程:client—>Zookeeper—>ROOT表—>.META. 表—>RegionServer—>Region—>client

4. HBASE命令

4.1 命令的進退

1、hbase提供了一個shell的終端給用戶交互

hbase shell

HBase基本概念與基本使用

2、如果退出執行quit命令

HBase基本概念與基本使用

4.2 命令

名稱命令表達式查看hbase狀態status創建表create ‘表名’,’列族名1′,’列族名2′,’列族名N’查看所有表list描述表describe ‘表名’判斷表存在exists ‘表名’判斷是否禁用啟用表is_enabled ‘表名’

is_disabled ‘表名’

添加記錄put ‘表名’,’rowkey’,’列族:列’,’值’查看記錄rowkey下的所有數據get ‘表名’,’rowkey’查看所有記錄scan ‘表名’查看錶中的記錄總數count ‘表名’獲取某個列族get ‘表名’,’rowkey’,’列族:列’獲取某個列族的某個列get ‘表名’,’rowkey’,’列族:列’刪除記錄delete ‘表名’,’行名’,’列族:列’刪除整行deleteall ‘表名’,’rowkey’刪除一張表先要屏蔽該表,才能對該表進行刪除

第一步 disable ‘表名’,第二步 drop ‘表名’

清空表truncate ‘表名’查看某個表某個列中所有數據scan ‘表名’,{COLUMNS=>’列族名:列名’}更新記錄就是重新一遍,進行覆蓋,hbase沒有修改,都是追加

具體實例:

1、查看HBase運行狀態 status

HBase基本概念與基本使用

2、創建表 create <table>,{NAME => <family>, VERSIONS => <VERSIONS>}

創建一個User表,並且有一個info列族

HBase基本概念與基本使用

3、查看所有表 list

HBase基本概念與基本使用

4、描述表詳情 describe ‘User’

HBase基本概念與基本使用

5、判斷表是否存在 exists ‘User’

HBase基本概念與基本使用

6、啟用或禁用表 is_disabled ‘User’ is_enabled ‘User’

HBase基本概念與基本使用

7、添加記錄,即插入數據,語法:put <table>,<rowkey>,<family:column>,<value>

HBase基本概念與基本使用

8、根據rowKey查詢某個記錄,語法:get <table>,<rowkey>,[<family:column>, …]

HBase基本概念與基本使用

9、查詢所有記錄,語法:scan <table>,{COLUMNS => [family:column, …], LIMIT => num}

掃描所有記錄

HBase基本概念與基本使用

掃描前2條

HBase基本概念與基本使用

範圍查詢

HBase基本概念與基本使用

另外,還可以添加TIMERANGE和FILTER等高級功能,STARTROW、ENDROW必須大寫,否則報錯,查詢結果不包含等於ENDROW的結果集。

10、統計表記錄數,語法:count <table>, {INTERVAL => intervalNum,CACHE => cacheNum}

INTERVAL設置多少行顯示一次及對應的rowkey,默認1000;CACHE每次去取的緩存區大小,默認是10,調整該參數可提高查詢速度。

HBase基本概念與基本使用

11、刪除

刪除列

HBase基本概念與基本使用

刪除整行

HBase基本概念與基本使用

刪除表中所有數據

HBase基本概念與基本使用

12、禁用或啟用表

禁用表

HBase基本概念與基本使用

啟用表

HBase基本概念與基本使用

12、刪除表

刪除前,必須先disable

HBase基本概念與基本使用

【本篇文章】以及Github會持續更新……另外作者提供多年悉心整理的計算機各類專業視頻教學,如Kafka、Mysql、Tomcat、Docker、Spring、MyBatis、Nginx、Netty、Dubbo、Redis、Netty、Spring cloud、分散式、高並發、性能調優、微服務等,值得學習

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/281221.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-21 13:16
下一篇 2024-12-21 13:16

相關推薦

發表回復

登錄後才能評論