[HADOOP] HBase 테이블에서 모든 열 이름을 가져올 수 있습니까?
HADOOPHBase 테이블에서 모든 열 이름을 가져올 수 있습니까?
100M + 행과 1 백만 + 열이있는 HBase 테이블이 있습니다. 모든 행에는 2 ~ 5 개의 열에 대한 데이터 만 있습니다. 열 가족은 단 하나뿐입니다.
이 열 패밀리의 모든 고유 한 한정자 (열)를 찾고 싶습니다. 그렇게 할 수있는 빠른 방법이 있습니까?
전체 테이블을 스캔 한 다음 각 행에 대해 familyMap을 가져 와서 한정자를 가져 와서 Set <>에 추가하는 방법에 대해 생각해 볼 수 있습니다. 그러나 그것은 100M + 행이 있기 때문에 매우 느릴 것입니다.
우리가 더 잘 할 수 있을까요?
해결법
-
==============================
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.HBase는 분산 NavigableMap
>>>로 시각화 될 수 있습니다. HBase는 분산 NavigableMap
>>>로 시각화 될 수 있습니다. 모든 지역 서버에서 사용할 수있는 모든 한정자 목록에 대해 "메타 데이터"(마스터 노드에 중앙 집중식으로 저장된 내용)는 없습니다.
따라서 일회성 유스 케이스가있는 경우 언급 한 것처럼 전체 테이블을 스캔하여 Set <>에 한정자 이름을 추가하는 것이 유일한 방법입니다.
반복 사용 사례 (기술 스택에 구성 요소를 추가 할 재량권이있는 경우)에 Redis를 추가하는 것이 좋습니다. 한정자 집합은 Redis Set를 사용하여 분산 된 방식으로 유지 관리 할 수 있습니다.
-
==============================
3.이 시나리오에서는 HBase Coprocessors를 사용할 수 있습니다. RDBMS에서 Stored Procedures와 같은 방식으로 작동하는 사용자 정의 EndPoint 구현을 작성할 수 있습니다. 서버 측에서 코드를 실행하고 각 영역에 대해 고유 한 열을 얻습니다. 클라이언트에서는 모든 지역에서 별개의 열을 얻을 수 있습니다.
이 시나리오에서는 HBase Coprocessors를 사용할 수 있습니다. RDBMS에서 Stored Procedures와 같은 방식으로 작동하는 사용자 정의 EndPoint 구현을 작성할 수 있습니다. 서버 측에서 코드를 실행하고 각 영역에 대해 고유 한 열을 얻습니다. 클라이언트에서는 모든 지역에서 별개의 열을 얻을 수 있습니다.
성능 이점 : 모든 열이 클라이언트로 전송되지 않아 네트워크 호출이 줄어 듭니다.
from https://stackoverflow.com/questions/33225858/can-we-get-all-the-column-names-from-an-hbase-table by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Hadoop을 Google Cloud Storage에 연결할 수 없습니다. (0) | 2019.07.27 |
---|---|
[HADOOP] Hadoop 프로그램에서 출력 키 / 값 클래스를 명시 적으로 설정해야하는 이유는 무엇입니까? (0) | 2019.07.27 |
[HADOOP] Spark 클러스터 및 Cassandra 용 JanusGraph 설정 및 구성 (0) | 2019.07.27 |
[HADOOP] Hadoop : Writable 인터페이스없이 출력 값으로 객체를 가지는 쉬운 방법 (0) | 2019.07.27 |
[HADOOP] Hadoop에서는 namenode 및 jobtracker 웹 페이지에 대한 기본 URL 포트 50070 및 50030을 어디에서 변경할 수 있습니까? (0) | 2019.07.27 |