2012-01-22 3 views
10

특정 날짜 범위의 모든 행 (지난 1 개월)을 가져 오는 MapReduce 작업을 작성해야합니다. My Row Key가 Date로 시작한 것은 칵테일이었을 것입니다. 하지만 내 자주 Hbase 쿼리 키의 시작 값에 있습니다.HBase 행을 효율적으로 검색하는 방법

내 행 키는 정확히 A | B | C | 20120121 | D입니다. A/B/C를 날짜와 함께 (YearMonthDay 형식으로) 조합하면 고유 한 행 ID가됩니다.

내 Hbase 테이블에는 최대 백만 개의 행이있을 수 있습니다. 매퍼가 모든 테이블을 읽고 각 행을 주어진 기간에 포함 시키거나 스캔/필터로 처리하면이 상황을 처리 할 수 ​​있습니까?

누군가이 상황을 효과적으로 처리 할 수있는 방법을 제안 할 수 있습니까 (코드 스 니펫)? -Panks가

난 그냥 HBase를 시작하기하고
+0

키를 재배치하고 이전 내용을 스크랩하여 테이블의 내용을 새로운 내용으로 복사하지 않는 이유는 무엇입니까? – Mario

+0

@ 마리오 테이블에 1 조 개의 키가 있다면 어떨까요? 그리고 그는 이것을 자주해야합니까? – markg

답변

5

RowFilter에는 RegexStringComparator을 사용할 수 있습니다. 날짜를 적절히 필터링하는 RegEx가 필요합니다. This page에는 MapReduce 스캐너 용 필터를 설정하는 예제가 있습니다.

+1

Rowkey를 사용하면 가장 효율적입니다. 반환 된 결과가 행에 비해 너무 방대하면 get 및 batchSize로 스캔하는 것이 더 좋고/더 안전한 옵션입니다. –

0

, bloom filters 도움이 될

감사합니다.

+1

정확한 키를 알고 있지 않으면 블룸 필터가 도움이되지 않습니다. –

+0

감사합니다 Chris - 블룸 필터는 메모리를 효율적으로 사용하기 위해 실제 데이터 대신 데이터 다이제스트를 저장하므로 패턴 일치가 불가능합니다. –

0

필터를 포함하도록 Mapper로 보내는 스캔을 수정할 수 있습니다. 당신의 날짜도 기록 타임 스탬프 인 경우, 쉽게 :

Scan scan = new Scan(); 
scan.setTimeRange(minTime, maxTime); 
TableMapReduceUtil.initTableMapperJob("mytable", scan, MyTableMapper.class, 
    OutputKey.class, OutputValue.class, job); 

당신의 행 키에 날짜가 다른 경우, 당신은 당신의 스캔에 필터를 추가해야합니다. 이 필터는 열 또는 행 키에서 작동 할 수 있습니다. 나는 단지 행 키로 어지럽게 될 것이라고 생각한다. 날짜를 열에 넣으면 FilterList을 만들고 모든 조건이 참이어야하며 CompareOp.GREATERCompareOp.LESS을 사용합니다. 그런 다음 scan.setFilter(filterList)을 사용하여 필터를 검색에 추가하십시오.

+0

행 시간이 아닌 시간 소인의 setTimeRange 필터. –

10

RegEx 필터가있는 RowFilter가 작동하지만 가장 최적의 솔루션은 아닙니다. 또는 보조 인덱스를 사용해보십시오.

또 다른 해결 방법은 FuzzyRowFIlter입니다. FuzzyRowFilter는 일종의 빨리 감기를 사용하므로 전체 스캔 프로세스에서 많은 행을 건너 뛰므로 RowFilter 스캔보다 빠릅니다. 자세한 내용은 here을 참조하십시오.

BloomFilters는 스키마에 따라 도움이 될 수도 있습니다. 데이터가 크다면 보조 색인 및 블룸 필터에 대한 비교 분석을 수행해야합니다.

관련 문제