導航:首頁 > 程序命令 > hbase查詢命令

hbase查詢命令

發布時間:2022-11-14 14:22:09

1. HBase探索篇 _ 單節點多RegionServer部署與性能測試

[toc]

隨著集群中總的Region數持續增長,每個節點平均管理的Region數已達550左右,某些大表的寫入流量一上來,Region Server就會不堪重負,相繼掛掉。

在HBase中,Region的一個列族對應一個MemStore,通常一個MemStore的默認大小為128MB(我們設置的為256MB),見參數 hbase.hregion.memstore.flush.size 。當可用內存足夠時,每個MemStore可以分配128MB的空間。

當表的寫入流量上升時,假設每個Region的寫入壓力相同,則理論上每個MemStore會平均分配可用的內存空間。

因此,節點中Region過多時,每個MemStore分到的內存空間就會變小。此時,寫入很小的數據量,就會被強制flush到磁碟,進而導致頻繁刷寫,會對集群HBase與HDFS造成很大的壓力。

同時,Region過多導致的頻繁刷寫,又會在磁碟上產生非常多的HFile小文件,當小文件過多的時候,HBase為了優化查詢性能就會做Compaction操作,合並HFile,減少文件數量。當小文件一直很多的時候,就會出現 「壓縮風暴」。Compaction非常消耗系統的IO資源,還會降低數據的寫入速度,嚴重時會影響正常業務的進行。

關於每個Region Server節點中,Region數量大致合理的范圍,HBase官網上也給出了定義:

可見,通常情況下,每個節點擁有20-200個Region是比較正常的。

其實,每個Region Server的最大Region數量由總的MemStore內存大小決定。每個Region的每個列族會對應一個MemStore,假設HBase表都有一個列族,那麼每個Region只包含一個MemStore。一個MemStore大小通常在128~256MB,見參數: hbase.hregion.memstore.flush.size 。默認情況下,RegionServer會將自身堆內存的40%(我們線上60%)(見參數: hbase.regionserver.global.memstore.size )提供給節點上的所有MemStore使用,如果所有MemStore的總大小達到該配置大小,新的更新將會被阻塞並且會強制刷寫磁碟。因此,每個節點最理想的Region數量應該由以下公式計算(假設HBase表都有統一的列族配置):

((RS memory) * (total memstore fraction)) / ((memstore size)*(column families))

其中:

以我們線上集群的配置舉例,我們每個RegionServer的堆內存是32GB,那麼節點上最理想的Region數量應該是: 32768*0.6/256 ≈ 76 (32768*0.6/128 ≈ 153)

上述最理想的情況是假設每個Region上的填充率都一樣,包括數據寫入的頻次、寫入數據的大小,但實際上每個Region的負載各不相同,有的Region可能特別活躍、負載特別高,有的Region則比較空閑。所以,通常我們認為2 3倍的理想Region數量也是比較合理的,針對上面舉例來說,大概200 300個Region左右算是合理的。

針對上文所述的Region數過多的隱患,以下內容主要從兩方面考慮來優化。

提高內存的目的是為了增加每個Region擁有的MemStore的空間,避免其寫入壓力上升時,MemStore頻繁刷寫,形成小的HFile過多,引起壓縮風暴,佔用大量IO。

但其實RS的堆內存並不是越大越好,我們開始使用HBase的時候,對CMS和G1相關的參數,進行了大量壓測,測試指標數據表明,內存分配的越大,吞吐量和p99讀寫平均延時會有一定程度的變差(也有可能是我們的JVM相關參數,當時調配的不合理)。

在我們為集群集成jdk15,設置為ZGC之後,多次壓測並分析JVM日誌之後,得出結論,在犧牲一定吞吐量的基礎上,集群的GC表現能力確實提升的較為明顯,尤其是GC的平均停頓時間,99.9%能維持在10ms以下。

而且ZGC號稱管理上T的大內存,停頓時間控制在10ms之內(JDK16把GC停頓時間控制在1ms內,期待JDK17 LTS),STW時間不會因為堆的變大而變長。

因此理論上,增加RS堆內存之後,GC一樣不會成為瓶頸。

之所以考慮在單節點上部署多個Region Server的進程,是因為我們單個物理機的資源配置很高,內存充足(三百多G,RS堆內存只分了32G)、而HBase又是弱計算類型的服務,平時CPU的利用率低的可憐,網路方面亦未見瓶頸,唯一掉鏈子的也就屬磁碟了,未上SSD,IO延遲較為嚴重。

當然,也曾考慮過虛擬機的方案,但之前YCSB壓測的數據都不太理想;K8s的調研又是起步都不算,沒有技術積累。因此,簡單、直接、易操作的方案就是多RS部署了。

以下內容先敘述CDH中多RS進程部署的一些關鍵流程,後續將在多RS、單RS、單RS大堆環境中,對集群進行基準性能測試,並對比試驗數據,分析上述兩種優化方案的優劣。

我們使用的HBase版本是 2.1.0-cdh6.3.2 ,非商業版,未上Kerberos,CDH中HBase相關的jar包已替換為用JDK15編譯的jar。

多Region Server的部署比較簡單,最關鍵的是修改 hbase-site.xml 中region server的相關埠,避免埠沖突即可。可操作流程如下。

修改所需配置文件

hbase-site.xml 配置文件一定不要直接從 /etc/hbase/conf 中獲取,這里的配置文件是給客戶端用的。CDH管理的HBase,配置文件都是運行時載入的,所以,找到HBase最新啟動時創建的進程相關的目錄,即可獲取到服務端最新的配置文件,如:/var/run/cloudera-scm-agent/process/5347-hbase-REGIONSERVER。需要准備的目錄結構如下:

不需要HBase完整安裝包中的內容(在自編譯的完整安裝包中運行RS進程時,依賴沖突或其他莫名其妙的報錯會折磨的你抓狂),只需要bin、conf目錄即可,pids文件夾是自定義的,RS進程對應pid文件的輸出目錄,start_rs.sh、stop_rs.sh是自定義的RS進程的啟動和關閉腳本。

重點修改下圖標注的配置文件,

還有日誌文件名的一些輸出細節,可以按需在 bin/hbase-daemon.sh 中修改。

運行或關閉RS進程

中間有異常,請查看相關日誌輸出。

集群Region數瘋漲,當寫入存在壓力時,會導致RS節點異常退出。為了解決目前的這種窘境,本次優化主要從單節點多Region Server部署和提高單個Region Server節點的堆內存兩方面著手。

那這兩種優化方案對HBase的讀寫性能指標,又會產生什麼樣的影響呢?我們以YCSB基準測試的結果指標數據做為參考,大致評價下這兩種應急方案的優劣。

用於此次測試的HBase集群的配置

此次測試使用的數據集大小

測試方法

壓測時選擇的讀寫負載盡量模擬線上的讀寫場景,分別為:讀寫3/7、讀寫7/3、讀寫5/5;

壓測時唯一的變數條件是:多RS部署(32G堆,在每個節點上啟動3個RS進程,相當於集群中一共有15個RS節點)、單RS部署(32G小堆)和單RS部署(100G大堆),並盡可能保證其他實驗條件不變,每個YCSB的工作負載各自運行20分鍾左右,並且重復完整地運行5次,兩次運行之間沒有重新啟動,以測量YCSB的吞吐量等指標,收集的測試結果數據是5次運行中最後3次運行的平均值,為了避免第一輪和第二輪的偶然性,忽略了前兩次的測試。

YCSB壓測的命令是:

收集實驗數據後,大致得出不同讀寫負載場景下、各個實驗條件下的指標數據,如下圖。

上述的測試數據比較粗糙,但大致也能得出些結論,提供一定程度上的參考。

多RS進程部署的模式,起到了一定程度上的進程間資源隔離的作用,分擔了原先單台RS管理Region的壓力,最大化利用了物理機的資源,但多出來的一些Region Server,需要單獨的管理腳本和監控系統來維護,增加了維護成本。多個RS依賴同一台物理機,物理節點宕機便會影響多個RS進程,同時,某一個Region Server出現熱點,壓力過大,資源消耗過度,也許會引起同機其他進程的不良,在一定程度上,犧牲了穩定性和可靠性。

增加單個RS進程的堆內存,MemStore在一定程度上會被分配更充裕的內存空間,減小了flush的頻次,勢必會削弱寫入的壓力,但也可能會增加GC的負擔,我們或許需要調整出合適的GC參數,甚至需要調優HBase本身的一些核心參數,才能兼顧穩定和性能。然而,這就又是一件漫長而繁瑣的事情了,在此不過分探討。

面對性能瓶頸的出現,我們不能盲目地擴充機器,在應急方案採取之後,我們需要做一些額外的、大量的優化工作,這或許才是上上之策。

2. HBase中顯示表的指令是

  1. 進入hbase shell命令界面:hbase shell

2. 查看錶格:list

3. 查看所有命令:help

4. 創建表格(如果不記得命令格式 可以直接輸入create 系統會給出提示和示例):create 'test','f1','f2','f3'

創建了一個表名為test 有f1 f2 f3三個列族的表

5. 查看錶格結構信息:desc 'test'

3. 昭通java培訓學校告訴你Hbase知識點總結

hbase概念:

非結構化的分布式的面向列存儲非關系型的開源的資料庫,根據谷歌的三大論文之一的bigtable

高寬厚表

作用:

為了解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用難題。

能幹什麼:

存儲大量結果集數據,低延遲的隨機查詢。

sql:

結構化查詢語言

nosql:

非關系型資料庫,列存儲和文檔存儲(查詢低延遲),hbase是nosql的一個種類,其特點是列式存儲。

非關系型資料庫--列存儲(hbase)

非關系型資料庫--文檔存儲(MongoDB)

非關系型資料庫--內存式存儲(redis)

非關系型資料庫--圖形模型(graph)

hive和hbase區別?

Hive的定位是數據倉庫,雖然也有增刪改查,但其刪改查對應的是整張表而不是單行數據,查詢的延遲較高。其本質是更加方便的使用mr的威力來進行離線分析的一個數據分析工具。

HBase的定位是hadoop的資料庫,電腦培訓http://www.kmbdqn.cn/發現是一個典型的Nosql,所以HBase是用來在大量數據中進行低延遲的隨機查詢的。

hbase運行方式:

standalonedistrubited

單節點和偽分布式?

單節點:單獨的進程運行在同一台機器上

hbase應用場景:

存儲海量數據低延遲查詢數據

hbase表由多行組成

hbase行一行在hbase中由行健和一個或多個列的值組成,按行健字母順序排序的存儲。


4. HBase存儲架構

上圖是HBase的存儲架構圖。

由上圖可以知道,客戶端是通過Zookeeper找到HMaster,然後再與具體的Hregionserver進行溝通讀寫數據的。

具體到物理實現,細節包括以下這些:

首先要清楚HBase在hdfs中的存儲路徑,以及各個目錄的作用。在hbase-site.xml 文件中,配置項 <name> hbase.rootdir</name> 默認 「/hbase」,就是hbase在hdfs中的存儲根路徑。以下是hbase0.96版本的個路徑作用。1.0以後的版本請參考這里: https://blog.bcmeng.com/post/hbase-hdfs.html

1、 /hbase/.archive
HBase 在做 Split或者 compact 操作完成之後,會將 HFile 移到.archive 目錄中,然後將之前的 hfile 刪除掉,該目錄由 HMaster 上的一個定時任務定期去清理。

2、 /hbase/.corrupt
存儲HBase損壞的日誌文件,一般都是為空的。

3、 /hbase/.hbck
HBase 運維過程中偶爾會遇到元數據不一致的情況,這時候會用到提供的 hbck 工具去修復,修復過程中會使用該目錄作為臨時過度緩沖。

4、 /hbase/logs
HBase 是支持 WAL(Write Ahead Log) 的,HBase 會在第一次啟動之初會給每一台 RegionServer 在.log 下創建一個目錄,若客戶端如果開啟WAL 模式,會先將數據寫入一份到.log 下,當 RegionServer crash 或者目錄達到一定大小,會開啟 replay 模式,類似 MySQL 的 binlog。

5、 /hbase/oldlogs
當.logs 文件夾中的 HLog 沒用之後會 move 到.oldlogs 中,HMaster 會定期去清理。

6、 /hbase/.snapshot
hbase若開啟了 snapshot 功能之後,對某一個用戶表建立一個 snapshot 之後,snapshot 都存儲在該目錄下,如對表test 做了一個 名為sp_test 的snapshot,就會在/hbase/.snapshot/目錄下創建一個sp_test 文件夾,snapshot 之後的所有寫入都是記錄在這個 snapshot 之上。

7、 /hbase/.tmp
當對表做創建或者刪除操作的時候,會將表move 到該 tmp 目錄下,然後再去做處理操作。

8、 /hbase/hbase.id
它是一個文件,存儲集群唯一的 cluster id 號,是一個 uuid。

9、 /hbase/hbase.version
同樣也是一個文件,存儲集群的版本號,貌似是加密的,看不到,只能通過web-ui 才能正確顯示出來

10、 -ROOT-
該表是一張的HBase表,只是它存儲的是.META.表的信息。通過HFile文件的解析腳本 hbase org.apache.hadoop.hbase.io.hfile.HFile -e -p -f 可以查看其存儲的內容,如下所示:

以上可以看出,-ROOT-表記錄的.META.表的所在機器是dchbase2,與web界面看到的一致:

11、 .META.
通過以上表能找到.META.表的信息,該表也是一張hbase表,通過以上命令,解析其中一個region:

以上可以看出,adt_app_channel表的數據記錄在dchbase3這台reginserver上,也與界面一致,如果有多個region,則會在表名後面加上rowkey的范圍:

通過以上描述,只要找到-ROOT-表的信息,就能根據rowkey找到對應的數據,那-ROOT-在哪裡找呢?從本文一開始的圖中可以知道,就是在zookeeper中找的。進入zookeeper命令行界面:

可以看出-ROOT-表存儲在 dchbase3 機器中,對應界面如下:

以上就是HBase客戶端根據指定的rowkey從zookeeper開始找到對應的數據的過程。

那在Region下HBase是如何存儲數據的呢?

以下就具體操作一張表,查詢對應的HFile文件,看HBase的數據存儲過程。

在HBase創建一張表 test7,並插入一些數據,如下命令:

查看wal日誌,通過 hbase org.apache.hadoop.hbase.regionserver.wal.HLog --mp -p 命令可以解析HLog文件,內容如下:

查看HFile文件,內容如下:

由此可見,HFile文件就是存儲HBase的KV對,其中Key的各個欄位包含了的信息如下:

由於hbase把cf和column都存儲在HFile中,所以在設計的時候,這兩個欄位應該盡量短,以減少存儲空間。

但刪除一條記錄的時候,HBase會怎麼操作呢?執行以下命令:

刪除了rowkey為200的記錄,查看hdfs,原來的HFile並沒有改變,而是生成了一個新的HFile,內容如下:

所以在HBase中,刪除一條記錄並不是修改HFile裡面的內容,而是寫新的文件,待HBase做合並的時候,把這些文件合並成一個HFile,用時間比較新的文件覆蓋舊的文件。HBase這樣做的根本原因是,HDFS不支持修改文件。

5. hbase 命令如何查是否有rowkey為空的值

不要用這個,hbase查詢的時候可以設start和end。還有一個是可以根據offset查。用正規能搞死你,一定要提前設計好自己的key。否則數據海量的時候有你受的。

6. 如何獲取hbase數據查詢 語句

get命令和HTable類的get()方法用於從HBase表中讀取數據。使用 get 命令,可以同時獲取一行數據。它的語法如下:
get 』<table name>』,』row1』

下面的例子說明如何使用get命令。掃描emp表的第一行。
hbase(main):012:0> get 'emp', '1'

COLUMN CELL

personal : city timestamp=1417521848375, value=hyderabad

personal : name timestamp=1417521785385, value=ramu

professional: designation timestamp=1417521885277, value=manager

professional: salary timestamp=1417521903862, value=50000

4 row(s) in 0.0270 seconds

讀取指定列
下面給出的是語法,使用get方法讀取指定列。
hbase>get 'table name', 『rowid』, {COLUMN => 『column family:column name 』}

下面給出的示例,是用於讀取HBase表中的特定列。
hbase(main):015:0> get 'emp', 'row1', {COLUMN=>'personal:name'}

COLUMN CELL

personal:name timestamp=1418035791555, value=raju

7. 北大青鳥java培訓:Hbase知識點總結

hbase概念:非結構化的分布式的面向列存儲非關系型的開源的資料庫,根據谷歌的三大論文之一的bigtable高寬厚表作用:為了解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用難題。
能幹什麼:存儲大量結果集數據,低延遲的隨機查詢。
sql:結構化查詢語言nosql:非關系型資料庫,列存儲和文檔存儲(查詢低延遲),hbase是nosql的一個種類,其特點是列式存儲。
非關系型資料庫--列存儲(hbase)非關系型資料庫--文檔存儲(MongoDB)非關系型資料庫--內存式存儲(redis)非關系型資料庫--圖形模型(graph)hive和hbase區別?Hive的定位是數據倉庫,雖然也有增刪改查,但其刪改查對應的是整張表而不是單行數據,查詢的延遲較高。
其本質是更加方便的使用mr的威力來進行離線分析的一個數據分析工具。
HBase的定位是hadoop的資料庫,電腦培訓http://www.kmbdqn.cn/發現是一個典型的Nosql,所以HBase是用來在大量數據中進行低延遲的隨機查詢的。
hbase運行方式:standalonedistrubited單節點和偽分布式?單節點:單獨的進程運行在同一台機器上hbase應用場景:存儲海量數據低延遲查詢數據hbase表由多行組成hbase行一行在hbase中由行健和一個或多個列的值組成,按行健字母順序排序的存儲。

8. HBase條件查詢(多條件查詢)

轉 https://blog.csdn.net/PirateLeo/article/details/7956965

文中可能涉及到的API:

Hadoop/HDFS: http://hadoop.apache.org/common/docs/current/api/

HBase: http://hbase.apache.org/apidocs/index.html?overview-summary.html

Begin!

HBase的查詢實現只提供兩種方式:

1、按指定RowKey獲取唯一一條記錄,get方法(org.apache.hadoop.hbase.client.Get)

2、按指定的條件獲取一批記錄,scan方法(org.apache.hadoop.hbase.client.Scan)

實現條件查詢功能使用的就是scan方式,scan在使用時有以下幾點值得注意:

1、scan可以通過setCaching與setBatch方法提高速度(以空間換時間);

2、scan可以通過setStartRow與setEndRow來限定范圍。范圍越小,性能越高。

通過巧妙的RowKey設計使我們批量獲取記錄集合中的元素挨在一起(應該在同一個Region下),可以在遍歷結果時獲得很好的性能。

3、scan可以通過setFilter方法添加過濾器,這也是分頁、多條件查詢的基礎。

下面舉個形象的例子:

我們在表中存儲的是文件信息,每個文件有5個屬性:文件id(long,全局唯一)、創建時間(long)、文件名(String)、分類名(String)、所有者(User)。

我們可以輸入的查詢條件:文件創建時間區間(比如從20120901到20120914期間創建的文件),文件名(「中國好聲音」),分類(「綜藝」),所有者(「浙江衛視」)。

假設當前我們一共有如下文件:

內容列表
ID CreateTime Name Category UserID
1 20120902 中國好聲音第1期 綜藝 1
2 20120904 中國好聲音第2期 綜藝 1
3 20120906 中國好聲音外卡賽 綜藝 1
4 20120908 中國好聲音第3期 綜藝 1
5 20120910 中國好聲音第4期 綜藝 1
6 20120912 中國好聲音選手采訪 綜藝花絮 2
7 20120914 中國好聲音第5期 綜藝 1
8 20120916 中國好聲音錄制花絮 綜藝花絮 2
9 20120918 張瑋獨家專訪 花絮 3
10 20120920 加多寶涼茶廣告 綜藝廣告 4

這里UserID應該對應另一張User表,暫不列出。我們只需知道UserID的含義:

1代表 浙江衛視; 2代表 好聲音劇組; 3代表 XX微博; 4代表 贊助商。
調用查詢介面的時候將上述5個條件同時輸入find(20120901,20121001,"中國好聲音","綜藝","浙江衛視")。

此時我們應該得到記錄應該有第1、2、3、4、5、7條。第6條由於不屬於「浙江衛視」應該不被選中。

我們在設計RowKey時可以這樣做:採用UserID + CreateTime + FileID組成rowKey,這樣既能滿足多條件查詢,又能有很快的查詢速度。

需要注意以下幾點:

1、每條記錄的RowKey,每個欄位都需要填充到相同長度。假如預期我們最多有10萬量級的用戶,則userID應該統一填充至6位,如000001,000002...

2、結尾添加全局唯一的FileID的用意也是使每個文件對應的記錄全局唯一。避免當UserID與CreateTime相同時的兩個不同文件記錄相互覆蓋。

按照這種RowKey存儲上述文件記錄,在HBase表中是下面的結構:

rowKey(userID 6 + time 8 + fileID 6) name category ....

00000120120902000001

00000120120904000002

00000120120906000003

00000120120908000004

00000120120910000005

00000120120914000007

00000220120912000006

00000220120916000008

00000320120918000009

00000420120920000010

怎樣用這張表?

在建立一個scan對象後,我們setStartRow(00000120120901),setEndRow(00000120120914)。

這樣,scan時只掃描userID=1的數據,且時間范圍限定在這個指定的時間段內,滿足了按用戶以及按時間范圍對結果的篩選。並且由於記錄集中存儲,性能很好。

然後使用SingleColumnValueFilter(org.apache.hadoop.hbase.filter.SingleColumnValueFilter),共4個,分別約束name的上下限,與category的上下限。滿足按同時按文件名以及分類名的前綴匹配。

(注意:使用SingleColumnValueFilter會影響查詢性能,在真正處理海量數據時會消耗很大的資源,且需要較長的時間。

在後續的博文中我將多舉幾種應用場景下rowKey的,可以滿足簡單條件下海量數據瞬時返回的查詢功能)

如果需要分頁還可以再加一個PageFilter限制返回記錄的個數。

以上,我們完成了高性能的支持多條件查詢的HBase表結構設計。

9. hbase資料庫查詢命令有什麼

您好,對於你的遇到的問題,我很高興能為你提供幫助,我之前也遇到過喲,以下是我的個人看法,希望能幫助到你,若有錯誤,還望見諒!。展開全部

  1. select

  2. *

  3. from

  4. a

  5. where

  6. 列名

  7. <>0

  8. --<>標示不等於

  9. 2.--not

  10. in

  11. select

  12. *

  13. from

  14. a

  15. where

  16. 列名

  17. not

  18. in(0)

  19. --這樣是用索

  20. 不用。

  21. 3.--子

  22. where

  23. select

  24. *

  25. from

  26. a

  27. where

  28. a

  29. not

  30. in

  31. (select

  32. 列名from

  33. a

  34. where

  35. a

  36. ='1')非常感謝您的耐心觀看,如有幫助請採納,祝生活愉快!謝謝!

10. hbase模糊查詢

哈哈哈,恰好我也在做一個類似的問題;hbase權威指南133頁,關於rowkey有一個內建的過濾器:

Scan scan = new Scan();
Filter filter = new RowFilter(CompareOp.EQUAL,new RegexStringComparator(".*京Q00"));
scan.setFilter(filter);
ResultScanner scanner;
try {
scanner = table.getScanner(scan);
for(Result res:scanner)
{
System.out.println(res);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
上面這段代碼應該能夠解決你的問題啦,enjoy it.

閱讀全文

與hbase查詢命令相關的資料

熱點內容
bs刷裝備建立後文件夾沒有 瀏覽:77
找漫畫看應該下載什麼app 瀏覽:182
如何在vps上搭建自己的代理伺服器 瀏覽:744
nginxphp埠 瀏覽:403
內臟pdf 瀏覽:152
怎麼看雲伺服器架構 瀏覽:85
我的世界國際服為什麼登不進伺服器 瀏覽:996
微盟程序員老婆 瀏覽:930
intellij創建java 瀏覽:110
java連接odbc 瀏覽:38
啟動修復無法修復電腦命令提示符 瀏覽:359
手機編程是什麼 瀏覽:98
山東移動程序員 瀏覽:163
蘇州java程序員培訓學校 瀏覽:479
單片機液晶驅動 瀏覽:856
魔拆app里能拆到什麼 瀏覽:132
新預演算法的立法理念 瀏覽:144
wdcpphp的路徑 瀏覽:136
單片機p0口電阻 瀏覽:927
瀏覽器中調簡訊文件夾 瀏覽:595