복붙노트

[HADOOP] Hbase 신속하게 행 개수를 계산

HADOOP

Hbase 신속하게 행 개수를 계산

지금은 ResultScanner에 비해 행 수를 구현하고 있습니다.

for (Result rs = scanner.next(); rs != null; rs = scanner.next()) {
    number++;
}

수백만 시간의 컴퓨팅 시간에 도달하는 데이터가 클 경우 실시간으로 Mapreduce를 사용하고 싶지 않습니다.

얼마나 빨리 행 수를 계산합니다.

해결법

  1. ==============================

    1.HBase에서 RowCounter 사용 RowCounter는 테이블의 모든 행을 계산하는 mapreduce 작업입니다. 이는 메타 데이터 불일치에 대한 우려가있는 경우 HBase가 테이블의 모든 블록을 읽을 수 있는지 확인하기위한 온 전성 검사로 사용할 수있는 좋은 유틸리티입니다. 단일 프로세스에서 mapreduce를 모두 실행하지만 MapReduce 클러스터가 악용 될 경우 더 빠르게 실행됩니다.

    HBase에서 RowCounter 사용 RowCounter는 테이블의 모든 행을 계산하는 mapreduce 작업입니다. 이는 메타 데이터 불일치에 대한 우려가있는 경우 HBase가 테이블의 모든 블록을 읽을 수 있는지 확인하기위한 온 전성 검사로 사용할 수있는 좋은 유틸리티입니다. 단일 프로세스에서 mapreduce를 모두 실행하지만 MapReduce 클러스터가 악용 될 경우 더 빠르게 실행됩니다.

    $ hbase org.apache.hadoop.hbase.mapreduce.RowCounter <tablename>
    
    Usage: RowCounter [options] 
        <tablename> [          
            --starttime=[start] 
            --endtime=[end] 
            [--range=[startKey],[endKey]] 
            [<column1> <column2>...]
        ]
    
  2. ==============================

    2.hbase의 count 메소드를 사용하여 행 수를 계산할 수 있습니다. 하지만 네, 대형 테이블의 행을 세는 속도가 느려질 수 있습니다. 'tablename'[간격]

    hbase의 count 메소드를 사용하여 행 수를 계산할 수 있습니다. 하지만 네, 대형 테이블의 행을 세는 속도가 느려질 수 있습니다. 'tablename'[간격]

    반환 값은 행 수입니다.

    이 작업은 오랜 시간이 걸릴 수 있습니다 (Run '$ HADOOP_HOME / bin / hadoop jar hbase.jar rowcount '를 사용하면 카운팅 mapreduce 작업을 실행할 수 있습니다.) 현재 카운트가 표시됩니다. 1000 행마다 기본적으로 카운트 간격은 선택적으로 지정할 수 있습니다. 주사 기본적으로 카운트 검색시 캐싱이 활성화됩니다. 기본 캐시 크기는 10 행입니다. 행 크기가 작은 경우이 값을 늘릴 수 있습니다. 매개 변수.

    예 :

    hbase> count 't1'
    
    hbase> count 't1', INTERVAL => 100000
    
    hbase> count 't1', CACHE => 1000
    
    hbase> count 't1', INTERVAL => 10, CACHE => 1000
    

    동일한 명령을 테이블 참조에서도 실행할 수 있습니다. 테이블 't1'에 대한 참조가 있다고 가정하면 해당 명령은 다음과 같습니다.

    hbase> t.count
    
    hbase> t.count INTERVAL => 100000
    
    hbase> t.count CACHE => 1000
    
    hbase> t.count INTERVAL => 10, CACHE => 1000
    
  3. ==============================

    3.HBase에 포함 된 행 카운트 맵 / 축소 작업 사용

    HBase에 포함 된 행 카운트 맵 / 축소 작업 사용

  4. ==============================

    4.어떠한 이유에서든 RowCounter를 사용할 수 없다면,이 두 필터의 조합이 카운트를 얻는 최적의 방법이어야합니다.

    어떠한 이유에서든 RowCounter를 사용할 수 없다면,이 두 필터의 조합이 카운트를 얻는 최적의 방법이어야합니다.

    FirstKeyOnlyFilter() AND KeyOnlyFilter()
    

    FirstKeyOnlyFilter는 스캐너가 테이블의 모든 열 한정자를 반환하는 것과는 달리 스캐너가 찾은 첫 번째 열 한정자 만 반환하므로 네트워크 대역폭이 최소화됩니다. 반환하는 데 하나의 열 한정자를 선택하는 것은 어떻습니까? 이것은 모든 행에 대해 열 한정어가 존재할 수 있지만 그 값이 참이 아니라면 부정확 한 수를 얻을 수있는 경우에 작동합니다.

    KeyOnlyFilter는 스캐너가 열 패밀리 만 반환하도록하며 열 한정자에 대한 값을 반환하지 않습니다. 이것은 네트워크 대역폭을 줄여 주는데, 일반적으로 감소의 대부분을 설명하지는 않지만 이전 필터로 선택한 첫 번째 열이 매우 큰 값이되는 경우가 있습니다.

    나는 scan.setCaching으로 놀아 보았지만 그 결과는 도처에 있었다. 아마 그것은 도움이 될 수 있습니다.

    나는 시작과 멈춤 사이에 1600 만 행을 가졌는데, 나는 다음과 같은 의사 경험적 테스트를했다.

    With FirstKeyOnlyFilter and KeyOnlyFilter activated:
    
        With caching not set (i.e., the default value), it took 188 seconds.
        With caching set to 1, it took 188 seconds
        With caching set to 10, it took 200 seconds
        With caching set to 100, it took 187 seconds
        With caching set to 1000, it took 183 seconds.
        With caching set to 10000, it took 199 seconds.
        With caching set to 100000, it took 199 seconds.
    
    With FirstKeyOnlyFilter and KeyOnlyFilter disabled:
    
        With caching not set, (i.e., the default value), it took 309 seconds
    
    

    나는 이것에 대해 적절한 테스트를 수행하지는 않았지만 FirstKeyOnlyFilter와 KeyOnlyFilter가 좋다는 것이 분명해 보입니다.

    또한,이 특정 테이블의 셀은 매우 작습니다. 그래서 필터가 다른 테이블에서 더 좋았을 것입니다.

    다음은 Java 코드 샘플입니다.

    import java.io.IOException;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.client.HTable;
    import org.apache.hadoop.hbase.client.Result;
    import org.apache.hadoop.hbase.client.ResultScanner;
    import org.apache.hadoop.hbase.client.Scan;
    import org.apache.hadoop.hbase.util.Bytes;
    
    import org.apache.hadoop.hbase.filter.RowFilter;
    import org.apache.hadoop.hbase.filter.KeyOnlyFilter; 
    import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter; 
    import org.apache.hadoop.hbase.filter.FilterList;
    
    import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
    import org.apache.hadoop.hbase.filter.RegexStringComparator; 
    
    public class HBaseCount {
        public static void main(String[] args) throws IOException {
            Configuration config = HBaseConfiguration.create();
    
            HTable table = new HTable(config, "my_table");
    
            Scan scan = new Scan(
                Bytes.toBytes("foo"), Bytes.toBytes("foo~")
            );
    
            if (args.length == 1) {
                scan.setCaching(Integer.valueOf(args[0]));
            }
            System.out.println("scan's caching is " + scan.getCaching());
    
            FilterList allFilters = new FilterList();
            allFilters.addFilter(new FirstKeyOnlyFilter());
            allFilters.addFilter(new KeyOnlyFilter());
    
            scan.setFilter(allFilters);
    
            ResultScanner scanner = table.getScanner(scan);
    
            int count = 0;
    
            long start = System.currentTimeMillis();
    
            try {
                for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {
                    count += 1;
                    if (count % 100000 == 0) System.out.println(count);
                }
            } finally {
                scanner.close();
            }
    
            long end = System.currentTimeMillis();
    
            long elapsedTime = end - start;
    
            System.out.println("Elapsed time was " + (elapsedTime/1000F));
    
        }
    }
    
    

    다음은 pychbase 코드 샘플입니다.

        from pychbase import Connection
        c = Connection()
        t = c.table('my_table')
        # Under the hood this applies the FirstKeyOnlyFilter and KeyOnlyFilter
        # similar to the happybase example below
        print t.count(row_prefix="foo")
    

    다음은 Happybase 코드 샘플입니다.

        from happybase import Connection
        c = Connection(...)
        t = c.table('my_table')
        count = 0
        for _ in t.scan(filter='FirstKeyOnlyFilter() AND KeyOnlyFilter()'):
            count += 1
    
        print count
    

    팁 덕분에 @ Tuckr과 @KennyCason에게 감사드립니다.

  5. ==============================

    5.HBASE에서 행을 계산하는 간단하고, 효과적이며 효율적인 방법 :

    HBASE에서 행을 계산하는 간단하고, 효과적이며 효율적인 방법 :

    이 메서드를 사용하면 밀리 초보다 적은 행 수를 얻을 수 있습니다.

  6. ==============================

    6.HBase 0.92부터 사용할 수있는 코 프로세서를 사용할 수 있습니다. Coprocessor 및 AggregateProtocol 및 예제를 참조하십시오.

    HBase 0.92부터 사용할 수있는 코 프로세서를 사용할 수 있습니다. Coprocessor 및 AggregateProtocol 및 예제를 참조하십시오.

  7. ==============================

    7.적절한 YARN 클러스터에서 Hbase 테이블 레코드 수를 계산하려면 맵 축소 작업 대기열 이름도 설정해야합니다.

    적절한 YARN 클러스터에서 Hbase 테이블 레코드 수를 계산하려면 맵 축소 작업 대기열 이름도 설정해야합니다.

    hbase org.apache.hadoop.hbase.mapreduce.RowCounter -Dmapreduce.job.queuename= < Your Q Name which you have SUBMIT access>
     < TABLE_NAME>
    
  8. ==============================

    8.스캐너를 사용하는 경우 스캐너에서 최대한 적은 수의 한정자를 반환하도록하십시오. 실제로 반환하는 한정자는 사용 가능한 크기가 가장 작아야합니다 (바이트 크기로). 이렇게하면 스캔 속도가 엄청나게 빠릅니다.

    스캐너를 사용하는 경우 스캐너에서 최대한 적은 수의 한정자를 반환하도록하십시오. 실제로 반환하는 한정자는 사용 가능한 크기가 가장 작아야합니다 (바이트 크기로). 이렇게하면 스캔 속도가 엄청나게 빠릅니다.

    불행히도 이것은 지금까지만 규모가 커질 것입니다 (수백만 - 십억?). 더 나아가려면 실시간으로이 작업을 수행 할 수 있지만, 먼저 모든 행을 계산하기 위해 mapreduce 작업을 실행해야합니다.

    HBase의 셀에 Mapreduce 출력을 저장하십시오. 행을 추가 할 때마다 카운터를 1 씩 증가시킵니다. 행을 삭제할 때마다 카운터를 감소시킵니다.

    실시간으로 행 수에 액세스해야하는 경우 HBase에서 해당 필드를 읽습니다.

    그렇지 않으면 비례하는 방식으로 행을 계산하는 빠른 방법이 없습니다. 너무 빨리 계산할 수 있습니다.

  9. ==============================

    9.U는 여기에서 샘플 예제를 찾을 수 있습니다.

    U는 여기에서 샘플 예제를 찾을 수 있습니다.

    /**
         * Used to get the number of rows of the table
         * @param tableName
         * @param familyNames
         * @return the number of rows
         * @throws IOException
         */
        public long countRows(String tableName, String... familyNames) throws IOException {
            long rowCount = 0;
            Configuration configuration = connection.getConfiguration();
            // Increase RPC timeout, in case of a slow computation
            configuration.setLong("hbase.rpc.timeout", 600000);
            // Default is 1, set to a higher value for faster scanner.next(..)
            configuration.setLong("hbase.client.scanner.caching", 1000);
    
            AggregationClient aggregationClient = new AggregationClient(configuration);
            try {
                Scan scan = new Scan();
                if (familyNames != null && familyNames.length > 0) {
                    for (String familyName : familyNames) {
                        scan.addFamily(Bytes.toBytes(familyName));
                    }
                }
                rowCount = aggregationClient.rowCount(TableName.valueOf(tableName), new LongColumnInterpreter(), scan);
            } catch (Throwable e) {
                throw new IOException(e);
            }
            return rowCount;
        }
    
  10. ==============================

    10.Hbase 홈 디렉토리로 이동하여이 명령을 실행하십시오.

    Hbase 홈 디렉토리로 이동하여이 명령을 실행하십시오.

    ./bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter '네임 스페이스 : tablename'

    이렇게하면 mapreduce 작업이 시작되고 출력에는 hbase 테이블에있는 레코드 수가 표시됩니다.

  11. ==============================

    11.속도와 hbase 테이블에서 행 개수를 얻으려면 나를 위해 일한 두 가지 방법

    속도와 hbase 테이블에서 행 개수를 얻으려면 나를 위해 일한 두 가지 방법

    시나리오 # 1

    hbase 테이블 크기가 작다면 유효한 사용자와 함께 hbase 쉘에 로그인하고 실행하십시오.

    >count '<tablename>'
    

    >count 'employee'
    
    6 row(s) in 0.1110 seconds
    

    시나리오 # 2

    hbase 테이블 크기가 큰 경우 inbuilt를 실행하십시오. RowCounter map reduce job : 유효한 사용자와 함께 hadoop 시스템에 로그인하여 다음을 실행하십시오.

    /$HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter '<tablename>'
    

    예:

     /$HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'employee'
    
         ....
         ....
         ....
         Virtual memory (bytes) snapshot=22594633728
                    Total committed heap usage (bytes)=5093457920
            org.apache.hadoop.hbase.mapreduce.RowCounter$RowCounterMapper$Counters
                    ROWS=6
            File Input Format Counters
                    Bytes Read=0
            File Output Format Counters
                    Bytes Written=0
    
  12. ==============================

    12.org.apache.hadoop.hbase.client.coprocessor.AggregationClient

    org.apache.hadoop.hbase.client.coprocessor.AggregationClient

  13. from https://stackoverflow.com/questions/11375098/hbase-quickly-count-number-of-rows by cc-by-sa and MIT license