HBase性能優化方法總結(二):寫表操做

本文主要是從HBase應用程序設計與開發的角度,總結幾種經常使用的性能優化方法。有關HBase系統配置級別的優化,可參考:淘寶Ken Wu同窗的博客緩存

下面是本文總結的第二部份內容:寫表操做相關的優化方法。性能優化

2. 寫表操做

2.1 多HTable併發寫

建立多個HTable客戶端用於寫操做,提升寫數據的吞吐量,一個例子:網絡

複製代碼

  Configuration conf = HBaseConfiguration.create();
  String table_log_name = 「user_log」;
wTableLog =  HTable[tableN];
 ( i = 0; i < tableN; i++) {
    wTableLog[i] =  HTable(conf, table_log_name);
    wTableLog[i].setWriteBufferSize(5 * 1024 * 1024);     wTableLog[i].setAutoFlush();
}

複製代碼

2.2 HTable參數設置

2.2.1 Auto Flush

經過調用HTable.setAutoFlush(false)方法能夠將HTable寫客戶端的自動flush關閉,這樣能夠批量寫入數據到 HBase,而不是有一條put就執行一次更新,只有當put填滿客戶端寫緩存時,才實際向HBase服務端發起寫請求。默認狀況下auto flush是開啓的。多線程

2.2.2 Write Buffer

經過調用HTable.setWriteBufferSize(writeBufferSize)方法能夠設置 HTable客戶端的寫buffer大小,若是新設置的buffer小於當前寫buffer中的數據時,buffer將會被flush到服務端。其 中,writeBufferSize的單位是byte字節數,能夠根據實際寫入數據量的多少來設置該值。併發

2.2.3 WAL Flag

在HBae中,客戶端向集羣中的RegionServer提交數據時(Put/Delete操做),首先會先寫WAL(Write Ahead Log)日誌(即HLog,一個RegionServer上的全部Region共享一個HLog),只有當WAL日誌寫成功後,再接着寫 MemStore,而後客戶端被通知提交數據成功;若是寫WAL日誌失敗,客戶端則被通知提交失敗。這樣作的好處是能夠作到RegionServer宕機 後的數據恢復。函數

所以,對於相對不過重要的數據,能夠在Put/Delete操做時,經過調用Put.setWriteToWAL(false)或Delete.setWriteToWAL(false)函數,放棄寫WAL日誌,從而提升數據寫入的性能。性能

值得注意的是:謹慎選擇關閉WAL日誌,由於這樣的話,一旦RegionServer宕機,Put/Delete的數據將會沒法根據WAL日誌進行恢復。優化

2.3 批量寫

經過調用HTable.put(Put)方法能夠將一個指定的row key記錄寫入HBase,一樣HBase提供了另外一個方法:經過調用HTable.put(List<Put>)方法能夠將指定的row key列表,批量寫入多行記錄,這樣作的好處是批量執行,只須要一次網絡I/O開銷,這對於對數據實時性要求高,網絡傳輸RTT高的情景下可能帶來明顯的 性能提高。spa

2.4 多線程併發寫

在客戶端開啓多個HTable寫線程,每一個寫線程負責一個HTable對象的flush操做,這樣結合定時flush和寫 buffer(writeBufferSize),能夠既保證在數據量小的時候,數據能夠在較短期內被flush(如1秒內),同時又保證在數據量大的 時候,寫buffer一滿就及時進行flush。下面給個具體的例子:線程

複製代碼

 ( i = 0; i < threadN; i++) {
    Thread th =  Thread() {
          run() {
             () {
                 {
                    sleep(1000);                 }  (InterruptedException e) {
                    e.printStackTrace();
                }
 (wTableLog[i]) {
                     {
                        wTableLog[i].flushCommits();
                    }  (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
}
    };
    th.setDaemon();
    th.start();
}

複製代碼

相關文章
相關標籤/搜索