2016년 12월 18일 일요일

HBase write 성능 튜닝 - Kafka topic partition 개수를 늘려서

대체적인 구성은 다음과 같이 이전에 잡아놓은 구성과 같다.
1. Flafka를 사용.
2. Kafka partition 개수에 맞게 flume 설정의 kafka sink 개수와 kafka source, hbase sink 개수를 설정.
3. Table을 pre-split 한다. (16개로 pre-split 하였음.)
다른 점은 HBase 설정을 변경한 점도 있지만 그것 외에 다른 점은 다음과 같다.
1. Kafka topic의 partition 개수를 edge node들의 총 디스크 수보다 크게 잡는다.
      - Edge node가 3개에 총 15개의 디스크가 있다. 이에 따라 partition 개수를 20개로 주었다.
      - 디스크 총 개수에 맞춰서 Partition개수를 맞추는 것은 놀고 있는 디스크가 생기기 않게 하기 위함이다.
전에는 최대 write 성능이 worker node를 3대로 하든 6대로 하든 초당 16만~17만 정도였다. (WAL을 끄면 30만)
그러나 위와 같이 kafka partition을 늘려주니 hbase 성능이 초당 30만 건 정도의  write할 수 있었다. 

HBase table pre-split region 개수 구하기

HBase에 write를 하다보면 어떤 region에는 write를 하지 않는 경우가 생기게 된다. 
그게 하나 이상의 노드가 되면 해당 노드들은 작업을 하지 않게 되고 다른 노드에 write가 몰리면서 부하가 생기게 된다.
이처럼 write 작업이 되지 않는 구멍이 안생기도록 하기 위해 hbase table의 region을 미리 분할하는데 이를 pre-split이라고 한다.
그러면 pre-split하기 적절한 region 개수는 어떻게 구해야 할까?
그것을 다음과 같은 방식으로 할 수 있다.
우선 다음과 같은 hbase의 설정 값을 계산식에서 사용한다.
1. Region 서버의 자바 힙 크기 = 32GiB
2. hbase.regionserver.global.memstore.upperLimit =0.4
3. hbase.hregion.memstore.flush.size = 128MiB
위의 1과 2의 값을 곱하면 region 서버의 자바 힙에서 write를 위해 사용하는 힙 크기를 구할 수 있다.
이를 memstore에서 flush 하는 크기로 나누면 region 개수를 구할 수 있다.
( 1 * 2) / 3 = 102.4
따라서 위의 값을 가지고 연산하면 102.4가 나오므로 약 102개의 region으로 나누는게 좋다는 걸 알 수 있다.