1. 고유성의 원리
Rowkey는 고유성을 보장하도록 설계되었습니다. rowkey는 사전 순으로 정렬 및 저장되므로 rowkey를 설계 할 때이 정렬의 특성을 최대한 활용하고 자주 읽는 데이터를 함께 저장합니다.
2. 길이 원리
Rowkey는 이진 코드 스트림으로, 최대 길이가 64kb 인 모든 문자열이 될 수 있습니다. 실제 응용에서는 일반적으로 10-100 바이트입니다. byte [] 형식으로 저장되며 일반적으로 고정 길이로 설계됩니다. . 16 바이트 이하로 짧을수록 좋습니다 . rowkey 필드가 너무 길면 메모리의 유효 활용도가 줄어들고 시스템이 더 많은 데이터를 캐시 할 수 없어 검색 효율성이 떨어집니다.
현재 운영 체제는 모두 64 비트 시스템이며 메모리는 8 바이트로 정렬되고 16 바이트로 제어되며 8 바이트의 정수 배수는 운영 체제의 최상의 기능을 활용합니다 .
3. 해싱 원리
프로그램에 의해 무작위로 생성 된 해시 필드로 rowkey의 높은 비트를 사용하고 시간 필드를 낮은 비트에 두는 것이 좋습니다. 이렇게하면로드 밸런싱을 달성하기 위해 각 RegionServer에서 균형 잡힌 데이터 분산이 향상됩니다. 해시 필드가없는 경우 첫 번째 필드는 직접 시간 정보이고 모든 데이터는 하나의 RegionServer에 집중됩니다. 이렇게하면 데이터 검색 중에로드가 개별 RegionServer에 집중되어 문제가 발생하고 쿼리 효율성이 떨어집니다.
방법 개선
3.1, 소금 추가
rowkey 앞에 임의의 숫자를 추가하는 것은 rowkey에 임의의 접두사를 할당하여 이전 rowkey의 시작과 다르게 만드는 것입니다. 할당 된 접두사 유형 수는 다른 지역에 배포하는 데 사용할 데이터 수와 동일해야합니다. 솔트 된 rowkey는 무작위로 생성 된 접두사에 따라 각 영역에 흩어져 있습니다.
3.2, 해시
해싱은 같은 줄을 항상 접두사로 솔트 처리합니다. 해싱은 전체 클러스터에로드를 분산시킬 수도 있지만 읽기는 예측 가능합니다.
3.3, 역
고정 길이 또는 숫자 형식의 역방향 rowkey. 이렇게하면 rowkey에서 자주 변경되는 부분 (가장 덜 의미있는 부분)이 먼저 배치됩니다.
StringBuilder에는 reverse () 메서드가 있지만 String에는 없습니다.
3.4. 타임 스탬프 반전
역 타임 스탬프를 rowkey의 일부로 사용하면이 문제에 매우 유용합니다.
[key] [reverse_timestamp], [key]의 최신 값인 [key]를 스캔하여 [key]의 첫 번째 레코드를 가져올 수 있습니다. HBase의 rowkey가 정렬되고 첫 번째 레코드가 마지막으로 입력 된 데이터이기 때문입니다.
예를 들어 사용자의 작업 기록을 저장하고 작업 시간의 역순으로 정렬해야합니다. rowkey를 디자인 할 때 [userId inversion] [Long.Max_Value-timestamp]와 같이 디자인하고 모든 사용자 작업을 쿼리 할 때 직접 지정할 수 있습니다. 반전 후 사용자 ID, startRow는 [userId inversion] [000000000000], stopRow는 [userId inversion] [ Long.Max_Value-timestamp ]입니다.