가장 먼저해야 할 일은 행키 디자인이 완벽해야 액세스 패턴을 정의 할 수 있다는 것입니다. 당신은 당신이 다음과 같은 방법을 사용할 수있는 경우
선행 acccess 수 rowkeys 알고있는 경우
1) 취득이 좋은, 그것은 결과의 배열을 반환합니다. 우리가 완벽 rowkey 디자인을 해달라고하면 HBase를 스캔 성능과 내 경험에
/**
* Method getDetailRecords.
*
* @param listOfRowKeys List<String>
* @return Result[]
* @throws IOException
*/
private Result[] getDetailRecords(final List<String> listOfRowKeys) throws IOException {
final HTableInterface table = HBaseConnection.getHTable(TBL_DETAIL);
final List<Get> listOFGets = new ArrayList<Get>();
Result[] results = null;
try {
for (final String rowkey : listOfRowKeys) {// prepare batch of get with row keys
// System.err.println("get 'yourtablename', '" + saltIndexPrefix + rowkey + "'");
final Get get = new Get(Bytes.toBytes(saltedRowKey(rowkey)));
get.addColumn(COLUMN_FAMILY, Bytes.toBytes(yourcolumnname));
listOFGets.add(get);
}
results = table.get(listOFGets);
} finally {
table.close();
}
return results;
}
2)
은 조금 낮다. 위에서 언급 한 시나리오에 대한 스캔을 선택하는 것이 좋습니다.
FuzzyRowFilter(see hbase-the-definitive) This is really useful in our case 우리는 같은 대량 클라이언트를 사용했을지도-감소뿐만 아니라 독립 HBase를 클라이언트 행 키에
이 필터 역할을하지만, 퍼지 방식이다. 그것은 리턴되어야하는 행 키 목록과 행 키의 각 Y이트의 중요성을 나타내는 Y이트 [] 배열이 필요합니다. 생성자 등이다
FuzzyRowFilter(List<Pair<byte[], byte[]>> fuzzyKeysData)
fuzzyKeysData 두 개의 값 중 하나를 취함으로써, 로우 키 바이트의 한 의미를 지정
0 표시하는 행에있는 동일 위치의 바이트 키는 일치해야합니다 ( ). 1 해당 행 키 Y이 이 아니며 항상 허용됨을의 L합니다.
예 : 화합물 키 내부보다는 대체로 왼쪽에서 오른쪽으로 행 주요 부분 매칭 가능한 예는 아니지만, 키 부분과 일치한다. _의 행 키 형식을 고정 길이 파트로 가정 할 때 4는 2이고 4는 2 바이트 길이입니다. 이제 응용 프로그램은 매년 1 월에 특정 작업 (99로 인코딩 됨)을 수행 한 모든 사용자를 요청합니다. 이어서 행 퍼지 키와 데이터의 쌍이 될 다음 "?"
로우 키 "???? 99 _ 01 ????"어디 무시되기 때문에 임의의 문자입니다. 퍼지 데이터 = "\ x01 \ x01 \ x01 \ x01 \ x00 \ x00 \ x00 \ x00 \ x01 \ x01 \ x01 \ x01 \ x00 \ x00 \ x00" 즉, 퍼지 데이터 배열은 "012"가 일치하는 모든 행 키를 찾으십시오. "012"는 "?"0190 " 어떤 문자라도 받아 들일 것입니다.
이 필터의 장점은 일치하는 행 키의 끝에 오는 다음 일치하는 행 키를 계산할 가능성이 높다는 것입니다. 이 메소드는 getNextCellHint() 메소드를 구현하여 서버가 일치 할 수있는 다음 행 범위로 빨리 감기하도록 도와줍니다. 특히 건너 뛴 범위가 상당히 큰 경우 스캔 속도가 빨라집니다. 예제 4-12는 필터를 사용하여 테스트 데이터 세트에서 특정 행을 가져옵니다. 테이블
추가 행 ... 스캔 결과 열 접두사 필터링
예
List<Pair<byte[], byte[]>> keys = new ArrayList<Pair<byte[], byte[]>>();
keys.add(new Pair<byte[], byte[]>(
Bytes.toBytes("row-?5"), new byte[] { 0, 0, 0, 0, 1, 0 }));
Filter filter = new FuzzyRowFilter(keys);
Scan scan = new Scan()
.addColumn(Bytes.toBytes("colfam1"), Bytes.toBytes("col-5"))
.setFilter(filter);
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
System.out.println(result);
}
scanner.close();
예 코드는 단지 짧은 출력을 유지하기 위해, 주사에 필터링 열을 추가 :
keyvalues={row-05/colfam1:col-01/1/Put/vlen=9/seqid=0,
row-05/colfam1:col-02/2/Put/vlen=9/seqid=0,
...
row-05/colfam1:col-09/9/Put/vlen=9/seqid=0,
row-05/colfam1:col-10/10/Put/vlen=9/seqid=0}
keyvalues={row-15/colfam1:col-01/1/Put/vlen=9/seqid=0,
row-15/colfam1:col-02/2/Put/vlen=9/seqid=0,
...
row-15/colfam1:col-09/9/Put/vlen=9/seqid=0,
row-15/colfam1:col-10/10/Put/vlen=9/seqid=0}
테스트 코드 배선은 row-01에서 row-20까지 20 개의 행을 테이블에 추가합니다. 패턴 row-5에 일치하는 모든 행, 즉 숫자 5로 끝나는 모든 행을 검색하려고합니다. 위 출력은 올바른 결과를 확인합니다.
답변 해 주셔서 감사합니다. 나는'HOST' 컬럼을 스캔하고'host = x'를 가진 모든 대응'ROWKEYs '의 String리스트를 리턴하는 메소드를 작성했다. 3 초가 걸립니다. 그런 다음이 모든 행크 키와'이벤트 '를 모두 반복하는 방법을 썼습니다. 이것은 aound 120 초가 걸립니다. 'GET '에 대해 이것이 어떻게'O (1) '이 될 수 있습니까? –
'n'은 행 수를 의미합니다. 또한 내 자신의 사용자 정의 컬럼이 아닌 기본 Rowkeys를 사용하고 있습니다. –
@GregPeckory 이제 "얻으십시오". 그래서 제안한 답변을 업데이트했습니다 : " ROWKEY"로 구성된 연결된 Rowkey를 사용하십시오. 이 경우 "", ""에서 범위 검색을 수행하면 해당 호스트의 모든 항목 중 **가 하나의'get '에 반환됩니다. –
javadba