2011-08-24 4 views
1

HBase를 독립 실행 형 모드로 실행하고 Java API를 사용하여 테이블을 쿼리 할 때 몇 가지 문제가 발생했습니다. 표는 수백만 개의 항목이 있습니다 (그러나 수십억로 성장할 수)있는 다음과 같은 행 키 메트릭 있습니다비교 필터가있는 HBase 스캔은 마지막 행을 반환 할 때 지연이 길다.

<UUID>-<Tag>-<Timestamp> 

내가 시간 간격을 나타내는 특정 행 범위를 조회하기 위해 두 비교 조작 필터를 사용합니다.

Scan scan = new Scan(); 
RowFilter upperRowFilter = new RowFilter(CompareOp.LESS, 
    new BinaryComparator(securityId + eventType + intervalEnd) 
     .getBytes())); 

RowFilter lowerRowFilter = new RowFilter(CompareOp.GREATER_OR_EQUAL, 
    new BinaryComparator(securityId + eventType + intervalStart) 
     .getBytes())); 

FilterList filterList = new FilterList(); 
filterList.addFilter(lowerRowFilter); 
filterList.addFilter(upperRowFilter); 

scan.setFilter(filterList); 
scanner = table.getScanner(scan); 
result = scanner.next(); 

나는 그것이 필터를 통해 지정한 키 범위의 마지막 행에 도달 할 때까지 다음() 메소드는 모든 것이 잘 작동 ResultScanner 번호로 전화

. ResultScanner가 행 상단 한계 인 보다 어휘 적으로 작은 마지막 행을 반환 할 때까지 최대 012 초를 차지합니다. 내가

filterList.addFilter(upperRowFilter); 
filterList.addFilter(lowerRowFilter); 

filterList.addFilter(lowerRowFilter); 
filterList.addFilter(upperRowFilter); 

에서 filterList에서 필터의 순서를 변경하면 그 결과를 반환하기 시작하지만 거기까지

은 40 초 스캐너를 차지 no 마지막 행을 반환 할 때 지연이 더 많으므로 지연이 CompareOp.LESS 필터에서 발생했다고 생각했습니다.

이 지연을 피하기 위해 알고있는 유일한 방법은 upperRowFilter를 생략하고 행 키가 범위를 벗어난 경우 수동으로 확인하는 것입니다.하지만 문제가 검색된 결과를 찾지 못했기 때문에 잘못된 것이 있어야합니다. 인터넷.

나는 또한 이미 캐싱으로 제거하려고했지만 행의 수보다 적은 캐쉬 크기를 사용하면 아무것도 변경되지 않고 캐쉬 크기를 사용하는 횟수보다 많으면 반환 된 행은 지연이 아직 있지만 결과가 반환되기 전에 다시 나타납니다.

어떤 종류의 문제가 발생할 수 있는지 알고 계십니까? 나는 그것을 잘못하고 있는가 또는 나가 잃어버린 무언가가 있는가?

미리 감사드립니다.

답변

1

스캐너가 전체 테이블을 스캔하고 쿼리와 일치하지 않는 결과를 버리는 것이 문제입니다. (securityId + eventType + intervalEnd)의 중지 행을 명시 적으로 설정해야합니다. 해당 시작 행 (securityId + eventType + intervalStart)을 설정하면 필터가 필요 없으며 데이터 세트의 크기에 관계없이 스캔이 효율적입니다.

+0

그래, 문제가 해결되었습니다. 하지만 내가 이해하지 못하는 이유는 스캐너가 전체 테이블을 스캔하는 이유입니다. 행이 발견되면 (securityId + eventType + intervalStart) 스캔을 중지 할 수 있습니다 ... – Tobson