我們知道,數據達到HBase服務端會寫WAL-寫Memstore,然後定期或滿足一定條件時刷寫磁碟生成一個HFile文件,隨著時間推移生成的HFile會越來越多,將會影響HBase查詢性能,同時會對HDFS造成一定影響。因此HBase會定期執行Compaction操作以合併減少HFile數量。
HBase中Compaction分為兩種。Minor Compaction稱為小合併,主要是選取一些小的、相鄰的HFile將他們合併成較大的HFile,並刪除HFile中的過期數據。Major Compaction稱為大合併,會將一個列族下的所有HFile合併成一個大的HFile,同時刪除過期數據、已刪除數據(打了Delete標記的)、版本過大的數據等三類無效數據。1).hbase.hstore.compaction.min
默認值 3,一個列族下的HFile數量超過該值就會觸發Minor Compaction,這個參數默認值小了,一般情況下建議調大到5~10之間,注意相應調整下一個參數。(舊版本中該參數是hbase.hstore.compactionthreshold)2).hbase.hstore.compaction.max默認值 10,一次Minor Compaction最多合併的HFile文件數量,這個參數基本控制著一次壓縮即Compaction的耗時。這個參數要比上一個參數hbase.hstore.compaction.min值大,通常是其2~3倍。3).hbase.regionserver.thread.compaction.throttleHBase RS內部設計了兩個線程池:large compactions與small compactions,用來分開處理Compaction操作,這個參數就是控制一個Compaction應該交由哪一個線程池處理,默認值2 * hbase.hstore.compaction.max * hbase.hregion.memstore.flush.size,即2*10*128M=2.5G,如果待合併文件的總大小大於該值則交給large compactions線程池處理,否則交給small compactions線程池處理。一般建議不調整或稍微調大。
4).hbase.regionserver.thread.compaction.small
默認值 1,RS中small compactions線程池的大小。一般建議調整到2~5,不建議調太大,否則可能會消費過多的服務端資源得不償失。
5).hbase.regionserver.thread.compaction.large
默認值 1,RS中large compactions線程池的大小。調整建議同上。
6).hbase.hstore.blockingStoreFiles
默認值 10,一個列族下HFile數量達到該值就會阻塞寫入,等待Compaction完成。生產環境中默認值太小了,一般建議設置大點比如100,避免出現阻塞更新的情況。
7).hbase.hregion.majorcompaction