2017-01-31 11 views
0

Мы используем hbase версию 1.1.4. БД содержит около 40 таблиц, и каждая таблица имеет заданное значение TimeToLive. Он развернут на кластере 5 узлов, а следующий будет HBase-site.xmlHbase количество регионов продолжает расти

<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

Есть ли способ иметь только фиксированное количество регионов на каждом сервере или автоматизированный способ объединения регионов?

Один из способов, который я реализовал, это создать таблицу с областями препринта. например

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); 

Теперь добавьте этот префикс к вашему RowKey

Например

1rowkey1 // будет идти к первой области
2rowkey2 // будет идти на второй области
3rowkey3 // будет перейти к третьему региону
...
9rowkey9 // войдет в девятую область

Если вы делаете предварительное разделение и хотите вручную управлять разбиениями на разделы, вы также можете отключить разбиение областей, установив hbase.hregion.max.filesize на большое количество и установив политику разделения на ConstantSizeRegionSplitPolicy. Однако вы должны использовать защитную ценность как 100 ГБ, чтобы регионы не превышали возможности сервера региона. Вы можете рассмотреть возможность отключения автоматического разделения и полагаться на исходный набор областей от предварительного разбиения, например, если вы используете единые хэши для своих префикс ключей, и вы можете обеспечить загрузку чтения/записи в каждый регион, а также его размер равномерно по всем регионам таблицы.

Кроме того, посмотрите at

+0

обновили мой ответ с ропотом 128 хэша с гуавой API, который гарантирует, что равномерно распределенная хэш-код –

+0

была полезны? не стесняйтесь задавать вопросы, если у вас есть –

+0

У меня отключены расколы сейчас, вам придется подождать один день, чтобы увидеть, останавливается ли рост регионов. – sparkDabbler

 Смежные вопросы

  • Нет связанных вопросов^_^