HBase在大數據量併發寫入時,寫一段時間後HBase監控界面出現告警,寫入程序日誌裏頻繁出現異常java.util.concurrent.RejectedExecutionException:html
從異常堆棧信息能夠看出是flush請求時被拒絕引發的,覈對一下flush的代碼。java
咱們單位辦公電腦在內網裏,不便粘貼代碼和異常信息,這裏手動寫幾行代碼大致說明狀況。併發
1 Configuration conf = HBaseConfiguration.create(); 2 Connection connection = ConnectionFactory.createConnection(conf); 3 Table table = null; 4 try (Admin admin = connection.getAdmin()) { 5 TableName tableName = TableName.valueOf("test:table"); 6 table = connection.getTable(tableName); 7 table.put(puts);//List<Put> puts 8 admin.flush(tableName); 9 } finally { 10 if (table != null) { 11 table.close(); 12 } 13 }
代碼是每接受到一批List<Put> puts先進行寫入而後立馬flush。在大數據量的狀況下致使flush請求太過頻繁。HBase服務端通常是配置1-2個線程來處理flush請求,因此處理不完請求。學習
這裏的flush太頻繁是不合理的,把flush機制修改成了寫入必定數據量或超過必定時間沒有後才觸發,問題就解決了。大數據
這裏順便學習一下HBase觸發flush的條件。引用前輩的連接吧,已經總結的很不錯了。https://www.iteblog.com/archives/2497.htmlspa