HBase-Region太多的問題簡單總結

期待l發表於2018-12-19

後果

  • 我們知道一個RegionServer上有n個region,每個region會根據不同的col family數擁有不同的store,每個store有一塊自己的memstore記憶體區和多個HFile檔案,所以在region很多的情況下,平均RegionServer分擔的Region就會多了,那麼一臺RegionServer上資源是優先的,並且多個region都有自己的memstore,所以就會爭搶資源,一直與memstore比較小了,所以在memstore很小的時候,就會頻繁的刷HFile,那麼memstore刷出來的HFile也就相應的變小了,所以為了保證HFile的數量合理,就會發生大規模的合併,那麼合併就會拖慢效能,甚至導致Full GC的發生.這就會造成RegionServer與ZK可能發生失聯,那麼就會造成一系列的錯誤

主要的問題可能會有

  • 合併風暴,因為HFile檔案多
  • 客戶端超時,因為合併可能會涉及叢集中網路的IO風暴
  • 批量載入超時,因為RegionServer太忙了無法反應,可能會報出RegionTooBusyException異常

原因

  • Region最大值設定的太小
  • 新HBase版本用了舊版本配置了,比如之前的HBase拆分上限是1G.現在是10G
  • 預分割槽不合理
  • 等等等…

解決參考

  • Region 過多的問題的最終目的是使Region總數降低,也就是說進行合併Region
  • 在0.98之前只支援離線的合併,這個過程需要暫時資料寫入,並且需要先關閉叢集然後執行合併操作,然後再啟動叢集.這樣柑橘已經沒有了學習價值了就不做筆記了
  • 0.98之前還有一個CopyTable工具可以使用,將一個表拷貝到另一個新的預分裂的表,但是這需要有個問題,就是如果你之前put或者修改資料的時候是自己定義的時間戳,那麼Copy到新表的時候,如果新表與舊錶中有重複列,並且自定義的時間戳比當前重複列的時間戳小,那麼就會造成資料的永久丟失,並且Copy一個大表的話會相當耗費時間
  • 0.98之後加入了線上合併,合併的時候將不需要關閉叢集了,將表禁用disable即可,線上合併可以通過hbase shell 或者 javaapi來操作,合併完成後,可以從HBase的web頁面看到結果

防範

  • 列族不易太多,400個擁有兩個列族的region,不如800個擁有一個列族的region
  • 保證最大的檔案大小設定為至少10G,有些region小於10G沒問題,但是要確保在必要的情況下,region能達到10GB,推薦使用視覺化工具監控region大小,留意增長速度快的region,在非高峰情況下將他們拆分
  • 有時候在負載比較小的情況下,可能會建立很多小region,為了確保region能增長到正常大小,要確保hbase.hregion.max.filesize siz的屬性設定為至少10GB,也可以將最大檔案大小設定更大,比如100GB,當使用較大的region大小的時候,我們就可以手動拆分,確保split時間合適,這是對叢集的影響最小的操作

行鍵和表設計

  • 這我總感覺有很多需要注意的地方,我會在之後學習並總結成學習筆記的

自己的總結

  • 看到這總的來說,除了行鍵和表設計自己沒有學,本文主要學習到了Region的大小不能設定太小,列族不能太多,也可以在設定split規則的情況下把大小設定的大一點以便自己在叢集非高峰的情況下進行拆分,而預設split而並非禁用split是因為防止忘記region需要需要拆分了,而導致region增長的非常大以至於速度變慢,其實結合之前學習還要相當注意Full GC的回收策略的使用等一些需要注意的事項


相關文章