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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

HBase性能优化方法总结(2):表的设计

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

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

下面是本文總結的第一部分內容:表的設計相關的優化方法。

1. 表的設計

1.1 Pre-Creating Regions

默認情況下,在創建HBase表的時候會自動創建一個region分區,當導入數據的時候,所有的HBase客戶端都向這一個region寫數據,直到這個region足夠大了才進行切分。一種可以加快批量寫入速度的方法是通過預先創建一些空的regions,這樣當數據寫入HBase時,會按照region分區情況,在集群內做數據的負載均衡。

有關預分區,詳情參見:Table Creation: Pre-Creating Regions,下面是一個例子:

[java]?view plaincopy
  • public?static?boolean?createTable(HBaseAdmin?admin,?HTableDescriptor?table,?byte[][]?splits)??
  • throws?IOException?{??
  • ??try?{??
  • ????admin.createTable(table,?splits);??
  • ????return?true;??
  • ??}?catch?(TableExistsException?e)?{??
  • ????logger.info("table?"?+?table.getNameAsString()?+?"?already?exists");??
  • ????//?the?table?already?exists...??
  • ????return?false;????
  • ??}??
  • }??
  • ??
  • public?static?byte[][]?getHexSplits(String?startKey,?String?endKey,?int?numRegions)?{??
  • ??byte[][]?splits?=?new?byte[numRegions-1][];??
  • ??BigInteger?lowestKey?=?new?BigInteger(startKey,?16);??
  • ??BigInteger?highestKey?=?new?BigInteger(endKey,?16);??
  • ??BigInteger?range?=?highestKey.subtract(lowestKey);??
  • ??BigInteger?regionIncrement?=?range.divide(BigInteger.valueOf(numRegions));??
  • ??lowestKey?=?lowestKey.add(regionIncrement);??
  • ??for(int?i=0;?i?<?numRegions-1;i++)?{??
  • ????BigInteger?key?=?lowestKey.add(regionIncrement.multiply(BigInteger.valueOf(i)));??
  • ????byte[]?b?=?String.format("6x",?key).getBytes();??
  • ????splits[i]?=?b;??
  • ??}??
  • ??return?splits;??
  • }??

  • 1.2 Row Key

    HBase中row key用來檢索表中的記錄,支持以下三種方式:

    • 通過單個row key訪問:即按照某個row key鍵值進行get操作;
    • 通過row key的range進行scan:即通過設置startRowKey和endRowKey,在這個范圍內進行掃描;
    • 全表掃描:即直接掃描整張表中所有行記錄。

    在HBase中,row key可以是任意字符串,最大長度64KB,實際應用中一般為10~100bytes,存為byte[]字節數組,一般設計成定長的

    row key是按照字典序存儲,因此,設計row key時,要充分利用這個排序特點,將經常一起讀取的數據存儲到一塊,將最近可能會被訪問的數據放在一塊。

    舉個例子:如果最近寫入HBase表中的數據是最可能被訪問的,可以考慮將時間戳作為row key的一部分,由于是字典序排序,所以可以使用Long.MAX_VALUE - timestamp作為row key,這樣能保證新寫入的數據在讀取時可以被快速命中。

    1.3 Column Family

    不要在一張表里定義太多的column family。目前Hbase并不能很好的處理超過2~3個column family的表。因為某個column family在flush的時候,它鄰近的column family也會因關聯效應被觸發flush,最終導致系統產生更多的I/O。感興趣的同學可以對自己的HBase集群進行實際測試,從得到的測試結果數據驗證一下。

    1.4 In Memory

    創建表的時候,可以通過HColumnDescriptor.setInMemory(true)將表放到RegionServer的緩存中,保證在讀取的時候被cache命中。

    1.5 Max Version

    創建表的時候,可以通過HColumnDescriptor.setMaxVersions(int?maxVersions)設置表中數據的最大版本,如果只需要保存最新版本的數據,那么可以設置setMaxVersions(1)。

    1.6 Time To Live

    創建表的時候,可以通過HColumnDescriptor.setTimeToLive(int timeToLive)設置表中數據的存儲生命期,過期數據將自動被刪除,例如如果只需要存儲最近兩天的數據,那么可以設置setTimeToLive(2 * 24 * 60 * 60)。

    1.7 Compact & Split

    在HBase中,數據在更新時首先寫入WAL 日志(HLog)和內存(MemStore)中,MemStore中的數據是排序的,當MemStore累計到一定閾值時,就會創建一個新的MemStore,并且將老的MemStore添加到flush隊列,由單獨的線程flush到磁盤上,成為一個StoreFile。于此同時,系統會在zookeeper中記錄一個redo point,表示這個時刻之前的變更已經持久化了(minor compact)

    StoreFile是只讀的,一旦創建后就不可以再修改。因此Hbase的更新其實是不斷追加的操作。當一個Store中的StoreFile達到一定的閾值后,就會進行一次合并(major compact),將對同一個key的修改合并到一起,形成一個大的StoreFile,當StoreFile的大小達到一定閾值后,又會對 StoreFile進行分割(split),等分為兩個StoreFile。

    由于對表的更新是不斷追加的,處理讀請求時,需要訪問Store中全部的StoreFile和MemStore,將它們按照row key進行合并,由于StoreFile和MemStore都是經過排序的,并且StoreFile帶有內存中索引,通常合并過程還是比較快的。

    實際應用中,可以考慮必要時手動進行major compact,將同一個row key的修改進行合并形成一個大的StoreFile。同時,可以將StoreFile設置大些,減少split的發生。

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

  • public?static?boolean createTable(HBaseAdmin admin, HTableDescriptor table, byte[][] splits)?
  • throws IOException {?
  • ? try {?
  • ??? admin.createTable(table, splits);?
  • ??? return?true;?
  • ? } catch (TableExistsException e) {?
  • ??? logger.info("table " + table.getNameAsString() + " already exists");?
  • ??? // the table already exists...?
  • ??? return?false;???
  • ? }?
  • }?
  • ?
  • public?static?byte[][] getHexSplits(String startKey, String endKey, int numRegions) {?
  • ? byte[][] splits = new?byte[numRegions-1][];?
  • ? BigInteger lowestKey = new BigInteger(startKey, 16);?
  • ? BigInteger highestKey = new BigInteger(endKey, 16);?
  • ? BigInteger range = highestKey.subtract(lowestKey);?
  • ? BigInteger regionIncrement = range.divide(BigInteger.valueOf(numRegions));?
  • ? lowestKey = lowestKey.add(regionIncrement);?
  • ? for(int i=0; i < numRegions-1;i++) {?
  • ??? BigInteger key = lowestKey.add(regionIncrement.multiply(BigInteger.valueOf(i)));?
  • ??? byte[] b = String.format("6x", key).getBytes();?
  • ??? splits[i] = b;?
  • ? }?
  • ? return splits;?
  • }?

  • 1.2 Row Key

    HBase中row key用來檢索表中的記錄,支持以下三種方式:

    • 通過單個row key訪問:即按照某個row key鍵值進行get操作;
    • 通過row key的range進行scan:即通過設置startRowKey和endRowKey,在這個范圍內進行掃描;
    • 全表掃描:即直接掃描整張表中所有行記錄。

    在HBase中,row key可以是任意字符串,最大長度64KB,實際應用中一般為10~100bytes,存為byte[]字節數組,一般設計成定長的

    row key是按照字典序存儲,因此,設計row key時,要充分利用這個排序特點,將經常一起讀取的數據存儲到一塊,將最近可能會被訪問的數據放在一塊。

    舉個例子:如果最近寫入HBase表中的數據是最可能被訪問的,可以考慮將時間戳作為row key的一部分,由于是字典序排序,所以可以使用Long.MAX_VALUE - timestamp作為row key,這樣能保證新寫入的數據在讀取時可以被快速命中。

    1.3 Column Family

    不要在一張表里定義太多的column family。目前Hbase并不能很好的處理超過2~3個column family的表。因為某個column family在flush的時候,它鄰近的column family也會因關聯效應被觸發flush,最終導致系統產生更多的I/O。感興趣的同學可以對自己的HBase集群進行實際測試,從得到的測試結果數據驗證一下。

    1.4 In Memory

    創建表的時候,可以通過HColumnDescriptor.setInMemory(true)將表放到RegionServer的緩存中,保證在讀取的時候被cache命中。

    1.5 Max Version

    創建表的時候,可以通過HColumnDescriptor.setMaxVersions(int maxVersions)設置表中數據的最大版本,如果只需要保存最新版本的數據,那么可以設置setMaxVersions(1)。

    1.6 Time To Live

    創建表的時候,可以通過HColumnDescriptor.setTimeToLive(int timeToLive)設置表中數據的存儲生命期,過期數據將自動被刪除,例如如果只需要存儲最近兩天的數據,那么可以設置setTimeToLive(2 * 24 * 60 * 60)。

    1.7 Compact & Split

    在HBase中,數據在更新時首先寫入WAL 日志(HLog)和內存(MemStore)中,MemStore中的數據是排序的,當MemStore累計到一定閾值時,就會創建一個新的MemStore,并且將老的MemStore添加到flush隊列,由單獨的線程flush到磁盤上,成為一個StoreFile。于此同時,系統會在zookeeper中記錄一個redo point,表示這個時刻之前的變更已經持久化了(minor compact)

    StoreFile是只讀的,一旦創建后就不可以再修改。因此Hbase的更新其實是不斷追加的操作。當一個Store中的StoreFile達到一定的閾值后,就會進行一次合并(major compact),將對同一個key的修改合并到一起,形成一個大的StoreFile,當StoreFile的大小達到一定閾值后,又會對 StoreFile進行分割(split),等分為兩個StoreFile。

    由于對表的更新是不斷追加的,處理讀請求時,需要訪問Store中全部的StoreFile和MemStore,將它們按照row key進行合并,由于StoreFile和MemStore都是經過排序的,并且StoreFile帶有內存中索引,通常合并過程還是比較快的。

    實際應用中,可以考慮必要時手動進行major compact,將同一個row key的修改進行合并形成一個大的StoreFile。同時,可以將StoreFile設置大些,減少split的發生。

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

    總結

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

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