[HADOOP] hbase 사전 분할 전략을 선택하는 방법과 행 키에 미치는 영향
HADOOPhbase 사전 분할 전략을 선택하는 방법과 행 키에 미치는 영향
hbase 테이블을 미리 분할하려고합니다. 하나는 HbaseAdmin 자바 API는 hbase 테이블을 만드는 것입니다 startkey, endkey 및 지역의 번호의 기능입니다. 다음은 HbaseAdmin에서 사용하는 자바 API입니다. void createTable (HTableDescriptor desc, byte [] startKey, byte [] endKey, int numRegions)
데이터 세트를 기반으로하는 startkey 및 endkey 선택에 대한 권장 사항이 있습니까?
내 접근 방식은 데이터 집합에 100 개의 레코드가 있다고 가정합니다. 데이터가 약 10 개 지역으로 나뉘어져 각각에 약 10 개의 레코드가 저장되기를 바랍니다. 시작 키를 찾으려면 '/ mytable', {LIMIT => 10}을 스캔하고 마지막 시작 키를 마지막 시작 키로 선택한 다음 '/ mytable', {LIMIT => 90}을 스캔 한 다음 마지막 행 키를 내 최종 키로 선택하십시오.
startkey와 rowkey를 찾으려면이 접근법이 정상적으로 보이거나 더 나은 방법이 있습니까?
편집하다 나는 빈 테이블을 미리 나누는 접근법을 시도했다. ALI 3은 제가 사용했던 방식대로 작동하지 않았습니다. 저는 평등하게 분배 받기 위해서 열쇠를 소금으로 만들어야한다고 생각합니다.
PS> 일부 지역 정보 만 표시하고 있습니다.
1)
byte[][] splits = new RegionSplitter.HexStringSplit().split(10);
hBaseAdmin.createTable(tabledescriptor, splits);
이렇게하면 다음과 같은 경계가있는 영역이 제공됩니다.
{
"startkey":"-INFINITY",
"endkey":"11111111",
"numberofrows":3628951,
},
{
"startkey":"11111111",
"endkey":"22222222",
},
{
"startkey":"22222222",
"endkey":"33333333",
},
{
"startkey":"33333333",
"endkey":"44444444",
},
{
"startkey":"88888888",
"endkey":"99999999",
},
{
"startkey":"99999999",
"endkey":"aaaaaaaa",
},
{
"startkey":"aaaaaaaa",
"endkey":"bbbbbbbb",
},
{
"startkey":"eeeeeeee",
"endkey":"INFINITY",
}
내 rowkeys가 'deptId | month | roleId | regionId'와 같은 복합 양식이고 위의 경계에 맞지 않으므로이 방법은 쓸모가 없습니다.
2)
byte[][] splits = new RegionSplitter.UniformSplit().split(10);
hBaseAdmin.createTable(tabledescriptor, splits)
이것은 같은 문제가 있습니다 :
{
"startkey":"-INFINITY",
"endkey":"\\x19\\x99\\x99\\x99\\x99\\x99\\x99\\x99",
}
{
"startkey":"\\x19\\x99\\x99\\x99\\x99\\x99\\x99\\
"endkey":"33333332",
}
{
"startkey":"33333332",
"endkey":"L\\xCC\\xCC\\xCC\\xCC\\xCC\\xCC\\xCB",
}
{
"startkey":"\\xE6ffffffa",
"endkey":"INFINITY",
}
3) 시작 키와 종료 키를 제공하려고했지만 쓸데없는 영역을 따라 갔다.
hBaseAdmin.createTable(tabledescriptor, Bytes.toBytes("04120|200808|805|1999"),
Bytes.toBytes("01253|201501|805|1999"), 10);
{
"startkey":"-INFINITY",
"endkey":"04120|200808|805|1999",
}
{
"startkey":"04120|200808|805|1999",
"endkey":"000PTP\\xDC200W\\xD07\\x9C805|1999",
}
{
"startkey":"000PTP\\xDC200W\\xD07\\x9C805|1999",
"endkey":"000ptq<200wp6\\xBC805|1999",
}
{
"startkey":"001\\x11\\x15\\x13\\x1C201\\x15\\x902\\x5C805|1999",
"endkey":"01253|201501|805|1999",
}
{
"startkey":"01253|201501|805|1999",
"endkey":"INFINITY",
}
해결법
-
==============================
1.첫 번째 질문 : hbase에 대한 내 경험으로 시작점 키와 끝점 키를 사용하여 여러 개의 영역을 만드는 데 어려운 규칙을 인식하지 못했습니다.
첫 번째 질문 : hbase에 대한 내 경험으로 시작점 키와 끝점 키를 사용하여 여러 개의 영역을 만드는 데 어려운 규칙을 인식하지 못했습니다.
그러나 근본적인 것은,
그러나 언급 한대로 고정 된 수의 영역을 정의한 경우 10. 과중한 데이터로드 후에 10 개가되지 않을 수 있습니다. 도달하면 일정한 한도로 다시 분할됩니다.
hbase admin 문서로 테이블을 생성하는 방법에서 지정한 수의 영역으로 새 테이블을 만듭니다. 지정된 시작 키가 테이블의 첫 번째 영역의 끝 키가되며 지정된 끝 키가 테이블의 마지막 영역의 시작 키가됩니다 (첫 번째 영역에는 시작 키가 null이고 마지막 영역에는 null이 있음). 종료 키).
또한, 나는 스크립트를 통해 스크립트를 통해 프레스 프리 스 (0 ~ 10)로 말하는 것을 선호합니다. 그리고 솔로이 쳐져서 핫스팟을 피하기 위해 지역 서버 중 하나에 앉아있을 수 있도록 행키를 디자인 할 것입니다. 처럼
편집 : 자신의 regionSplit 구현하려는 경우 자신 만의 구현을 구현하고 제공 할 수 있습니다. org.apache.hadoop.hbase.util.RegionSplitter.SplitAlgorithm 및 override
public byte[][] split(int numberOfSplits)
두 번째 질문 : 내 이해 : 특정 테이블에서 삽입 된 데이터에 대한 startrowkey 및 end rowkey를 찾으려면 ... 아래 방법이 있습니다.
예 : scan 'yourtablename', FILTER => 'FirstKeyOnlyFilter ()' 모든 100 개의 행 키를 표시합니다.
만약 당신이 거대한 데이터 (100 행 당신이 언급 한) 및 모든 행키의 덤프를 가지고 싶어 다음 측면 쉘에서 아래에서 사용할 수 있습니다 ..
echo "scan 'yourtablename', FILTER => 'FirstKeyOnlyFilter()'" | hbase shell > rowkeys.txt
from https://stackoverflow.com/questions/37582238/hbase-how-to-choose-pre-split-strategies-and-how-its-affect-your-rowkeys by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 32 비트 프로세서가 탑재 된 Windows 7에 Hadoop을 설치 하시겠습니까? (0) | 2019.06.25 |
---|---|
[HADOOP] 원사 항아리 업로드 문제에 대한 스파크 (0) | 2019.06.25 |
[HADOOP] 하둡으로 Giraph 빌드하기 (0) | 2019.06.24 |
[HADOOP] Lineage In Spark 란 무엇입니까? (0) | 2019.06.24 |
[HADOOP] Hive 0.12 및 Hadoop 2.2.0-cdh5.0.0-beta2의 SerDe 문제 (0) | 2019.06.24 |