2015-10-19 43 views
1

我用這個TTL創建表:HBase的區域請求不能平衡

create "aos:for_test", {NAME => "data", COMPRESSION => "LZO"}, {NUMREGIONS => 240, SPLITALGO => "UniformSplit"} 

並導入大數據文件(14G附近)表。即使有240米的區域爲表,客戶端報錯像如下:

Error: org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 1822 actions: RegionTooBusyException: 1822 times

我檢查HBase的WebUI和發現所有的請求都只投中一個區。我無法弄清楚爲什麼寫請求對所有區域都不平衡。

但是,如果我改變這樣的TTL:

create "aos:for_test", {NAME => "data", COMPRESSION => "LZO"}, {SPLITS => ['00000','00001','00002','00003','00004','00005','00006','00007','00008','00009','00009p','00009q','00009r','00009s']} 

一切工作。

+0

什麼是配置區域拆分策略?如果它是ConstantSizeRegionSplitPolicy,那麼所有的請求都會到達相同的區域,直到達到閾值大小。 – Ramana

+0

我沒有配置策略。我不知道什麼是默認值。來自HBase 0.94+的 –

+0

,默認區域溢出策略是IncreasingToUpperBoundRegionSplitPolicy。請驗證hbase-site.xml中的hbase.hregion.max.filesize屬性值。有關更多詳細信息,請參閱http://hortonworks.com/blog/apache-hbase-region-splitting-and-merging/ – Ramana

回答

0

您有兩個解決問題的變體。

首先修改它將是一個隨機分佈在不同區域的原始密鑰。如果可以通過對原始密鑰進行散列(例如,md5 vs雜音散列函數)並使用像這樣的舊密鑰的散列和值組成的新密鑰來完成,則可以使用這種新密鑰

byte[] newKye = Bytes.add(hashOfOldKeyBytes, oldKeyBytes)

第二差異,隨機抽取1%的數據並計算密鑰分配基礎。然後基於這個數據定義一個區域分裂。下面的代碼片段來做到這一點在Java語言。

byte[][] keys // key from 1% of data 

Collections.sort(splitList, new Comparator<byte[]>() { 
     @Override 
     public int compare(byte[] o1, byte[] o2) { 
      return Bytes.compareTo(o1, o2); 
     } 
    });  

byte[][] splitKeys = new byte[numberOfRegions][]; 
for (int i = 0; i < numberOfRegions; i++) { 
      splitKeys[i] = keys[(i + 1) * keys.length/(numberOfRegions + 1)];  
} 

admin.createTable(tableDescriptor, splitKeys);