HBase BucketAllocatorException 異常剖析

来源:https://www.cnblogs.com/zpb2016/archive/2020/04/22/12756332.html
-Advertisement-
Play Games

近日,觀察到HBase集群出現如下WARN日誌: 2020 04 18 16:17:03,081 WARN [regionserver/xxx BucketCacheWriter 1] bucket.BucketCache:Failed allocation for 604acc82edd349ca ...


近日,觀察到HBase集群出現如下WARN日誌:

2020-04-18 16:17:03,081 WARN [regionserver/xxx-BucketCacheWriter-1] bucket.BucketCache:Failed allocation for 604acc82edd349ca906939af14464bcb_175674734;
org.apache.hadoop.hbase.io.hfile.bucket.BucketAllocatorException: Allocation too big size=1114202; adjust BucketCache sizes hbase.bucketcache.bucket.sizes to accomodate if size seems reasonable and you want it cached.

大概意思是說:由於block塊太大(size=1114202)導致BucketAllocator無法為其分配空間,如果想要被緩存並且覺得這樣做合理,可以調整參數hbase.bucketcache.bucket.sizes。

預設情況下,HBase BucketCache 能夠緩存block的最大值為512KB,即hbase.bucketcache.bucket.sizes=5120,9216,17408,33792,41984,50176,58368,66560,99328,132096,197632,263168,394240,525312,預設14種size標簽。如果想要緩存更大的block塊,我們可以調整參數為 hbase.bucketcache.bucket.sizes=5120,9216,17408,33792,41984,50176,58368,66560,99328,132096,197632,263168,394240,525312,1049600,2098176,此時最大容許2MB的block。

下麵我們簡單看一下對應源代碼,涉及相關類為:
/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocator.java
BucketAllocator主要實現對bucket的組織管理,為block分配記憶體空間。

/**
   * Allocate a block with specified size. Return the offset
   * @param blockSize size of block
   * @throws BucketAllocatorException
   * @throws CacheFullException
   * @return the offset in the IOEngine
   */
  public synchronized long allocateBlock(int blockSize) throws CacheFullException,
      BucketAllocatorException {
    assert blockSize > 0;
    BucketSizeInfo bsi = roundUpToBucketSizeInfo(blockSize);
    if (bsi == null) {
      throw new BucketAllocatorException("Allocation too big size=" + blockSize +
        "; adjust BucketCache sizes " + BlockCacheFactory.BUCKET_CACHE_BUCKETS_KEY +
        " to accomodate if size seems reasonable and you want it cached.");
    }
    long offset = bsi.allocateBlock();

    // Ask caller to free up space and try again!
    if (offset < 0)
      throw new CacheFullException(blockSize, bsi.sizeIndex());
    usedSize += bucketSizes[bsi.sizeIndex()];
    return offset;
  }

在調用roundUpToBucketSizeInfo()方法後,返回結果如果為null則拋出BucketAllocatorException異常。看一下roundUpToBucketSizeInfo()方法:

/**
 * Round up the given block size to bucket size, and get the corresponding
 * BucketSizeInfo
*/
public BucketSizeInfo roundUpToBucketSizeInfo(int blockSize) {
	for (int i = 0; i < bucketSizes.length; ++i)
	  if (blockSize <= bucketSizes[i])
		return bucketSizeInfos[i];
	return null;
}

該方法將傳入的blockSize與數組bucketSizes從索引0開始取值進行比較,一旦小於bucketSize[i],則為該block分配bucketSizeInfos[i]大小的空間存放該block。

我們看一下數組bucketSizes的初始化過程:

private static final int DEFAULT_BUCKET_SIZES[] = { 4 * 1024 + 1024, 8 * 1024 + 1024,
  16 * 1024 + 1024, 32 * 1024 + 1024, 40 * 1024 + 1024, 48 * 1024 + 1024,
  56 * 1024 + 1024, 64 * 1024 + 1024, 96 * 1024 + 1024, 128 * 1024 + 1024,
  192 * 1024 + 1024, 256 * 1024 + 1024, 384 * 1024 + 1024,
  512 * 1024 + 1024 };

private final int[] bucketSizes;
BucketAllocator(long availableSpace, int[] bucketSizes)
  throws BucketAllocatorException {
  this.bucketSizes = bucketSizes == null ? DEFAULT_BUCKET_SIZES : bucketSizes;
  Arrays.sort(this.bucketSizes);
  ...
}

可以看到,如果bucketSizes == null預設取數組DEFAULT_BUCKET_SIZES的值,並對該數組進行排序。這一步的排序為上一步的迴圈比較奠定了基礎。

而數組DEFAULT_BUCKET_SIZES的值,也就是參數hbase.bucketcache.bucket.sizes的預設值。

掃描二維碼關註博主公眾號

轉載請註明出處!歡迎關註本人微信公眾號【HBase工作筆記】


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

-Advertisement-
Play Games
更多相關文章
  • 處理器及其調度 1. 處理器 用於執行指令對數據進行加工處理。 具有的機制: 寄存器:寄存器有多種,主要的作用是構成處理器的工作現場 指令系統 非特權指令 特權指令:操作系統核心程式使用的指令 處理器狀態及切換 處理器狀態的分類:管理狀態(管態)、用戶狀態(目態) Intel Pentium 的處理 ...
  • 許可權管理命令 許可權位含義 chmod chown chgrp umask預設許可權 許可權位含義 chmod 英文原意:change file mode bits 功能:修改文件的許可權模式 語法:chmod 選項[ R] 許可權模式 文件名 chown 英文原意:change file owner and ...
  • 一、查看某個埠接收到的數據 [root@localhost ~]# tcpdump -i eth0 port 3120 # 監聽從3120埠進來的數據包 [root@localhost ~]# tcpdump -s 0 -X 'tcp dst port 3120' 1. 其中etho為網卡名稱, ...
  • 在大學時代,Vim 的大名就已如雷貫耳,但由於它陡峭的學習曲線,一直望而卻步。等真正開始學習之後,發現並沒有想象中的複雜,也沒有所謂的瓶頸,只要在實際寫代碼中強迫自己使用就可以了,無形中就會形成習慣。 ​ —— "GeekPlux" 三種模式 正常模式 以 vim 打開一個檔案就直接進入一般模式了( ...
  • Linux中的一切皆文件,並且Linux中文件目錄也是有講究的。 ...
  • 海思視頻緩存池 cat /proc/media-mem 查看mmz記憶體使用情況,找到VB申請情況如下:(單位:kb) cat /proc/umap/vb 查看VB申請情況,(單位:byte) 通過計算發現大小是一致的。 不斷地查看VB的使用情況: 發現不同時刻poolid0中的緩衝塊的使用模塊是不同 ...
  • winform或者wpf項目中難免會遇到忘記捕獲的異常的代碼塊,c#為我們提供了全局捕獲異常的機制 winform中在Program.cs中這樣寫 static class Program { [STAThread] static void Main() { Application.SetUnhan ...
  • 基本GCC命令的使用 GCC是一套由GNU項目開發的編程語言編譯器,可處理C語言、 C++、Fortran、Pascal、Objective C、Java等等。GCC通常是 跨平臺軟體的編譯器首選。gcc是GCC套件中的編譯驅動程式名。 若電腦是x86 64位系統,為了編譯成IA 32指令集, 則 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...