2017-01-31 8 views
0

hbaseバージョン1.1.4を使用しています。 DBには約40のテーブルがあり、各テーブルデータにはTimeToLiveが指定されています。これは、5ノードのクラスタにデプロイされ、以下ではHBaseの-site.xmlのHbaseの数は増え続けています

<property> 
<name>phoenix.query.threadPoolSize</name> 
<value>2048</value> 
</property> 

<property> 
<name>hbase.hregion.max.filesize</name> 
<value>21474836480</value> 
</property> 

<property> 
<name>hbase.hregion.memstore.block.multiplier</name> 
<value>4</value> 
</property> 
<!-- default is 64MB 67108864 --> 
<property> 
<name>hbase.hregion.memstore.flush.size</name> 
<value>536870912</value> 
</property> 
<!-- default is 7, should be at least 2x compactionThreshold --> 
<property> 
<name>hbase.hstore.blockingStoreFiles</name> 
<value>240</value> 
</property> 
<property> 
<name>hbase.client.scanner.caching</name> 
<value>10000</value> 
</property> 

<property> 
<name>hbase.bucketcache.ioengine</name> 
<value>offheap</value> 
</property> 
<property> 
<name>hbase.bucketcache.size</name> 
<value>40960</value> 
</property> 

質問regionserversの各々における領域の数が成長し続けるということであるです。現在、我々は、各サーバー、または領域をマージする自動化された方法で、地域の唯一の固定数を持ってする方法はあります

merge_region in the hbase shell. 

使用して地域をマージ?

答えて

1

を見てまあそれは主にあなたのデータに依存:それは、キー全体に分散される方法。あなたのテーブルのキーはStringであり、あなたが100件の地域をしたい場合は、すべてのあなた、この場合、この

public static byte[] hashKey(String key) { 
    int partition = Math.abs(key.hashCode() % 100); 
    String prefix = partitionPrefix(partition); 
    return Bytes.add(Bytes.toBytes(prefix), ZERO_BYTE, key); 
} 

public static String partitionPrefix(int partition) { 
    return StringUtils.leftPad(String.valueOf(partition), 2, '0'); 
} 

を使用し、例えば

:あなたの値は、すべてのキーのために、ほぼ同じ大きさを持っていると仮定すると、あなたはパーティショニングを使用することができますキーの前に00〜99の番号が付いているので、100個のリージョンに対して100個のパーティションがあります。今、あなたは、領域分割を無効にすることができます

HTableDescriptor td = new HTableDescriptor(TableName.valueOf("myTable")); 
td.setRegionSplitPolicyClassName("org.apache.hadoop.hbase.regionserver.DisabledRegionSplitPolicy"); 

またはシェル経由

alter 'myTable', {TABLE_ATTRIBUTES => {METADATA => {'SPLIT_POLICY' => 'org.apache.hadoop.hbase.regionserver.DisabledRegionSplitPolicy'}} 
+0

私は今スプリットを無効にしました。すでに分割領域があるテーブルはどうですか? – sparkDabbler

+0

@ sparkDabblerパーティショニングを使用する場合は、データを新しいテーブルに転送して置き換える必要があります。分割を無効にした場合、地域の数は同じままになりますが、地域は不均衡になります – AdamSkywalker

2

サーバごとに固定数の領域しか持たない方法や、領域をマージする自動化された方法はありますか?

私がこれを実装した方法の1つは、プレプリット領域を持つテーブルを作成することです。例えば意志と

create 'test_table', 'f1', SPLITS=> ['1', '2', '3', '4', '5', '6', '7', '8', '9'] 

デザイン良いのrowKeyを使用すると、以下のようなグアバ雑音のハッシュを使用することができます

1-9から始まります。

import com.google.common.hash.HashCode; 
import com.google.common.hash.HashFunction; 
import com.google.common.hash.Hashing; 

/** 
    * getMurmurHash. 
    * 
    * @param content 
    * @return HashCode 
    */ 
    public static HashCode getMurmurHash(String content) { 
     final HashFunction hf = Hashing.murmur3_128(); 
     final HashCode hc = hf.newHasher().putString(content, Charsets.UTF_8).hash(); 
     return hc; 
    } 

final long hash = getMurmur128Hash(Bytes.toString(yourrowkey as string)).asLong(); 
      final int prefix = Math.abs((int) hash % 9); 

今例えば

1rowkey1 // //が
3rowkey3第二の領域になりますで行く//
2rowkey2第一の領域に行くあなたのrowKey

にこのプレフィックスを追加第3領域に入る
...
9rowkey9 // 9番目の領域に入る

事前分割を行い、リージョン分割を手動で管理する場合は、hbase.hregion.max.filesizeを高い数値に設定し、分割ポリシーをConstantSizeRegionSplitPolicyに設定して、リージョン分割を無効にすることもできます。ただし、100GBのようなセーフガード値を使用すると、リージョンがリージョンサーバーの機能を超えて拡大することはありません。自動分割を無効にすることを検討したり、キープレフィックスに一様なハッシュを使用している場合など、事前分割による領域の初期セットに頼ったり、各領域への読み書きの負荷とそのサイズテーブル内の領域にわたって均一である。

また、at

+0

は一様に分布ハッシュコード –

+0

はそれが有用であることを保証グアバAPIと雑音128ハッシュと私の答えを更新しましたか? –

+0

私は今スプリットを無効にしているので、地域の成長が止まるかどうかを1日待たなければならないでしょう。 – sparkDabbler

関連する問題