하루 종일 개고생을 한 결과를 여기 적는다.
앞서 문제가 생겼을 때 포스트한 것을 참고삼아 읽어봐도 좋을 듯.
내가 원했던 것 :
10gb 데이터를 128mb block 80개로 쪼개서 HBase table 에 저장하는 것.
내가 해결한 방법 :
아래 명령어를 사용하였다.
< 데이터가 1g 였을 때 >
create "word_1gb_b128",{NAME => "cf", BLOCKSIZE => '128000'}, SPLITS => ['0','2000','4000','6000','8000','10000','12000','14000']
|
< 데이터가 10g 였을 때 >
create "word_10gb_b128",{NAME => "cf", BLOCKSIZE => '128000'}, SPLITS => ['0','2040','4080','6120','8160','10200','12240','14280','16320','18360','20400','22440','24480','26520','28560','30600','32640','34680','36720','38760','40800','42840','44880','46920','48960','51000','53040','55080','57120','59160','61200','63240','65280','67320','69360','71400','73440','75480','77520','79560','81600','83640','85680','87720','89760','91800','93840','95880','97920','99960','102000','104040','106080','108120','110160','112200','114240','116280','118320','120360','122400','124440','126480','128520','130560','132600','134640','136680','138720','140760','142800','144840','146880','148920','150960','153000','155040','157080','159120','161160']
|
자세한 설명 :
내가 사용한 데이터는 다음과 같은 모양이다.
<1g 데이터>
_id data 1 foekd 2 ldowke ..... 16060 fdhn
|
<10g 데이터>
_id data 1 foekd 2 ldowke ..... 163360 gwgdhd
|
_id는 순차적으로 오름차순으로 올라가고, data 는 Random String 값이다.
HDFS 기준으로 1g 데이터를 128mb(HDFS 의 default block size)로 나누면 8개 block 으로 나뉘는데
대략 2000 씩 나누면 8개가 된다 ( 16060 / 2000 = 8.03 )
따라서 위의 HBase create 명령어를 통해 block size 는 128mb, split 은 2000단위로 8개 값을 옵션으로 주고나서
1g 데이터를 해당 table 에 적재하면 내가 원하는 대로 된다.
10g 데이터 역시 마찬가지다.
HDFS 기준으로 10g 데이터를 128mb 로 나누면 80 block 으로 나뉘는데
대략 2040 씩 나누면 80개가 된다( 163360 / 2040 = 80.08 )
따라서 위의 HBase create 명령어를 통해 block size 는 128mb, split 은 2040단위로 80개 값을 옵션으로 주고나서
10g 데이터를 해당 table 에 적재하면 내가 원하는 대로 된다.
HBase table 에 tsv/csv 파일 적재하는 방법은 여기 참고.
내가 했던 삽질 :
구글링을 하면 HBase table 을 pre-split(데이터가 들어오기 전에 미리 table 을 나눠놓는 것)하는 방법과
block size 를 자체적으로 조절하는 방법을 찾을 수 있다.
둘 중 하나만 세팅해두면 내가 원했던 것을 이룰 수 있을거라 생각했던 어리석은 시절이 있었다.
pre-split 으로 partition 개수를 미리 적절히 조절해두면, 데이터가 들어왔을 때 미리 나눈 곳으로 쏙쏙 들어가지 않을까
(다 들어가면 각각의 partition 이 128mb 가 되도록)
block size 를 정해두면 그 크기만큼 알아서 데이터를 나누지 않을까. 마치 HDFS 가 그러한 것 처럼.
근데 왠걸
pre-split 을 하면 테이블이 잘 나눠지긴 하는데, 처음부터 60kb(default block size) 씩 나눠진 table 들에 넣느라
마지막 데이터들은 하나의 table 에 다 들어가서 data skew(데이터 치우침) 이 발생하였고 (현상을 보고 싶다면 여기 참고)
block size 를 128mb로 바꾸면 원하는 만큼의 table split 이 안 되서
partition 이 단지 4개만 생겼다(심지어 내가 원한 block size로 바뀐 것도 아님).
지금 돌이켜보면 HBase data skew 해결하는 방법이라고 검색했었어야 하지 않았을까 싶다.
관련 링크
https://issues.apache.org/jira/browse/HBASE-12590
참고
https://docs.cloudera.com/documentation/enterprise/5-3-x/topics/admin_configure_blocksize.html
https://docs.cloudera.com/documentation/enterprise/5-5-x/topics/admin_configure_blocksize.html
http://dwgeek.com/splitting-hbase-tables-examples-best-practices.html/
https://hbase.apache.org/book.html#tricks.pre-split
https://stackoverflow.com/questions/28165833/how-can-i-pre-split-in-hbase
hregion max filesize 는 한 노드(slave)에 최대 적재할 수 있는 양을 의미하며 10gb 가 default 이다.
'HBase' 카테고리의 다른 글
[HBase] Snappy 설치 및 적용 방법 (0) | 2019.11.30 |
---|---|
[HBase] auto balance 방법 링크 (0) | 2019.11.21 |
[HBase] table 의 partition 개수 조절하기 (0) | 2019.11.20 |
[HBase] org.apache.hadoop.hbase.util.FileSystemVersionException: hbase.version file is missing. 에러 해결 방법 (0) | 2019.11.14 |
[HBase] ERROR: org.apache.hadoop.hbase.PleaseHoldException: Master is initializing 에러 해결 방법 (0) | 2019.11.14 |