[HADOOP] 지역의 HBase를 번호는 성장 계속
HADOOP지역의 HBase를 번호는 성장 계속
우리는 HBase를 버전 1.1.4을 사용하고 있습니다. DB를은 40 표를 가지고 있으며, 각 테이블의 데이터는 지정의 TimeToLive 있습니다. 그것은 5 노드 클러스터에 배포하고, 다음은 HBase를-site.xml 파일입니다
<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.글쎄 그것은 주로 데이터에 따라 달라집니다 : 그것은 키에 분산되는 방법. 당신의 가치는 모든 키에 대한 거의 같은 크기를 가정하면 파티션을 사용할 수 있습니다 :
글쎄 그것은 주로 데이터에 따라 달라집니다 : 그것은 키에 분산되는 방법. 당신의 가치는 모든 키에 대한 거의 같은 크기를 가정하면 파티션을 사용할 수 있습니다 :
테이블 키를 문자열이며 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'}}
-
==============================
2.내가 이것을 구현하는 한 가지 방법은 presplit 지역으로 테이블을 만드는 것입니다. 예를 들면
내가 이것을 구현하는 한 가지 방법은 presplit 지역으로 테이블을 만드는 것입니다. 예를 들면
create 'test_table', 'f1', SPLITS=> ['1', '2', '3', '4', '5', '6', '7', '8', '9']
뜻이 1-9로 시작하여 좋은 rowkey 설계
아래처럼 구아바 중얼 거림 해시를 사용할 수 있습니다.
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 //은 제 1 영역에 갈 것입니다 2rowkey2 //은 제 2 영역에 갈 것입니다 3rowkey3 //은 제 3 영역에 갈 것입니다 ... 9rowkey9 //는 아홉 번째 지역에 갈 것입니다
당신이 미리 분할을하고, 수동 지역 분할을 관리하려는 경우, 당신은 또한 높은 숫자로 hbase.hregion.max.filesize를 설정하고 ConstantSizeRegionSplitPolicy에 분할 정책을 설정하여, 지역 분할을 사용하지 않도록 설정할 수 있습니다. 지역은 지역 서버의 기능 이상으로 성장하지 않도록 그러나, 100기가바이트 등의 보호 값을 사용해야합니다. 당신은 자동 분할을 사용하지 않는 것이 당신이 당신의 키 접두사 균일 한 해시를 사용하는 경우, 예를 들어 사전 분할에서 지역의 초기 설정에 의존, 당신은 보장 할 수있는 읽기 / 쓰기 각 지역에 부하뿐만 아니라 그 크기 테이블의 영역에 걸쳐 균일하다.
또한,보고
from https://stackoverflow.com/questions/41968676/hbase-number-of-regions-keep-growing by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 지역 사용하여 자바로 FTP에서 파일을 다운로드하면 파일을 읽을 수 있습니다 - 인코딩 문제를 (0) | 2019.10.12 |
---|---|
[HADOOP] 어떻게 실행 고정 표시기 컨테이너에서 명령을 실행하려면? (0) | 2019.10.12 |
[HADOOP] 계단식의 직교 제품 (0) | 2019.10.12 |
[HADOOP] 하둡 맵리 듀스에서 XML 파싱 (0) | 2019.10.12 |
[HADOOP] 로컬 또는 맵리 듀스 모드에서 문제 실행 돼지 (0) | 2019.10.12 |