日誌寫入hbase Hbase系列 寫流程

2021-10-16 10:02:02 字數 1533 閱讀 4653

前言

讀寫流程是hbase中最重要也是最複雜的乙個過程,本文主要是介紹hbase的讀寫是乙個怎麼樣的過程

1 hbase寫入流程

1.1 lsm樹簡介

hbase是採用lsm(log-structured merge tree)架構,儲存引擎和b樹儲存引擎一樣,同樣支援增、刪、讀、改、順序掃瞄操作。而且通過批量儲存技術規避磁碟隨機寫入問題。當然凡事有利有弊,lsm樹和b+樹相比,lsm樹犧牲了部分讀效能,用來大幅提高寫效能.

lsm數的設計思想如下:

將對資料的修改增量保持在記憶體中,達到指定的大小限制後將這些修改操作批量寫入磁碟,不過讀取的時候稍微麻煩,需要合併磁碟中歷史資料和記憶體中最近修改操作,所以寫入效能大大提公升,讀取時可能需要先看是否命中記憶體,否則需要訪問較多的磁碟檔案。極端的說,基於lsm樹實現的hbase的寫效能比mysql高了乙個數量級,讀效能低了乙個數量級。

lsm樹原理把一棵大樹拆分成n棵小樹,它首先寫入記憶體中,隨著小樹越來越大,記憶體中的小樹會flush到磁碟中,磁碟中的樹定期可以做merge操作,合併成一棵大樹,以優化讀效能.

1.2 hbase寫流程

第一步: hbase客戶端發起資料寫入請求,基於rowkey和集群的元資料定位到資料被寫入到哪台regionserver,然後將請求傳送給對應的regionserver.

這裡可以以put方法為例,盡量去詳細描述這個過程,使用者在用put寫hbase的時候,資料會首先被提交到資料緩衝區,hbase中有個引數autoflush,該引數預設值是true,資料不會被寫入到本地緩衝區,而是直接提交給伺服器進行處理,我們可以設定為false,就是資料會被先寫入到本地緩衝區,當緩衝區中資料 量達到一定閾值之後(預設是2m),會被提交到伺服器,該方式為批評提交方式,可以極大提公升吞吐量。

在資料被提交之前,客戶端需要獲取到該rowkey被寫入到的regionserver資訊,即元資料資訊,寫到哪個rs的哪個region,客戶端首先到客戶端快取中去查詢,如果在快取中查詢不到元資料資訊,則先去zookeeper中/hbase-root/meta-region-server/查詢hbase:meta表所在的regionserver,然後再查詢hbase:meta查詢rowkey所在的regionserver的region資訊,當返回結果後,客戶端會將查詢到的元資料快取本本地,以供下次使用.

第二步: regionserver接收到資料請求之後,資料先別寫入wal日誌,然後再寫入memstore,這樣做的原因是防止regionserver機器掛掉後,memstore記憶體中的資料丟失

第三步: 第二步中資料寫入memstore中以後,hbase客戶端就認為資料已經寫入完成了,可以看出,hbase寫是乙個非同步的過程,當region的memstore中的容量達到一定閾值之後,就會觸發flush操作,將memstore中的資料刷寫到磁碟。生成hfile檔案。

該步驟中我們需要了解下面幾個知識點:

1 memstore什麼時候刷寫,即刷寫時機

2 flush的整體流程

3 如何生成hfile

flask將日誌寫入日誌檔案

import logging logging.basicconfig level logging.debug,控制台列印的日誌級別 filename log new.log 將日誌寫入log new.log檔案中 filemode a 模式,有w和a,w就是寫模式,每次都會重新寫日誌,覆蓋之前的日誌...

日誌寫入到檔案 多檔案寫入

在上篇文章的基礎上,修改配置 log4j.rootlogger info,fout 說明 rootlogger是可以多樣式定義的,如log4j.rootlogger info,myout,fout。myout,fout是自定義樣式。這樣就會在c盤下建立a.log檔案。有這樣一種需求,不同模組需要各自...

java寫入日誌檔案

首先要定義日誌的四個等級 info,debug,error,fatal,還要建日誌輸出方式,如console,file,html,database 以上資訊可以放到.properties檔案中。建類,來實現各種方式的輸出。如 private static log log new log privat...