복붙노트

[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. ==============================

    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. ==============================

    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기가바이트 등의 보호 값을 사용해야합니다. 당신은 자동 분할을 사용하지 않는 것이 당신이 당신의 키 접두사 균일 한 해시를 사용하는 경우, 예를 들어 사전 분할에서 지역의 초기 설정에 의존, 당신은 보장 할 수있는 읽기 / 쓰기 각 지역에 부하뿐만 아니라 그 크기 테이블의 영역에 걸쳐 균일하다.

    또한,보고

  3. from https://stackoverflow.com/questions/41968676/hbase-number-of-regions-keep-growing by cc-by-sa and MIT license