您好,登錄后才能下訂單哦!
本篇內容主要講解“HBase的讀寫流程以及優(yōu)化方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“HBase的讀寫流程以及優(yōu)化方法”吧!
HBase的讀寫流程--依賴于HBase的4大組件:分別是客戶端、Zookeeper、HMaster和HRegionServer。
HBase的讀寫都是由客戶端進行發(fā)起的。首先是讀的過程:客戶端根據(jù)用戶提供的表名、行鍵去客戶端里的緩存進行查詢,沒有查詢到,就去Zookeeper進行查詢。Zookeeper在HBase中用來存儲ROOT表的地址。HBase中有兩張重要的表,分別是ROOT表和META表,ROOT表記錄META表的region信息,而META表記錄的是用戶表的region信息。簡單來說,META表的行鍵是由Region所屬表的表名、以及該region在表中的開始行鍵和時間戳組成,列族info定義了三個列,分別是regionInfo存儲了region中開始結束行鍵,server列存儲了region所在的服務器地址,serverstartcode存儲了regionServer的狀態(tài)。
由于META表也是一張普通的HBASE表,因此當META表的數(shù)據(jù)越來越多的時候,也會分裂成多個meta region,每個meta region也會被不同的regionServer管理。因此就需要有一張表存儲meta region的信息,這張表就是ROOT表,ROOT表只存儲了一個region信息,那就是meta region。按照這個過程,理論上還需要一張表存儲ROOT表的信息,但是這樣就會產(chǎn)生無窮無盡的表存儲類似的信息,針對于這種情況,因此HBase的開發(fā)人員認為ROOT表數(shù)據(jù)量不會很大,因此不會數(shù)據(jù)分裂,所以就不需要其他表存儲ROOT表的region信息了。
客戶端通過Zookeeper獲得了ROOT表的地址,通過RPC連接到ROOT表所在的RegionServer,根據(jù)ROOT表查詢META表,然后根據(jù)用戶所提供的表名和行鍵,組成一個XXXXXXX(),通過這個行鍵去META表查詢,拿到info列族中的regionInfo和server列的值之后,根據(jù)server列的值,客戶端與RegionServer建立連接,將regionInfo列的數(shù)據(jù)提交給RegionServer。
RegionServer接收客戶端的查詢請求之后,首先創(chuàng)建RegionScanner對象,通過該對象定位到HRegion,然后HRegin對象創(chuàng)建StoreScanner,通過StoreScanner定位到HStore,HStore對象創(chuàng)建1個MemStoreScanner對象,這個對象負責去MemStore查詢有沒有相關數(shù)據(jù),有則返回,沒有就創(chuàng)建多個StoreFileScanner對象,每個對象否則去不同的HFile中查詢數(shù)據(jù),如果找到了則返回,如果沒有就返回null。
HBase寫的過程:當客戶端進行put操作時,數(shù)據(jù)會自動保存到HRegion上,在HRegionServer中,找到對應要寫入的HRegion之后,數(shù)據(jù)會寫入到HLog中并同時寫入到HStore的MemStore內存中,會在內存中按照行鍵對數(shù)據(jù)進行排序,當內存中的數(shù)據(jù)達到一定閾值后,會觸發(fā)flush操作。Flush操作主要就是把MemStore內存中的數(shù)據(jù)寫入到StoreFile中,當HDFS中的StoreFile個數(shù)達到一定的閾值后,會觸發(fā)compact(合并)操作,將HDFS中所有的StoreFile合并成一個新的SotreFile,在合并的時候會按照行鍵進行排序,并且會進行版本合并和數(shù)據(jù)刪除。當StoreFile通過不斷的合并操作后,StoreFile文件會變得越來越大,當這個StoreFile達到一定的閾值后,會觸發(fā)Split(切分)操作,同時把當前region拆分成兩個新的region,原有的region會下線,新的兩個region會被HMaster分配到相應的HRegionServer上,使得原來一個Region的壓力得以分流到兩個Region上,其實,HBase只是增加數(shù)據(jù),更新和刪除操作都是compact階段做的,所以,客戶端寫入成功的標志是HLog和MemStore中都有數(shù)據(jù)。
先寫HLog,但是如果顯示MemSotre也是沒問題的,因為MemStore的MVCC(多版本并發(fā)控制)不會向前滾動,這些變化在更新MVCC之前,Scan是無法看到的,所以在寫入HLog之前,即使MemStore有數(shù)據(jù),客戶端也查詢不到。
HBASE的優(yōu)化
1. 對行鍵、列族、列名稱長度優(yōu)化,HBase引入block的原因是block中包含了很多的key/value,每個key中包含rowkey、列族、列、時間戳,減少rowkey、列族、列的長度就能減少block的數(shù)量,否則會增加region server、region、索引、內存、查詢范圍。
2. 當進行批量處理數(shù)據(jù)時,客戶端會將數(shù)據(jù)先保存到客戶端的緩存中,HBASE默認是開啟隱式刷寫的,當關閉隱式刷寫時,put的數(shù)據(jù)也會保存到客戶端的緩存中,直到調用刷寫命令時,才會保存到HRegion中。
3.查詢優(yōu)化:
*設置scan緩存。
*查詢時指定列。
*使用完ResultScanner后及時關閉。
*查詢時盡量使用過濾器或協(xié)處理器,減少數(shù)據(jù)量。
*將查詢頻率較高的數(shù)據(jù)緩存起來。例如緩存到redis中。
*使用HtableTool查詢。
*使用批量讀取Htable.get(List<Get>)。
4.寫入優(yōu)化:
*關閉WAL日志,如果開啟了WAL日志,可以修改日志寫入hdfs的時間。(存在數(shù)據(jù)丟失的風險優(yōu)化)
*設置AutoFlush為false。(存在數(shù)據(jù)丟失的風險優(yōu)化)
*Region預分區(qū),兩種方式,hbase自帶的RegionSplitter,和自己實現(xiàn),一般使用hbase自帶的。
*通過HtableTool寫入。
*使用批量寫入Htable.put(List<Put>)。
5.配置方面優(yōu)化:
*設置RegionServer的處理線程數(shù)量,但是需要先進行測試。
*調整BlockChche或者MemStore內存大小大小,如果讀的較多則將BlockChche增大,如果寫的較多則MemStore調大。但兩者之和不能超過
一個RegionServer總內存大小的80%。(StoreFile的flush)
*調整StoreFile合并的數(shù)量限制,太少則合并次數(shù)頻繁嚴重影響性能,太大會到這查詢變慢。(StoreFile的compart)
*設置單個StoreFile的大小,調整分裂的性能。(StoreFile的spill)
6.行鍵設計:最大長度64KB
*因為hbase會的rowkey按照字節(jié)順序由小到大排序,因此需要保持rowkey松散性,避免單調遞增,防止出現(xiàn)region熱點。
*因為hbase只對rowkey建立索引,所以要保證行鍵的唯一性。
*因為行鍵是不可變的,所以在設計之初要滿足業(yè)務需求。
*因為rowkey是冗余存儲,所以只要滿足以上要求,行鍵長度盡量短。
7.列族設計:
*因為hbase底層是以列族為單位存儲的,一個列族中的數(shù)據(jù)會被存放在一個磁盤文件中,所以應該將具有相同特性的列放到一個列族中。
*一個表中的列族盡量不要太多,保持到1-2個最好。
*如果是更新頻繁并且只需要最獲取最新數(shù)據(jù)可以設置,單元格的時間版本為1,默認為3(VERSION)
*可以設置單元格的生命周期(TTL)
*隨機讀較多開啟布隆過濾器。
CAP原理
Consistency強一致性、availability可用性、partition tolerance分區(qū)容錯性,在一個大規(guī)模的分布式服務系統(tǒng)中不可能同時存在。
C指的是更新操作成功并返回客戶端完成后,分布式的所有節(jié)點在同一時間的數(shù)據(jù)完全一致
A指的是讀和寫操作都能成功
P指的是節(jié)點宕機不影響服務的運行。
HBASE只支持CP
到此,相信大家對“HBase的讀寫流程以及優(yōu)化方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。