실제로 ycsb 를 이용하여 HBase 에서 성능 측정을 하는 실전 예제를 설명한다.

 

이 포스트를 작성하는 현 시점(2020년 1월 24일) HBase 의 최신 버전은 2.2.3이다.

 

내가 2.2.2를 사용하고 있으므로 2.2.2 버전에 맞춰서 작성한다.

 

ycsb HBase 공식 문서(아래 HBase 0.98.x 버전 페이지)를 적극 참고한다.

 

HBase 0.98.x 버전 페이지

HBase 1.0.x 버전 및 google의 bigtable service 페이지

HBase 1.2+ 버전 페이지

HBase 1.4+ 버전 페이지

HBase 2.0 이상의 버전 페이지

 

quick start 등의 정보가 0.98.x 문서에 있으므로 그걸 보면 되겠다.

 

ycsb 설치 방법은 여기를 참고한다.

 

HBase 를 설치하는 방법은 여기를 참고한다.

 

 

 

 

 

< 운영 환경 >

 

os는 ubuntu 16.04 에서 진행하였다.

 

 

 

 

 

 

< 실전 예제를 어떻게 진행할 예정인지 >

 

 

구체적인 ycsb 사용법은 여기를 참고한다.

 

아래 정해둔 단계대로 실전 예제를 진행한다.

 

  1. workload 선택
  2. HBase 에 미리 table 을 만듦
  3. 미리 만들어둔 HBase table 에 데이터를 load
  4. 1번에서 선택한 workload 를 실행

 

 

 

 

 

 

 

< workload 선택 >

 

나는 순수 100% read test 를 하고 싶다.

 

그래서 나는 workload c 를 선택하였다.

 

vi ./workloads/workloadc 명령어로 내용을 보면 알겠지만, read proportion 이 1로 지정되어 있다.

 

 

이 proportion 값을 어떻게 정해주느냐에 따라 workload 에서 read 를 몇 % 할지, update 를 몇 % 할지.. 등이 정해지는 것 같다.

 

실례로, read 와 write 를 50:50 으로 실행하는 workload a 를 뜯어보면 다음과 같이 지정되어 있다.

 

 

이로 미뤄보아 이 값만 바꿔주면 내가 원하는 대로 돌아갈 수 있도록 workload 를 직접 수정 가능한 것 같다.

 

 

 

 

 

 

 

< HBase 에 미리 table 을 만듦 >

 

HBase 에 ycsb의 데이터를 load 하기 위해선 HBase 내의 테이블을 미리 만들어두어야 한다.

 

hbase shell 명령어를 통해 HBase 에 접속한 후

 

create 명령어로, 이름은 "usertable" 이고 column family 이름은 "family" 인 테이블을 만든다.

 

 

hbase(main):001:0> n_splits = 3 # HBase recommends (10 * number of regionservers)
hbase(main):002:0> create 'usertable', 'family', {SPLITS => (1..n_splits).map {|i| "user#{1000+i*(9999-1000)/n_splits}"}}

 

 

만든 테이블은 list 명령어를 통해 확인 가능하다.

 

 

만약 table 을 만들지 않은채로 ycsb의 data 를 load 하면 아래 에러가 발생한다.

 

 

site.ycsb.DBException: Table usertable does not exists

 

 

 

 

 

 

 

 

 

< HBase에 data를 load >

 

아래 load 명령어로 workload c에 맞는 data를 넣는다.

 

 

./bin/ycsb load hbase20 -s -P workloads/workloadc -p recordcount=3000 -cp ~/hbase-2.2.2/conf/ -p table=usertable -p columnfamily=family

 

 

-s 옵션을 두어 10초마다 load 명령어가 얼마나 일을 진행했는지 보이게 하였다.

 

-p recordcount 를 3000으로 두어서 HBase에 넣는 레코드의 양을 조절하였다. 3000만큼 사랑해

 

속도를 올리고 싶다면 -threads 옵션을 사용할 수 도 있다(아래 나올 run 명령어에서도 마찬가지) 참고

 

이제 bold 처리한 곳을 보자.

 

내가 2.2.2 버전을 사용하고 있기 때문에 명령어가 hbase20 이 되었다.

 

만약 다른 버전을 사용했더라면 명령어가 달랐을 것이다. 이를 테면 hbase14 등.

 

~/hbase-2.2.2/conf 는 내가 hbae를 설치했을 때 hbase configuration file(hbase-site.xml)을 저장한 곳이다.

 

path 는 각 환경마다 다르다. 설치한 사람에게 물어보자.

 

위의 명령어를 실행하면 아래처럼 나온다. return ok 인 것을 확인해본다.

 

 

 

실제 HBase에서 보면 usertable 이라는 이름의 table을 볼 수 있다.

 

$ hbase shell

hbase(main):001:0> list

hbase(main):002:0> describe "usertable"

 

 

 

 

usertable 내의 데이터가 ycsb에서 workload c 를 위해 넣은 데이터 되시겠다.

 

scan "usertable" 명령어를 통해 안의 내용을 직접 확인볼 수 있으며,

 

hdfs 에서 usertable 의 partition 및 각 partition 별 크기를 확인할 수 있다.

 

 

위의 hdfs 내의 usertable path 역시 각 환경마다 다르다. 처음 hbase 를 설치한 사람한테 물어보면 되겠다.

 

 

 

 

< 선택한 workload 실행 >

 

아래 명령어로 workload c 를 실행해본다.

 

./bin/ycsb run hbase20 -s -P workloads/workloadc -p operationcount=3000 -cp ~/hbase-2.2.2/conf/ -p table=usertable -p columnfamily=family

 

 

operationcount 옵션으로 3000개 레코드 모두에 workload 를 적용하게 하였다.

 

해석해보면 

 

전체 workloadc 의 수행 시간은 5039 ms 이고

 

처리량은 595.35, operation(여기선 read) 한 횟수는 (레코드 개수에 따른) 3000,

 

평균 지연 시간은 1288.078, 최소 지연 시간은 512, 최대 지연 시간은 175103,

 

95번째/99번째 percentile 지연시간은 각각 3145, 3145 us 이다.

 

 

 

 

참고

 

https://github.com/brianfrankcooper/YCSB/tree/master/hbase098

https://songsunbi.tistory.com/62

 

 

 

 

 

+ Recent posts