日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HBase性能优化方法总结(3):写表操作

發布時間:2025/7/14 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HBase性能优化方法总结(3):写表操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

2. 寫表操作

2.1 多HTable并發寫

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

[java]?view plaincopy
  • 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。下面給個具體的例子:

    [java]?view plaincopy
  • 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
  • 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。下面給個具體的例子:

    [java]?view plaincopy
  • 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

    總結

    以上是生活随笔為你收集整理的HBase性能优化方法总结(3):写表操作的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。