hbase 查询固定条数_HBase原理深入
HBase讀數據流程
HBase讀數據流程.pngHBase元數據信息.pngHBase讀操作
首先從zk中找到meta表的region信息,然后meta表中的數據,meta表中存儲了用戶的region信息
根據要查詢的namespace、表名和rowkey信息,找到對應的真正存儲要查詢的數據的region信息
找到這個region對應的regionServer,然后發送請求
查找對應的region
先從metastore查找數據,如果沒有,再從BlockCache讀取。
HBase上的RegionServer的內存分為兩個部分
一部分作為Memstore,主要用來寫
另一部分作為BlockCache,主要用來讀數據
如果BlockCache中也沒有找到,再到StoreFile上進行讀取
從storeFile中讀取到數據之后,不是直接把結果數據返回給客戶端, 而是把數據先寫?入到BlockCache中,目的是為了加快后續的查詢;然后在返回結果給客戶端。
HBase寫數據流程
HBase寫數據流程.pngHBase寫操作
首先從zk找到meta表的region位置,然后讀取meta表中的數據,meta表中存儲了用戶表的region信息
根據要查詢的namespace、表名和rowkey信息,找到對應的真正存儲要查詢的數據的region信息
找到這個region對應的regionServer,然后發送請求
把數據寫到HLog(write ahead log。WAL:預寫入日志)和memstore各一份(寫到Region里列族對應的Store的內存)
Memstore 達到閾值后把數據刷到磁盤,生產storeFile
刪除HLog中的歷史數據
HBase的flush(刷寫)及compact(合并)機制
Flush機制
當memstore的大小超過這個值的時候會flush到磁盤,默認是128M
<property>
<name>hbase.hregion.memstore.flush.sizename>
<value>134217728value>
property>當memstore中的數據時間超過1小時,會flush到磁盤
<property>
<name>hbase.regionserver.optionalcacheflushintervalname
<value>3600000value>
property>Hregion的所有的memstore的大小(一個RegionServer會有多個Region,一個Region會有多個store,也就有多個memstore),所有的memstore的大小超過堆大小的一定比例會觸發flush到磁盤的操作,默認是堆大小的40%
<property>
<name>hbase.regionserver.global.memstore.sizename>
<value>0.4value>
property>手動flush
flush?tableName
阻塞機制
以上介紹的是Store中memstore數據刷寫磁盤的標準,但是Hbase中是周期性(定時,默認是10S)的檢查是否滿足以上標準,滿?則進?刷寫,但是如果在下次檢查到來之前,數據瘋狂寫入Memstore中,會出現什什么問題呢?
會觸發阻塞機制,此時無法寫?數據到Memstore,數據無法寫入Hbase集群。
memstore中數據達到512MB
計算公式:hbase.hregion.memstore.flush.size*hbase.hregion.memstore.block.multiplier
hbase.hregion.memstore.flush.size刷寫的閥值,默認是 134217728,即128MB
hbase.hregion.memstore.block.multiplier是一個倍數,默認是4。
RegionServer全部memstore達到規定值
hbase.regionserver.global.memstore.size.lower.limit是0.95
hbase.regionserver.global.memstore.size是0.4,
堆內存總共是 16G,
觸發刷寫的閾值是:(0.95 * 0.4 * 16) = 6.08GB
觸發阻塞的閾值是:(0.4 * 16) = 6.4GB
當發生阻塞的時候,無法寫入HBase,那么如何解決?
調大memstore的hbase.hregion.memstore.flush.size內存大小設置
讓RegionServer占有JVM堆大小更多一些
Compact合并機制
合并的原因:減少文件的數量,提高查詢的時候掃描的性能
在HBase中主要存在兩種類型的Compact合并
minor compact ?合并
會將Store中多個HFile(StoreFile)合并成一個大的HFile(默認最少3個,最多10個)
這個過程中,刪除和更新的數據僅只是做了標記,并沒有物理移除,這種合并的觸發頻率很高。
minor compact?件選擇標準由以下?個參數共同決定:
<property>
????<name>hbase.hstore.compaction.minname>
????<value>3value>
property>
<property>
????<name>hbase.hstore.compaction.maxname>
????<value>10value>
property>
<property>
????<name>hbase.hstore.compaction.min.sizename>
????<value>134217728value>
property>
<property>
????<name>hbase.hstore.compaction.max.sizename>
????<value>9223372036854775807value>
property>觸發條件
memstore flush
在進行memstore flush前后都會進行判斷是否觸發compact
定期檢查線程
周期性檢查是否需要進行compaction操作,由參數:hbase.server.thread.wakefrequency決定,默認值是10000 millseconds
major compact 大合并
合并Store中所有的HFile為一個HFile
這個過程有刪除標記的數據會被真正移除,同時超過單元格maxVersion的版本記錄也會被刪除。合并頻率?較低,默認7天執??次,并且性能消耗非常大,建議?產關閉(設置為0),在應用空閑時間手動觸發。?般可以是手動控制進行合并,防?出現在業務高峰期。
major compaction觸發時間條件
<property>
????<name>hbase.hregion.majorcompactionname>
????<value>604800000value>
property>手動觸發
##使?major_compact命令
major_compact?tableName
Region拆分機制
Region中存儲的是?量的rowkey數據 ,當Region中的數據條數過多的時候,直接影響查詢效率.當Region過大的時候.HBase會拆分Region , 這也是Hbase的?個優點
Region拆分機制.png拆分策略
Hbase拆分策略一共有以下幾種:
ConstantSizeRegionSplitPolicy(0.9版本以前默認的切分策略。)
當region?小?于某個閾值(hbase.hregion.max.filesize=10G)之后就會觸發切分,一個region等分為2個region。
但是在生產線上這種切分策略卻有相當大的弊端:切分策略對于大表和小表沒有明顯的區分。閾值(hbase.hregion.max.filesize)設置較大對大表?比較友好,但是小表就有可能不會觸發分裂,極端情況下可能就1個,這對業務來說并不是什么好事。如果設置較小則對?表友好,但一個大表就會在整個集群產?大量的region,這對于集群的管理、資源使用、failover來說都不是一件好事。
IncreasingToUpperBoundRegionSplitPolicy(0.94版本~2.0版本默認切分策略)
切分策略稍微有點復雜,總體看和ConstantSizeRegionSplitPolicy思路相同,一個region?小?于設置閾值就會觸發切分。但是這個閾值并不像 ConstantSizeRegionSplitPolicy是一個固定的值,而是會在一定條件下不斷調整,調整規則和region所屬表在當前regionserver上的region個數有關系.
region split的計算公式是:
regioncount^3 * 128M * 2,當region達到該size的時候進?split 例如:
第一次split:1^3 * 256 = 256MB
第二次split:2^3 * 256 = 2048MB
第三次split:3^3 * 256 = 6912MB
第四次split:4^3 * 256 = 16384MB > 10GB,因此取較?的值10GB 后面每次split的size都是10GB了
SteppingSplitPolicy(2.0版本默認切分策略略)
這種切分策略的切分閾值?發生了變化,相比 IncreasingToUpperBoundRegionSplitPolicy 簡單了一些,依然和待分裂region所屬表在當前 regionserver上的region個數有關系,如果region個數等于1,切分閾值為flush size(默認128M) * 2,否則為MaxRegionFileSize(10G)。這種切分策略對于?集群中的大表、小表會?比 IncreasingToUpperBoundRegionSplitPolicy 更加友好,?表不不會再產??量的?region,?是適可?止。
KeyPrefixRegionSplitPolicy
根據rowKey的前綴對數據進行分組,這里是指定rowKey的前多少位作為前綴,?如rowKey都是16位的,指定前5位是前綴,那么前5位相同的rowKey在進?region split的時候會分到相同的region中。
DelimitedKeyPrefixRegionSplitPolicy
保證相同前綴的數據在同一個region中,例如rowKey的格式為:userid_eventtype_eventid,指定的delimiter為 _ ,則split的的時候會確保userid 相同的數據在同一個region中。
DisabledRegionSplitPolicy
不啟用?動拆分, 需要指定?動拆分
RegionSplitPolicy的應?
Region拆分策略可以全局統一配置,也可以為單獨的表指定拆分策略。
通過hbase-site.xml全局統一配置(對hbase所有表生效)
<property><name>hbase.regionserver.region.split.policyname>
<value>org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicyvalue>
property>
通過Java API為單獨的表指定Region拆分策略
HTableDescriptor?tableDesc?=?new?HTableDescriptor("test1");?tableDesc.setValue(HTableDescriptor.SPLIT_POLICY,?IncreasingToUpperBoundRegionSplitPolicy.class.getName());?tableDesc.addFamily(new?HColumnDescriptor(Bytes.toBytes("cf1")));admin.createTable(tableDesc);
通過HBase Shell為單個表指定Region拆分策略
create?'test2',?{METADATA?=>?{'SPLIT_POLICY'?=>'org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy'}},{NAME?=>?'cf1'}
HBase表的預分區
為什么要預分區
當?個table剛被創建的時候,Hbase默認的分配?個region給table。也就是說這個時候,所有的讀寫請求都會訪問到同一個regionServer的同一個region中,這個時候就達不到負載均衡的效果了,集群中的其他regionServer就可能會處于比較空閑的狀態。解決這個問題可以用pre-splitting,在創建table的時候就配置好,生成多個 region。
增加數據讀寫效率
負載均衡,防?數據傾斜
?便集群容災調度region
每?個region維護著startRow與endRowKey,如果加入的數據符合某個region維護的rowKey范圍,則該數據交給這個region維護
手動指定預分區
create?'person','info1','info2',SPLITS?=>?['1000','2000','3000']也可以把分區規則創建于文件中
?vim?split.txt文件內容
?aaa?bbb
?ccc
?ddd
執?
?create?'student','info',SPLITS_FILE?=>?'/root/hbase/split.txt'Region合并
Region合并說明
Region的合并不是為了性能,而是為了出于維護的目的
如何進行Region的合并
通過Merge類冷合并Region
需要先關閉集群
需求:需要把Student表中的2個Region數據進行合并
這?通過org.apache.hadoop.hbase.util.Merge類來實現,不需要進入hbase shell,直接執?(需要先關閉hbase集群):
hbase?org.apache.hadoop.hbase.util.Merge?student?\?student,,1595256696737.fc3eff4765709e66a8524d3c3ab42d59.?\?student,aaa,1595256696737.1d53d6c1ce0c1bed269b16b6514131d0.
通過online_merge熱合并Region
不需要關閉集群
與冷合并不同的是,online_merge的傳參是Region的hash值,而Region的hash值就是Region名稱的最后那段在兩個.之間的字符串部分。
需求:需要把lagou_s表中的2個region數據進行合并:?student,,1587392159085.9ca8689901008946793b8d5fa5898e06.?\?student,aaa,1587392159085.601d5741608cedb677634f8f7257e000.
需要進?入hbase?shell:
merge_region?'c8bc666507d9e45523aebaffa88ffdd6','02a9dfdf6ff42ae9f0524a3d8f4c7777'
成功后在觀察頁面
總結
以上是生活随笔為你收集整理的hbase 查询固定条数_HBase原理深入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华夏小羊肖恩亲子信用卡年费多少?怎么免年
- 下一篇: 2021 icme_重磅 | 2021年