복붙노트

[HADOOP] HBase 테이블에서 모든 열 이름을 가져올 수 있습니까?

HADOOP

HBase 테이블에서 모든 열 이름을 가져올 수 있습니까?

100M + 행과 1 백만 + 열이있는 HBase 테이블이 있습니다. 모든 행에는 2 ~ 5 개의 열에 대한 데이터 만 있습니다. 열 가족은 단 하나뿐입니다.

이 열 패밀리의 모든 고유 한 한정자 (열)를 찾고 싶습니다. 그렇게 할 수있는 빠른 방법이 있습니까?

전체 테이블을 스캔 한 다음 각 행에 대해 familyMap을 가져 와서 한정자를 가져 와서 Set <>에 추가하는 방법에 대해 생각해 볼 수 있습니다. 그러나 그것은 100M + 행이 있기 때문에 매우 느릴 것입니다.

우리가 더 잘 할 수 있을까요?

해결법

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

    1.당신은 이것을 위해 mapreduce를 사용할 수 있습니다. 이 경우 코 프로세서의 경우처럼 hbase에 대한 사용자 정의 libs를 설치할 필요가 없습니다. 지도 작성 작업을 작성하기위한 코드 아래에 있습니다.

    당신은 이것을 위해 mapreduce를 사용할 수 있습니다. 이 경우 코 프로세서의 경우처럼 hbase에 대한 사용자 정의 libs를 설치할 필요가 없습니다. 지도 작성 작업을 작성하기위한 코드 아래에 있습니다.

    작업 설정

        Job job = Job.getInstance(config);
        job.setJobName("Distinct columns");
    
        Scan scan = new Scan();
        scan.setBatch(500);
        scan.addFamily(YOU_COLUMN_FAMILY_NAME);
        scan.setFilter(new KeyOnlyFilter()); //scan only key part of KeyValue (raw, column family, column)
        scan.setCacheBlocks(false);  // don't set to true for MR jobs
    
    
        TableMapReduceUtil.initTableMapperJob(
                YOU_TABLE_NAME,
                scan,          
                OnlyColumnNameMapper.class,   // mapper
                Text.class,             // mapper output key
                Text.class,             // mapper output value
                job);
    
        job.setNumReduceTasks(1);
        job.setReducerClass(OnlyColumnNameReducer.class);
        job.setReducerClass(OnlyColumnNameReducer.class);
    

    매퍼

     public class OnlyColumnNameMapper extends TableMapper<Text, Text> {
        @Override
        protected void map(ImmutableBytesWritable key, Result value, final Context context) throws IOException, InterruptedException {
           CellScanner cellScanner = value.cellScanner();
           while (cellScanner.advance()) {
    
              Cell cell = cellScanner.current();
              byte[] q = Bytes.copy(cell.getQualifierArray(),
                                    cell.getQualifierOffset(),
                                    cell.getQualifierLength());
    
              context.write(new Text(q),new Text());  
    
           }
     }
    

    }

    감속기

    public class OnlyColumnNameReducer extends Reducer<Text, Text, Text, Text> {
    
        @Override
        protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {    
                context.write(new Text(key), new Text());    
        }
    }
    
  2. ==============================

    2.HBase는 분산 NavigableMap >>>로 시각화 될 수 있습니다.

    HBase는 분산 NavigableMap >>>로 시각화 될 수 있습니다.

    모든 지역 서버에서 사용할 수있는 모든 한정자 목록에 대해 "메타 데이터"(마스터 노드에 중앙 집중식으로 저장된 내용)는 없습니다.

    따라서 일회성 유스 케이스가있는 경우 언급 한 것처럼 전체 테이블을 스캔하여 Set <>에 한정자 이름을 추가하는 것이 유일한 방법입니다.

    반복 사용 사례 (기술 스택에 구성 요소를 추가 할 재량권이있는 경우)에 Redis를 추가하는 것이 좋습니다. 한정자 집합은 Redis Set를 사용하여 분산 된 방식으로 유지 관리 할 수 ​​있습니다.

  3. ==============================

    3.이 시나리오에서는 HBase Coprocessors를 사용할 수 있습니다. RDBMS에서 Stored Procedures와 같은 방식으로 작동하는 사용자 정의 EndPoint 구현을 작성할 수 있습니다. 서버 측에서 코드를 실행하고 각 영역에 대해 고유 한 열을 얻습니다. 클라이언트에서는 모든 지역에서 별개의 열을 얻을 수 있습니다.

    이 시나리오에서는 HBase Coprocessors를 사용할 수 있습니다. RDBMS에서 Stored Procedures와 같은 방식으로 작동하는 사용자 정의 EndPoint 구현을 작성할 수 있습니다. 서버 측에서 코드를 실행하고 각 영역에 대해 고유 한 열을 얻습니다. 클라이언트에서는 모든 지역에서 별개의 열을 얻을 수 있습니다.

    성능 이점 : 모든 열이 클라이언트로 전송되지 않아 네트워크 호출이 줄어 듭니다.

  4. from https://stackoverflow.com/questions/33225858/can-we-get-all-the-column-names-from-an-hbase-table by cc-by-sa and MIT license