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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...