하루 종일 개고생을 한 결과를 여기 적는다.

 

앞서 문제가 생겼을 때 포스트한 것을 참고삼아 읽어봐도 좋을 듯.

 

 

 

 

내가 원했던 것 :

 

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

https://community.cloudera.com/t5/Support-Questions/How-to-manually-manage-number-of-HBase-regions/td-p/127747

https://stackoverflow.com/questions/14238875/how-to-make-hbase-respect-hregion-max-filesize-for-existent-regions-data

hregion max filesize 는 한 노드(slave)에 최대 적재할 수 있는 양을 의미하며 10gb 가 default 이다.

 

+ Recent posts