오랜만에 hbase 성능 테스트
- Posted at 2010/12/06 09:23
- Filed under project/neptune
이전에도 테스트를 수행했는데 이번에 테스트한 것과 같이 대량으로 데이터를 저장하는 테스트가 아닌 속도 위주의 테스트만 진행했었습니다. 이번에 테스트한 내용은 다음과 같습니다.
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에 레코드가 많이 쌓일수록 많이 소요되어 있으며 다음과 같다.

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 부하를 줄이면 최소한 데이터가 입력되지 않는 상황은 발생하지 않을 것으로 예측된다. -> 실제 장비 부족으로 테스트를 수행하지는 않음
Posted by 김형준
- Response
- No Trackback , 8 Comments
Trackback URL : http://www.jaso.co.kr/trackback/411
Comments List
-
hbase trunk 버전이 facebook에서 contribute 한 버전이라고 하는것 같던데요. 거기선 또 많은 개선이 있지 않을까요?
책 나오시는거 축하드립니다. ^^ -
책~싸인해주세용~
-
흑 어떻게 알았어여... 스토커???
-
-
10분 이상 걸려 실패되는 건의 경우 빈도수가 높을까요? (고대뤼 입니다.)
-
빈도수가 높다라기 보다는 클러스터가 견딜 수 있는 TPS를 측정할때 이런 증상이 나타나게 되면 감당 가능한 TPS가 넘어었다는 의미겠죠 즉 임계치를 넘었으니까 테스트 할때 request를 더 작게 해서 해봐야 겠죠...
클러스터의 TPS를 알아야 요구사항대비 시스템의 용량이 맞는지 확인해 볼 수 있습니다. 따라서 이런 증상이 자체가 나오면 안되겠죠. ㅋㅋㅋ
-
-
안녕하세요~ 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 일 때)...
어딘가 성능차이가 크게 발생할 만한 부분이 있을까요? -
ㅠㅠ 혹시 도움을 받을 수 있다면 qkfl4@naver.com 으로 약간의 조언을 구하고 싶습니다. ㅠㅠ부탁 드릴 수 있을까요?
-
구체적인 서버 환경과 테스트 프로그램 등을 종합적으로 봐야 알 것 같습니다.
현재 추측해볼 수 있는 것은 성능 테스트에 참여한 클라이언트를 1대 또는 작은 대수로 돌리게 되면 Region Server의 최대 성능을 사용하기 어렵습니다. 그리고 테이블 생성 시 디폴트로 생성하면 Region이 하나만 생성되어 분산의 효과를 보기 어렵습니다.
-






