HBase(七): HBase體繫結構剖析(下)

来源:http://www.cnblogs.com/tgzhu/archive/2016/09/10/5859014.html
-Advertisement-
Play Games

目錄: write Compaction splite read Write: 當客戶端發起一個Put請求時,首先根據RowKey定址,從hbase:meta表中查出該Put數據最終需要去的HRegionServer 客戶端將Put請求發送給相應的HRegionServer,在HRegionServ ...


目錄:

  • write
  • Compaction
  • splite
  • read

Write:


  • 當客戶端發起一個Put請求時,首先根據RowKey定址,從hbase:meta表中查出該Put數據最終需要去的HRegionServer
  • 客戶端將Put請求發送給相應的HRegionServer,在HRegionServer中它首先會將該Put操作寫入WAL日誌文件中(Flush到磁碟中),如下圖:
  • 寫完WAL日誌文件後,HRegionServer根據Put中的TableName和RowKey找到對應的HRegion,並根據Column Family找到對應的HStore
  • 將Put數據寫入到該HStore的MemStore中。此時寫成功,並返回通知客戶端
  • 上一節介紹過,MemStore是一個In Memory Sorted Buffer,在每個HStore中都有一個MemStore,即它是一個HRegion的一個Column Family對應一個實例
  • 它的排列順序以RowKey、Column Family、Column的順序以及Timestamp的倒序,如下示意圖:
  • 每一次Put請求都是先寫入到MemStore中,當MemStore滿後會Flush成一個新的StoreFile(底層實現是HFile),即一個HStore(Column Family)可以有0個或多個StoreFile(HFile)
  • 註意:MemStore的最小Flush單元是HRegion而不是單個MemStore, 這就是建議使用單列族的原因,太多的Column Family一起Flush會引起性能問題
  • MemStore觸發Flush動作的時機:
    1. 當一個MemStore的大小超過了hbase.hregion.memstore.flush.size的大小,此時當前的HRegion中所有的MemStore會Flush到HDFS中
    2. 當全局MemStore的大小超過了hbase.regionserver.global.memstore.upperLimit的大小,預設40%的記憶體使用量。此時當前HRegionServer中所有HRegion中的MemStore都會Flush到HDFS中,Flush順序是MemStore大小的倒序,直到總體的MemStore使用量低於hbase.regionserver.global.memstore.lowerLimit,預設38%的記憶體使用量
    3. 待確認:一個HRegion中所有MemStore總和作為該HRegion的MemStore的大小還是選取最大的MemStore作為參考?
    4. 當前HRegionServer中WAL的大小超過了hbase.regionserver.hlog.blocksize * hbase.regionserver.max.logs的數量,當前HRegionServer中所有HRegion中的MemStore都會Flush到HDFS中,Flush使用時間順序,最早的MemStore先Flush直到WAL的數量少於hbase.regionserver.hlog.blocksize * hbase.regionserver.max.logs
    5. 註意:因為這個大小超過限制引起的Flush不是一件好事,可能引起長時間的延遲
  • 在MemStore Flush過程中,還會在尾部追加一些meta數據,其中就包括Flush時最大的WAL sequence值,以告訴HBase這個StoreFile寫入的最新數據的序列,那麼在Recover時就直到從哪裡開始。在HRegion啟動時,這個sequence會被讀取,並取最大的作為下一次更新時的起始sequence,如下圖:

Compaction:


  • MemStore每次Flush會創建新的HFile,而過多的HFile會引起讀的性能問題,HBase採用Compaction機制來解決這個問題
  • HBase中Compaction分為兩種:Minor Compaction和Major Compaction
    1. Minor Compaction: 是指選取一些小的、相鄰的StoreFile將他們合併成一個更大的StoreFile,在這個過程中不會處理已經Deleted或Expired的Cell。一次Minor Compaction的結果是更少並且更大的StoreFile, 如下圖:
    2. Major Compaction: 是指將所有的StoreFile合併成一個StoreFile,在這個過程中,標記為Deleted的Cell會被刪除,而那些已經Expired的Cell會被丟棄,那些已經超過最多版本數的Cell會被丟棄。一次Major Compaction的結果是一個HStore只有一個StoreFile存在
    3. Major Compaction可以手動或自動觸發,然而由於它會引起很多的IO操作而引起性能問題,因而它一般會被安排在周末、凌晨等集群比較閑的時間, 如下示意圖:
  • 修改Hbase配置文件可以控制compaction行為
    1. hbase.hstore.compaction.min :預設值為 3,(老版本是:hbase.hstore.compactionThreshold),即store下麵的storeFiles數量 減去 正在compaction的數量 >=3是,需要做compaction
    2. hbase.hstore.compaction.max 預設值為10,表示一次minor compaction中最多選取10個store file
    3. hbase.hstore.compaction.min.size 表示文件大小小於該值的store file 一定會加入到minor compaction的store file中
    4. hbase.hstore.compaction.max.size 表示文件大小大於該值的store file 一定會被minor compaction排除

splite:


  • 最初,一個Table只有一個HRegion,隨著數據寫入增加,如果一個HRegion到達一定的大小,就需要Split成兩個HRegion,這個大小由hbase.hregion.max.filesize指定
  • split時,兩個新的HRegion會在同一個HRegionServer中創建,它們各自包含父HRegion一半的數據,當Split完成後,父HRegion會下線,而新的兩個子HRegion會向HMaster註冊上線
  • 處於負載均衡的考慮,這兩個新的HRegion可能會被HMaster分配到其他的HRegionServer,示意圖如下:
  1. 在zookeeper上創建ephemeral的znode指示parent region正在splitting
  2. HMaster監控父Regerion的region-in-transition znode
  3. 在parent region的文件夾中創建臨時split目錄
  4. 關閉parent region(會flush 所有memory store(memory file),等待active compaction結束),從現在開始parent region 不可服務。同時從本地server上offline parent region,每個region server都維護了一個valid region的list,該步將parent region從該list中移除
  5. Split所有的store file,這一步為每個文件做一個reference file,reference file由兩部分組成
    1. 第一部分是源文件的路徑,第二部分是新的reference file引用源文件split key以及引用上半截還是下半截
    2. 舉個例子:源文件是Table1/storefile.11,split point 是key1, 則split 成兩個子文件可能可能是Table1/storefile.11.bottom.key1,Table1/storefile.11.up.key1,表示從key1切開storefile.11後,兩個引用文件分別引用源文件的下半部分和上半部分
  6. 創建child region
    1. 設置各種屬性,比如將parent region的訪問指標平分給child region,每人一半
    2. 將上面在parent 文件夾中生成的臨時文件夾(裡面包含對parent region的文件reference)move到表目錄下,現在在目錄層次上,child region已經跟parent region平起平坐了
  7. 向系統meta server中寫入parent region split完畢的信息,並將child region的名字一併寫入(split狀態在meta層面持久化)
  8. 分別Open 兩個child region,主要包含以下幾個步驟:
    1. 將child region信息寫入meta server
    2. Load 所有store file,並replay log等
    3. 如果包含reference文件,則做一次compaction(類似merge),直到將所有的reference文件compact完畢,這裡可以看到parent region的文件是會被拆開寫入各個child regions的
  9. 將parent region的狀態由SPLITTING轉為SPLIT,zookeeper會負責通知master開始處理split事件,master開始offline parent region,並online child regions
  10. Worker等待master處理完畢之後,確認child regions都已經online,split結束

 read:


  • 根據Rowkey定址(詳情見上一節定址部分),如下圖:
  • 獲取數據順序規則,如下圖:

 

參考資料:


 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 轉自http://www.shangxueba.com/jingyan/1940447.html 1.游標方式 複製代碼代碼如下: DECLARE @Data NVARCHAR(max) SET @Data='1,tanw,2,keenboy' --Id,Name DECLARE @dataItem ...
  • 附加資料庫時出現附加資料庫失敗的錯誤,錯誤號是5120,已經兩次遇到這種問題了。今天寫一下解決辦法。 有兩個方法,很簡單: 1.設置mdf文件所在文件夾的許可權,在文件夾上右擊——屬性——安全,如圖所示: 根據圖示進行設置即可,註意是Authenticated user的許可權。 2.不要用sa登陸你的 ...
  • 在主庫沒有數據情況下配置MYSQL的主從及讀寫分離。目前只接觸過mysql_proxy,atlas(360)的代理。現已學習一下。以備以後用到。 ...
  • 在 HBase(六): HBase體繫結構剖析(上) 介紹過,Hbase創建表時,只需指定表名和至少一個列族,基於HBase表結構的設計優化主要是基於列族級別的屬性配置,如下圖: 目錄: BLOOMFILTER BLOCKSIZE IN_MEMORY COMPRESSION/ENCODING VER ...
  • 前陣子給以同事導oracle資料庫,但是發現導入後數據都是亂碼,下麵是自己解決這個問題的一些小整理。 比如: #su oralce $export ORACLE_SID=orcl $export ORACLE_HOME=/db/oracle/product/10.2.0/db_1 $cd $ORAC ...
  • explain顯示了mysql如何使用索引來處理select語句以及連接表。可以幫助選擇更好的索引和寫出更優化的查詢語句。 1、創建資料庫 創建的sql語句如下: 2、explain使用方法 使用方法:在select語句前加上explain 就可以了,如: 結果: 3、explain各個參數解釋 i ...
  • HBase自帶的很多工具可用於管理、分析、修複和調試,這些工具一部分的入口是hbase shell 客戶端,另一部分是在hbase的Jar包中。 目錄: hbck hfile 數據備份與恢復 hbck: hbck 工具用於Hbase底層文件系統的檢測與修複,包含Master、RegionServer ...
  • 1. 安裝環境:CentOS 7 64位 MySQL 5.7 2. 去MySQL官方網站下載MySQL源碼安裝包,註意,一定要選擇下圖的源代碼版,否則cmake時會報錯: 3. 預先安裝依賴軟體: 4. 創建MySQL用戶和用戶組先查看是否已經創建: 沒有創建則新建mysql用戶以及用戶組: 5. ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...