「從零單排HBase 04」HBase高效能查詢揭祕
先給結論吧:HBase利用compaction機制,通過大量的讀延遲毛刺和一定的寫阻塞,來換取整體上的讀取延遲的平穩。
1.為什麼要compaction
在上一篇 HBase讀寫 中我們提到了,HBase在讀取過程中,會建立多個scanner去抓去資料。
其中,會建立多個storefilescanner去load HFile中的指定data block。所以,我們很容易就想到,如果說HFile太多的話,那麼就會涉及到很多磁碟IO,這個就是常說的“讀放大”現象。
因此,就有了今天的主題,HBase的核心特性——compaction。
通過執行compaction,可以使得HFile的數量基本穩定,使得IO seek次數穩定,然後每次的查詢rt才能穩定在一定範圍內。
2.compaction的分類
compaction分為兩種,minor compaction和major compaction。
Minor compaction主要是將一些相鄰的小檔案合併為大檔案,這個過程僅僅做檔案的合併,並不會刪除deleted type的資料和ttl過期的資料。
Major compaction是指將一個HStore下的所有檔案合併為一個HFile,這個過程會消耗大量系統資源,一般線上會關閉自動定期major compaction的功能(將引數hbase.hregion.majorcompaction設為0即可關閉,但是flush的觸發還是會進行),改為手動低峰執行。這個過程會刪除三類資料:標記為刪除的資料、TTL過期的資料、版本號不滿足要求的資料。
具體什麼時候觸發哪種型別的compaction呢?
滿足以下任意條件會觸發major compaction,否則就是minor compaction:
- 使用者強制執行major compaction
- 長時間沒有compact,且候選檔案小於閾值(hbase.hstore.compaction.max)
- Store中含有reference檔案(split產生的臨時檔案),需要通過 major compact進行資料遷移,刪除臨時檔案
3.compaction的觸發時機
compaction的觸發時機一共有三種:
1)MemStore flush:
這個在一開始就提到了,相信也很容易理解。因為每次MemStore flush會產生新的HFile檔案,而檔案數量超過限制,自然就觸發了compaction。這裡需要注意的是,我們在 深入HBase架構 一文中已經提到,memstore是以region為單位進行flush的,也就是說,一個region內的任意一個HStore下面的memstore滿了,這個region下的所有HStore的memstore都會觸發flush。然後每個HStore都有可能觸發compaction。
2)後臺執行緒週期性檢查
HBase有一個後臺執行緒CompactionChecker,會定期巡檢觸發檢查,是否進行compaction。
這裡和flush觸發的compaction有所不同,這裡先檢查檔案樹是否大於閾值,大於就觸發compaction。如果沒有大於閾值,還會檢查下HFile裡面的最早更新時間,是否早於某個閾值(hbase.hregion.majorcompaction),如果早於,就觸發major compaction來達到清理無用資料的目的。
3)手動觸發:
由於我們擔心major compaction會影響業務,因此會選擇業務低峰期進行手動觸發。
還有一部分原因,是使用者執行ddl後,希望理解生效,也會執行手動觸發major compaction。
最後,可能是因為磁碟容量不夠了,需要major compaction來手動清理無效資料,合併檔案。
4.HFile合併過程
1)讀取待合併的HFile的key value,寫入臨時檔案中
2)將臨時檔案移動到對應的region的資料目錄
3) 將compaction的輸入檔案路徑和輸出檔案路徑寫入WAL日誌,然後強行執行sync
4)將對應region資料目錄下的輸入檔案全部刪除
5.compaction的副作用分析
當然,compaction本身也要涉及到大量檔案的讀寫,在表現上就是會有一定的讀延遲毛刺。因此,我們可以認為,compaction過程是使用短時間的大量IO消耗來換取後續查詢的低延遲。
另一方面,假設處於長時間的高寫入量,HFile的數量一直增長,compaction的速度趕不上HFile增長的速度,那麼,HBase會暫時阻塞寫請求。當每次memstore進行flush的時候,如果一個HStore中的HFile的數量超過了hbase.hstore.blockingStoreFIles(預設為7),那麼就會暫時阻塞flush的動作,阻塞時間為abase.hstore.blockingWaitTime。當阻塞時間過去後,觀察HFile的數量下降到上述值,那麼就會繼續flush的操作。這樣,就保證了HFile數量的穩定,但是對寫入會有一定的速度影響。
看到這裡了,原創不易,點個關注、點個贊吧,你最好看了~
知識碎片重新梳理,構建Java知識圖譜:https://github.com/saigu/JavaKnowledgeGraph(歷史文章查閱非常方便)
掃碼關注我的公眾號“阿丸筆記”,第一時間獲取最新更新。同時可以免費獲取海量Java技術棧電子書、各個大廠面試題。
相關推薦
「從零單排canal 04」 啟動模組deployer原始碼解析
基於1.1.5-alpha版本,具體原始碼筆記可以參考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_reading/canal 本文將對canal的啟動模組deployer進行分析。 Deployer模組(綠色部
「從零單排canal 01」 canal 10分鐘入門(基於1.1.4版本)
1.簡介 canal [kə'næl],譯意為水道/管道/溝渠,主要用途是基於 MySQL 資料庫增量日誌解析,提供增量資料 訂閱 和 消費。應該是阿里雲DTS(Data Transfer Service)的開源版本。 2.提供的能力 Canal與DTS提供的功能基本相似: 1)
「從零單排canal 02」canal叢集版 + admin控制檯 最新搭建姿勢(基於1.1.4版本)
canal [kə'næl],譯意為水道/管道/溝渠,主要用途是基於 MySQL 資料庫增量日誌解析,提供增量資料 訂閱 和 消費。應該是阿里雲DTS(Data Transfer Service)的開源版本,開源地址:https://github.com/alibaba/cana
「從零單排canal 03」 canal原始碼分析大綱
在前面兩篇中,我們從基本概念理解了canal是一個什麼專案,能應用於什麼場景,然後通過一個demo體驗,有了基本的體感和認識。 從這一篇開始,我們將從原始碼入手,深入學習canal的實現方式。瞭解canal相關功能的實現方式,其中有很多機制是非常值得深入瞭解的,從程式碼實現角度去學習實時資料訂閱與同步的實現與
「從零單排canal 05」 server模組原始碼解析
基於1.1.5-alpha版本,具體原始碼筆記可以參考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_reading/canal 本文將對canal的server模組進行分析,跟之前一樣,我們帶著幾個問題來看原始碼
「從零單排canal 06」 instance模組原始碼解析
基於1.1.5-alpha版本,具體原始碼筆記可以參考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_reading/canal instance模組比較簡單,我們重點了解以下幾個問題 instance配置模式有
「從零單排canal 07」 parser模組原始碼解析
基於1.1.5-alpha版本,具體原始碼筆記可以參考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_reading/canal 本文將對canal的binlog訂閱模組parser進行分析。 parser模組(綠
「從零單排HBase 04」HBase高效能查詢揭祕
先給結論吧:HBase利用compaction機制,通過大量的讀延遲毛刺和一定的寫阻塞,來換取整體上的讀取延遲的平穩。 1.為什麼要compaction 在上一篇 HBase讀寫 中我們提到了,HBase在讀取過程中,會建立多個scanner去抓去資料。 其中,會建立多個storefilescanner去
「從零單排HBase 06」你必須知道的HBase最佳實踐
前面,我們已經打下了很多關於HBase的理論基礎,今天,我們主要聊聊在實際開發使用HBase中,需要關注的一些最佳實踐經驗。 1.Schema設計七大原則 1)每個region的大小應該控制在10G到50G之間; 2)一個表最好保持在 50到100個 region的規模; 3)每個cell最大不應該超過10
「從零單排HBase 10」HBase叢集多租戶實踐
在HBase1.1.0釋出之前,HBase同一叢集上的使用者、表都是平等的,大家平等共用叢集資源。容易碰到兩個問題: 一是某些業務較其他業務重要,需要在資源有限的情況下優先保證核心重要業務的正常執行 二是有些業務QPS常常很高,佔用大量系統資源,導致其他業務無法正常運轉。 這是典型的多租戶問題。因此,我們
從零單排入門機器學習:線性回歸(linear regression)實踐篇
class rom enter instr function ont 線性 gin 向量 線性回歸(linear regression)實踐篇 之前一段時間在coursera看了Andrew ng的機器學習的課程,感覺還不錯,算是入門了。這次打算以該課程的作業
SD從零開始03-04
來源 con cin 商品 ati bom record 記錄 party [原創]SD從零開始3 SD中的主數據 客戶主數據Customer master(分層維護) 一般數據general data; 與銷售和財務都有關,對所有的組織單元有效
【LeetCode從零單排】No.135Candy(雙向動態規劃)
int ldr padding order min sim color assigned ini 1.題目There are N children standing in a line. Each child is assigned a rating value.You
Python3 從零單排2_文件讀寫
數據 ace repl see 彩虹 定義 txt 沒有 寫文件 文件操作其實和我們日常處理文件一樣的,先打開文件,然後操作,最後保存關閉,在python裏就是這三步驟: 1、打開文件獲取文件的句柄,句柄就理解為這個文件 2、通過文件句柄操作文件 3、關閉文件
python3 從零單排3_函數(購買商品小程序)
pan encoding txt 初始 函數 read odin tro and 題目如下:商品文件products.txt裏存的內容如下:{‘mac‘: 6500, ‘被子‘: 100.0, ‘手機‘: 1.0, ‘寶馬‘: 100}用戶文件user.txt裏存的內容
Python3 從零單排_一些好玩的東西
進度 一次 字典 pri strong style form 三元運算 tro 這裏介紹四個: 1.實現進度條 2.深淺拷貝 3.三元運算 4.format 格式化傳字典 1 #進度條 2 import time 3 for i in range
從零單排Python學習第二課
運行 http del product span rod 範圍 enumerate price 簡易購物車: 1,商品展示 2,添加商品到購物車 #list集合保存商品信息product_list = [("電視機",5000), ("洗衣
從零單排學Redis【白銀】
前言 只有光頭才能變強 今天繼續來學習Redis,上一篇從零單排學Redis【青銅】已經將Redis常用的資料結構過了一遍了。如果還沒看的同學可以先去看一遍再回來~ 這篇主要講的內容有: Redis伺服器的資料庫 Redis對過期鍵的處理 Redis持久化策略(RDB和AOF)
從零單排學Redis【黃金】
前言 只有光頭才能變強 好的,今天我們要上黃金段位了,如果還沒經歷過青銅和白銀階段的,可以先去蹭蹭經驗再回來: 從零單排學Redis【青銅】 從零單排學Redis【白銀】 看過相關Redis基礎的同學可以知道Redis是單執行緒的,很多面試題也很可能會問到“為什麼Redis是單
從零單排學Redis【鉑金二】
前言 只有光頭才能變強 好的,今天我們要上【鉑金二】了,如果還沒有上鉑金的,趕緊先去蹭蹭經驗再回來(不然不帶你上分了): 從零單排學Redis【青銅】 從零單排學Redis【白銀】 從零單排學Redis【黃金】 從零單排學Redis【鉑金一】