오랜만에 hbase 성능 테스트

오랜만에 hbase 성능테스트를 하였습니다. 버전은 stable 버전으로 릴리즈된 0.20.6을 사용하였습니다.
이전에도 테스트를 수행했는데 이번에 테스트한 것과 같이 대량으로 데이터를 저장하는 테스트가 아닌 속도 위주의 테스트만 진행했었습니다. 이번에 테스트한 내용은 다음과 같습니다.
1. Hadoop/HBase
  - Hadoop 0.20.2 
  - HBase: 0.20.6
  - 서버: NameNode 1, DataNode 6, 각 서버에 TaskTracker, HBase Region Server 실행
  - Region Server Max Heap: 4GB

2. 테스트 프로그램
  - Map only로 32개의 map task가 각 서버에 6개씩 실행
  - 한 MapTask에서 1000byte 1 row를 1GB 씩 저장
  - 전체 1000개의 Task 수행(약 1TB 저장 테스트)

3. 테스트 결과
  - 전체 작업 52% 진행 후 task kill됨
  - 작업 kill 당시 Region 갯수: 4098, 서버당 약 680개
  - kill 원인은 한건 put하는데 10분 이상 걸려 mapreduce 작업 타임아웃에 걸림
  - 실행 시간 각 MapTask가 32개씩 병렬로 수행되는 구조이기 때문에 32개 * (1024 * 1024 * 1024)/1000 만큼의 갯수가 매번 32개 Task가 종료될때마다 저장됨 따라서 Hbase의 TPS(Transaction per Second) 는 다음과 같이 계산 가능
    TPS = (32개 * (1024 * 1024 * 1024)/1000) / 32개 map task 실행시간

  실행 시간은 hbase에 레코드가 많이 쌓일수록 많이 소요되어 있으며 다음과 같다.

hbase에 데이터가 없는 경우에는 약 7000 TPS 정도 나오지만 테이터 어느 정도 저장된 상태에서는 3000 ~ 4000 정도로 절반 이하로 떨어진다. 이 상태에서 계속해서 데이터가 입력되면 더 이상 데이터를 받아 줄 수 없는 상태가 된다.

4. 시사점
  - 본 테스트의 결과는 6대의 hbase 클러스터로 어느 정도의 throughput을 낼 수 있는지 측정을 하는 것이 었다. 결론적으로는 약 5000 ~ 7000 정도의 TPS의 성능이 나오지만 이런 트래픽이 지속적으로 유입되는 경우에는 저장할 수 없다.
  - 이런 증상은 cloudata(www.cloudata.org)도 거의 유사한데 원인은 관리하는 Region(Tablet)이 많아지면 그 만큼 메모리 관리와 디스크 저장에 오버헤드가 크기 때문이다. hadoop을 파일시스템으로 사용하는 경우 한번의 write가 세개의 서버에 I/O가 발생하기 때문에 오버헤드가 훨씬 더 크다고 할 수 있다.
  - 솔루션 내부적으로 어떻게 잘 스케쥴링 하느냐가 관건인데 아직까지는 최적화가 많이 필요할 것으로 생각된다.
  - 현재의 대안은 hadoop 클러스터와 hbase 클러스터의 크기를 조절하는 방법도 생각해 볼 수 있다. 예를 들어 hadoop을 30대에 설치 했다면 hbase는 1/3 정도인 10대의 서버에만 설치하는 것이다. 이렇게 함으로써 클러스터 전체의 I/O 부하를 줄이면 최소한 데이터가 입력되지 않는 상황은 발생하지 않을 것으로 예측된다. -> 실제 장비 부족으로 테스트를 수행하지는 않음
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


Trackback URL : http://www.jaso.co.kr/trackback/411

Comments List

  1. charsyam 2010/12/08 12:13 # M/D Reply Permalink

    hbase trunk 버전이 facebook에서 contribute 한 버전이라고 하는것 같던데요. 거기선 또 많은 개선이 있지 않을까요?

    책 나오시는거 축하드립니다. ^^

  2. 문관필 2010/12/08 14:11 # M/D Reply Permalink

    책~싸인해주세용~

    1. 김형준 2010/12/08 14:17 # M/D Permalink

      흑 어떻게 알았어여... 스토커???

  3. 진탱이 2011/01/24 16:07 # M/D Reply Permalink

    10분 이상 걸려 실패되는 건의 경우 빈도수가 높을까요? (고대뤼 입니다.)

    1. 김형준 2011/01/24 16:32 # M/D Permalink

      빈도수가 높다라기 보다는 클러스터가 견딜 수 있는 TPS를 측정할때 이런 증상이 나타나게 되면 감당 가능한 TPS가 넘어었다는 의미겠죠 즉 임계치를 넘었으니까 테스트 할때 request를 더 작게 해서 해봐야 겠죠...
      클러스터의 TPS를 알아야 요구사항대비 시스템의 용량이 맞는지 확인해 볼 수 있습니다. 따라서 이런 증상이 자체가 나오면 안되겠죠. ㅋㅋㅋ

  4. 병미니 2012/04/18 15:59 # M/D Reply Permalink

    안녕하세요~ HBase 를 관련해서 공부를 하는 학생입니다.
    근데 제가 구현한 상태에서 측정한 TPS와는 차이가 좀 나서 좀 조언을 구하려고 합니다.

    저는 6개 대신 5개의 서버로 구성하였습니다.

    그리고 원격에서 대략 다음과 같은 코드를 이용하여 데이터를 삽입하였습니다.
    HTable table = new HTable("TEST";);
    for(i = 0; i < 100000; i++) {
    Put put = new Put(Bytes.toByte(i));
    put.add(.....);
    put.add(.....);
    table.put(put);
    }
    대충 이 비슷한 코든데 데이터 자체의 크기도 그리 크지 않습니다.
    위와 같은 로직에서 약 350 TPS 가 나오는데요(Autoflush true 일 때)...
    어딘가 성능차이가 크게 발생할 만한 부분이 있을까요?

  5. 병미니 2012/04/18 16:00 # M/D Reply Permalink

    ㅠㅠ 혹시 도움을 받을 수 있다면 qkfl4@naver.com 으로 약간의 조언을 구하고 싶습니다. ㅠㅠ부탁 드릴 수 있을까요?

    1. 김형준 2012/04/19 10:45 # M/D Permalink

      구체적인 서버 환경과 테스트 프로그램 등을 종합적으로 봐야 알 것 같습니다.
      현재 추측해볼 수 있는 것은 성능 테스트에 참여한 클라이언트를 1대 또는 작은 대수로 돌리게 되면 Region Server의 최대 성능을 사용하기 어렵습니다. 그리고 테이블 생성 시 디폴트로 생성하면 Region이 하나만 생성되어 분산의 효과를 보기 어렵습니다.

Leave a comment
« Previous : 1 : ... 56 : 57 : 58 : 59 : 60 : 61 : 62 : 63 : 64 : ... 410 : Next »