1、hbase客戶端若想將資料寫進habse集群的regionserver上,首先需要獲取要寫入資料的目標表所在的regionserver服務資訊,而服務資訊是儲存在系統元資料meta表中,即首先需要獲取meta表所在位置,而meta表節點位置資訊儲存在zookeeper中,此時hbase的客戶端的物件會首先向zk集**起請求,請求獲取meta表所在位置資訊。
2、zk集群收到請求後,返回系統meta表所在的regionserver資訊。
3、當客戶收接收到了從zk集群返回的meta表的位置資訊後,會去該節點上獲取meta表內容,meta表內容包括表的儲存位置,同時根據目標寫入資料的rowkey來查詢需要將資料寫到該錶的哪個region上,
4、此時將rowkey所在的regionserver資訊返回給客戶端。同時會將meta表的內容資訊加入至快取中,方便下次讀取。
5、由客戶端發出資料寫入請求到目標region。
6、首先會將資料先寫入到目標region的 wal(預寫入日誌),也叫hlog。
7、後將資料寫入到region的memorystore(內容)中。
8、記憶體寫入完成後,由region返回ack應答給hbase客戶端,預設寫資料完成。
1、讀取過程前期還是和寫入資料一樣,hbase的client先訪問zookeeper,獲取hbase:meta表位於哪個regionserver。
2、獲取meta表所在位置後,根據讀請求的namespace:table/rowkey,查詢出目標資料位於哪個regionserver中的哪個region裡。並將該table的region資訊以及meta表的位置資訊快取在客戶端的meta cache中,方便下次訪問。
3、與目標 regionserver進行通訊,傳送get請求。
4、分別在block cache(讀快取),memstore 和 storefile(hfile)中查詢目標資料 ,並將查詢到的資料進行merge合併操作,此時所有資料是指同一條資料不同版本(timestamp時間戳不同)的資料,取其中時間最大,即最近的一條資料返回。
5、將從檔案中查詢到的資料塊(block,hfile中資料)快取至block cache中。方便下次查詢。
6、將資料合併後的結果返回給客戶端,讀取流程結束。
總結:
由於在讀取資料過程中,涉及到資料會進行記憶體與磁碟中的hfile資料合併的操作,所以讀取資料必不可免的會去讀取磁碟,而後將磁碟資料和記憶體資料合併返回結果,而對資料寫入操作而言,只需要先寫入預寫日誌,再將資料寫入記憶體即可。遠沒有讀取流程那麼繁瑣,所以一般而言,habse讀取資料會慢於寫入操作。
1、scan方式的快取大小設定是否合理?
先解釋下什麼是scan快取,通常情況下一次scan會返回大量資料,因此客戶端發起一次scan請求,實際上並不會一次將所有資料載入至本地,而是分成多次rpc請求進行載入,這樣設計一方面因為大量資料請求可能造成網路頻寬嚴重消耗,進而影響regionserver程序的服務,另一方面也有可能因為資料量太大導致本地客戶端發生oom,在這樣的設計體系下使用者會首先載入一部分資料到本地快取,然後遍歷處理,再載入一部分資料到本地,如此往復,直到所有資料載入完成,資料載入的批量大小(scan快取)預設為100條資料。對於資料請求量較大的業務場景而言,若想提公升scan效能,在本地記憶體足夠滿足的情況下,可以考慮將scan快取設定增大。比如500-1000,可以減少rpc通訊次數,降低scan請求的總體延遲。
2、離線批量讀取請求是否設定禁止快取?
scan全表掃瞄過程中,一方面資料量很大,另一方面請求只會執行一次,scan.setcacheblocks預設設定為true,就會從hdfs載入出來的資料放到快取,大量資料進入快取必將導致其他熱點資料被迫擠出,會出現資料熱點問題,所以一般scan場景下設定禁用快取,scan.setcacheblocks設定為false。
3、get、put請求是否使用批量處理?
使用批量get、put的api(getlist,putlist)介面,可以減少客戶端到regionserver之間的rpc通訊的連線數,可提高讀寫效能。值得一提的是,批量get、put請求需要控制大小,過大會出現regionserver超負載,getlist大小建議不超過200,putlist大小建議不超過2000。
4、若寫入hbase表資料量太大,考慮使用bulkload特性。
依據hbase儲存資料按照hfile格式儲存在hdfs的原理,使用bulkload特性直接生成hfile格式的資料檔案,然後在通過hbase自身的指令碼指令將生成的hfile資料檔案移動到相應的region上去。
hbase org.apache.hadoop.hbase.mapreduce.loadincrementalhfiles 【hfile檔案位址】 【目標表】
5、對於給定的批量資料在做put和get操作前,先對rowkey進行排序操作對批量操作按rowkey進行位元組排序後,可以最大程度保證同一批get/put請求只對同乙個region進行讀寫操作,從而大幅度提高效能。
6、使用mapreduce統計hbase全表資料總量時,指定乙個絕對不會為空的字段,可提公升效能。
hbase是典型的列式儲存資料庫,意味著同一列族的資料儲存在一起,不同的列族資料分開儲存在不同的目錄下,如果乙個表有多個列族,全表檢索必定會同時載入多個列族,而在統計全表資料量的業務場景下,本不必全部載入所有列族的資料,只需要顯示指定乙個非空的列即可。
hbase org.apache.hadoop.hbase.mapreduce.rowcounter 『tablename』 『info:id』
Hbase 讀寫 原理
客戶端讀取資訊流程 1 client要讀取資訊,先查詢下client 端的cache中是否存在資料,如果存在,剛直接返回資料。如果不存在,則進入到zookeeper,查詢到裡面的相應資料存在的root表中的位址。2 blockcache 設計用於讀入記憶體頻繁訪問的資料,每個列族都有 3 通過資料存...
HDFS儲存架構剖析以及讀寫流程
hdfs儲存架構主要由三部分組成 namenode,datanode,client 1 開啟分布式檔案 呼叫 分布式檔案 distributedfilesystem.open 方法 2 從 namenode 獲得 datanode 位址 distributedfilesystem 使用 rpc 呼叫...
Hbase讀寫資料的原理解析
針對上圖的一些解釋 這裡面資料分割槽 region 儲存是為了查詢方便 即因為是集群所以能充分利用磁碟的io性 新增資料時,資料先進入hlog 預寫日誌 資料只能追加不能修改 防止資料丟失 資料在hlog寫完後再寫到記憶體中。hfile 認為是將資料進行序列化。storefile 認為是乙個檔案。d...