복붙노트

[HADOOP] hbase 사전 분할 전략을 선택하는 방법과 행 키에 미치는 영향

HADOOP

hbase 사전 분할 전략을 선택하는 방법과 행 키에 미치는 영향

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. ==============================

    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
    
  2. 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