本文主要是從HBase應用程序設計與開發的角度,總結幾種經常使用的性能優化方法。有關HBase系統配置級別的優化,可參考:淘寶Ken Wu同窗的博客。緩存
下面是本文總結的第二部份內容:寫表操做相關的優化方法。性能優化
建立多個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(); }
經過調用HTable.setAutoFlush(false)方法能夠將HTable寫客戶端的自動flush關閉,這樣能夠批量寫入數據到 HBase,而不是有一條put就執行一次更新,只有當put填滿客戶端寫緩存時,才實際向HBase服務端發起寫請求。默認狀況下auto flush是開啓的。多線程
經過調用HTable.setWriteBufferSize(writeBufferSize)方法能夠設置 HTable客戶端的寫buffer大小,若是新設置的buffer小於當前寫buffer中的數據時,buffer將會被flush到服務端。其 中,writeBufferSize的單位是byte字節數,能夠根據實際寫入數據量的多少來設置該值。併發
在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日誌進行恢復。優化
經過調用HTable.put(Put)方法能夠將一個指定的row key記錄寫入HBase,一樣HBase提供了另外一個方法:經過調用HTable.put(List<Put>)方法能夠將指定的row key列表,批量寫入多行記錄,這樣作的好處是批量執行,只須要一次網絡I/O開銷,這對於對數據實時性要求高,網絡傳輸RTT高的情景下可能帶來明顯的 性能提高。spa
在客戶端開啓多個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(); }