HBase性能優化方法總結(3):寫表操作

openkk 12年前發布 | 12K 次閱讀 web開發人員 Rikulo Stream

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

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

2. 寫表操作

2.1 多HTable并發寫

創建多個HTable客戶端用于寫操作,提高寫數據的吞吐量,一個例子:

    static final Configuration conf = HBaseConfiguration.create();  
    static final String table_log_name = “user_log”;  
    wTableLog = new HTable[tableN];  
    for (int i = 0; i < tableN; i++) {  
        wTableLog[i] = new HTable(conf, table_log_name);  
        wTableLog[i].setWriteBufferSize(5 * 1024 * 1024); //5MB  
        wTableLog[i].setAutoFlush(false);  
    }  

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高的情景下可能帶來明顯的 性能提升。

2.4 多線程并發寫

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

    for (int i = 0; i < threadN; i++) {  
        Thread th = new Thread() {  
            public void run() {  
                while (true) {  
                    try {  
                        sleep(1000); //1 second  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
    synchronized (wTableLog[i]) {  
                        try {  
                            wTableLog[i].flushCommits();  
                        } catch (IOException e) {  
                            e.printStackTrace();  
                        }  
                    }  
                }  
    }  
        };  
        th.setDaemon(true);  
        th.start();  
    }  

轉載自:http://www.cnblogs.com/panfeng412/archive/2012/03/08/hbase-performance-tuning-section2.html

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!