HBase性能優化一:寫表操作

1.HTable參數設置

1.1 Auto Flush

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

1.2 Write Buffer

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

1.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.批量寫

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

3.併發寫

多個節點上百線程的併發寫

4.表優化

4.1 預分區

默認情況下,在創建表的時候會自動創建一個region分區,當寫入數據時候,所有的HBase客戶端都會往這個region寫數據,直到這個region的達到設置的閾值(默認是256M,可以通過hbase.hregion.max.filesize設置)才進行split切分。所以,在我們創建HBase表的時候,如果預先知道我們的數據量大小,是可以進行創建一些預分區,這樣數據寫入時,會按照region的分區情況,在集羣內做數據的負載均衡

4.2 rowkey的設計




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章