Google AdSense (text)

hidden logo stop

Moving

거지 같은 이글루스 광고노출 정책이 싫어서,
새 보금자리(http://blog.leocat.kr/)로 이사감.

[HBase] 단조롭게 증가하는 (monotonically increasing) row key 문제 Computer & Program

HBase에 저장할 row key는 잘 생각해서 결정해야 한다. 그 이유 중 하나는 단조롭게(monotonically) 증가하는 row key는 테이블이 커져서 테이블 파일을 나눌 때 문제가 될 수 있다.

이 문제를 만화로 쉽게 설명해 둔 포스트가 있다. http://ikaisays.com/2011/01/25/app-engine-datastore-tip-monotonically-increasing-values-are-bad/ 그림이 총 3장인데 첫 그림은 일반적으로 테이블이 가득차서 2개로 나누는 경우를 보여준다. 2개로 나뉘어지면 쓰기/읽기가 반씩 나눠지기 때문에 성능 문제를 해결할 수 있다.

두번째 그림은 테이블에 쓰기를 하는 데이터의 row key가 'Dog', 'Zebra' 등 랜덤한 데이터가 들어오기 때문에, 테이블을 나눈 다음에 두 테이블에 들어가는 것이 비슷한 것을 볼 수 있다.

하지만 세번째 그림은 데이터의 row key가 대부분 'N'으로 시작하는 단어이기 때문에 테이블을 나눈 다음에도 한 테이블은 놀게 되는 것이다.



여기서 세번째 그림처럼 단조롭게 증가하는 row key의 대표적인 예를 하나 보자. 누구나 쉽게 생각할 수 있는 timestamp이다. 1초에 1개씩 쌓이는 데이터가 있을 때 row key로 시간 정보를 아래처럼 넣을 수 있을 것이다.
ROW                    service    time:avg    time:max
'2012-03-29 00:00:00'  qtime    20        30
'2012-03-29 00:00:01'  qtime    18        32
'2012-03-29 00:00:02'  qtime    23        54
'2012-03-29 00:00:03'  qtime    21        42
'2012-03-29 00:00:04'  qtime    20        34

이 때 테이블을 둘로 나누면 [00-02]초와 [03-04]초로 나눌 수 있을 것이다. 이후에 05, 06, 07, 08초 데이터가 계속 들어오면 첫번째 테이블은 그대로이고 두번째 테이블에만 계속 넣게 되는 형태가 된다. 때문에 timestamp를 row key에 사용하는 것은 HBase 문서에 써 있는 것처럼 좋지 않은 방법이다.

하지만 문서에 있는 OpenTSDB의 예제처럼 timestamp를 사용하면서도 row key를 단조롭지 않게 만들 수 있는 방법이 있다. (OpenTSDB Schema) timestamp 앞에 다른 문자를 조합해서 row key를 생성한다. 위의 정보 중 service column의 내용을 함께 timestamp와 조합해서 아래와 같이 표현했다.
ROW                           service    time:avg     time:max
'access 2012-03-29 00:00:00'  access    23        54
'access 2012-03-29 00:00:01'  access    20        34
'count 2012-03-29 00:00:00'   count     18        32
'count 2012-03-29 00:00:01'   count     20        34
'qtime 2012-03-29 00:00:00'   qtime     20        30
'qtime 2012-03-29 00:00:01'   qtime     21        42

이제 테이블이 나뉘어져도 02초의 데이터는 2개의 테이블에 나뉘어서 들어가게 된다. OpenTSDB는 row key 앞에 조합되는 가지수가 많기 때문에 고른 분포로 테이블에 들어갈 수 있다고 한다.

덧글

댓글 입력 영역

Google AdSense (text/image)