2011-01-27 2 views
3

저는 우리가하고있는 데이터 분석을 위해 HBase를 평가하려고합니다.여러 스캔 객체의 HBase Mapreduce

HBase에는 이벤트 데이터가 포함됩니다. 키는 eventId + 시간입니다. 우리는 날짜 범위 사이에 몇 가지 이벤트 유형 (4-5)에 대한 분석을 실행하려고합니다. 이벤트 유형의 총 수는 약 1000입니다.

hbase 테이블에서 mapreduce 작업을 실행할 때의 문제점은 initTableMapperJob (아래 참조)이 하나의 스캔 객체 만 사용한다는 것입니다. 성능상의 이유로 우리는 1000 개의 이벤트 유형이 아닌 주어진 날짜 범위에서 4-5 개의 이벤트 유형에 대해서만 데이터를 스캔하려고합니다. 아래의 방법을 사용하면 스캔 객체가 1 개만 필요하기 때문에 선택의 여지가 없다고 생각합니다.

( 스캔 스캔, 클래스 매퍼, 클래스 outputKeyClass, 클래스 outputValueClass, org.apache.hadoop.mapreduce.Job 작업 문자열 테이블) 는 IOException이

를 throw이 가능 공공 정적 무효 initTableMapperJob인가 스캔 객체 목록에서 mapreduce를 실행 하시겠습니까? 어떤 해결 방법? 당신은 클래스를 찾고 있습니다

감사

답변

9

TableMapReduceUtil.initTableMapperJobTableInputFormat을 사용하도록 구성합니다. 이는 사용자가 알 수 있듯이 Scan입니다.

테이블의 여러 세그먼트를 스캔하는 것처럼 들립니다. 그렇게하려면 MultiSegmentTableInputFormat과 같은 고유 한 InputFormat을 만들어야합니다. TableInputFormatBase을 확장하고 getSplits 메서드를 재정 의하여 테이블의 각 시작/중지 행 세그먼트에 대해 super.getSplits을 한 번 호출합니다. (가장 쉬운 방법은 매번 TableInputFormatBase.scan.setStartRow()이 될 것입니다.) InputSplit 인스턴스를 단일 목록으로 집계합니다.

그런 다음 직접 사용자 지정 MultiSegmentTableInputFormat을 사용하도록 작업을 구성하십시오.

+0

http : // stackoverflow를 확인할 수 있습니까?com/questions/11353911/extended-hadoops-tableinputformat-to-a-prefix-for-distribution은 배포 용으로 사용됩니까? – marcog

0

:

조직/아파치/하둡/HBase를/필터/FilterList.java

필터를 취할 수 있습니다 각각의 스캔. 필터는 꽤 복잡 할 수 있습니다. FilterList를 사용하면 여러 개의 단일 필터를 지정한 다음 모든 구성 요소 필터간에 AND 또는 OR을 수행 할 수 있습니다. 이 메소드를 사용하여 행에 대해 임의의 부울 조회를 빌드 할 수 있습니다.

+2

이 접근법의 문제점은 HBase가 필터링하기 전에 디스크에서 값을 atleast 읽어야한다는 것입니다. 수십억 개의 행이있는 경우 성능이 저하 될 수 있습니다. – StackUnderflow

+0

StackUnderflow에 언급 된 문제로 인해 downvote가 발생했습니다. 수십억 개의 행에 대해 필터를 수행하는 것은 매우 느립니다. – Gattster

0

나는 Dave L의 접근 방식을 시도했으며 아름답게 작동합니다.

지도 작업을 구성하려면 MultiSegmentTableInputFormat 데이브 L' 님의 댓글에서 언급에 inputFormatClass가 참조하는 기능

TableMapReduceUtil.initTableMapperJob(byte[] table, Scan scan, 
    Class<? extends TableMapper> mapper, 
    Class<? extends WritableComparable> outputKeyClass, 
    Class<? extends Writable> outputValueClass, Job job, 
    boolean addDependencyJars, Class<? extends InputFormat> inputFormatClass) 

를 사용할 수 있습니다.