실제로 ycsb 를 이용하여 s3 에서 성능 측정을 하는 실전 예제를 설명한다.
ycsb s3 공식 문서를 적극 참고한다.
ycsb 설치 방법은 여기를 참고한다.
s3 사용 방법은 여기서 설명하지 않습니다.
< 운영 환경 >
os는 ubuntu 16.04 에서 진행하였다.
s3 의 region 은 미국 동부 버지니아 북부(us-east-1) 과 아시아 태평양 서울(ap-northeast-2) 에 만들었다.
리전 이름을 알고싶다면 aws service endpoint 안내서의 region endpoint 부분을 참고.
< 실전 예제를 어떻게 진행할 예정인지 >
구체적인 ycsb 사용법은 여기를 참고한다.
아래 정해둔 단계대로 실전 예제를 진행한다.
- workload 선택
- s3 에 미리 bucket 을 만들어 둠
- s3 jar files 업데이트
- s3 환경 설정
- 2번에서 만든 bucket 에 ycsb 의 데이터를 넣음(load)
- 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 를 직접 수정 가능한 것 같다.
< s3 에 미리 bucket 을 만듦 >
s3 에 ycsb 의 데이터를 load 하기 위해선 s3 내의 bucket 을 미리 만들어두어야 한다.
나의 경우
미국 동부 버지니아 북부(us-east-1) 에 "ycsb-us" 라는 이름으로
아시아 태평양 서울(ap-northeast-2) 에 "ycsb-kr" 라는 이름으로
bucket 둘을 만들었다.
만약 bucket 을 만들지 않은채로 ycsb의 data 를 load 하면 아래 에러가 발생하기 때문에
bucket 을 미리 만들어두어야 한다.
com.amazonaws.services.s3.model.AmazonS3Exception: The specified bucket does not exist (Service: Amazon S3; Status Code: 404; Error Code: NoSuchBucket.....)
|
< s3 jar files 업데이트 >
ycsb 에서 받은 s3 관련 jar 파일들이 오래된 것이라면 s3 client를 사용하여 연동할 때 에러를 유발시킬 수 있다.
아래와 같은 에러들을 유발한다.
java.lang.IllegalArgumentException: Cannot create enum from ap-northeast-2 value! |
Exception in thread "Thread-3" java.lang.NoSuchMethodError: org.apache.http.conn.ssl.SSLConnectionSocketFactory.(Ljavax/net/ssl/SSLContext;Ljavax/net/ssl/HostnameVerifier;) |
com.amazonaws.services.s3.model.AmazonS3Exception: The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'ap-northeast-2' (Service: Amazon S3; Status Code: 400; Error Code: AuthorizationHeaderMalformed;....) |
...... |
cd s3-binding/lib 에 보면 s3 와 통신하기 위한 여러 jar 파일들이 있는데, 여기서 업데이트해야 할 것들을 아래 이미지로 나타내었다.
* aws-java-sdk-core, aws-java-sdk-kms, aws-java-sdk-s3 :
aws maven 사이트에서 받는다.
위의 파일들의 최신 버전을 jar 파일로 받아 대체한다.
* commons-codec, commons-logging, httpclient, httpcore :
apache http components 사이트에서 받는다.
현재 이 포스트를 작성하는 날짜(20년 1월 28일) 기준 4.5.11.tar.gz 을 받아 압축을 풀고 lib 내에 있는 파일들로 대체한다.
* s3-binding : 0.18.0 버전으로 바꿀 필요 없음. 확인해보니 0.17.0 버전으로도 가능했다.
official ycsb git 에서 maven 으로 build 하여 얻는다. 참고
필자가 미리 build 해 둔 s3-binding-0.18.0.jar 를 여기서 받을 수 있다.
0.17 버전을 0.18 버전(YCSB/s3/target/s3-binding-0.18.0-SNAPSHOT.jar) 으로 대체한다.
만약 서울에 있는 s3 bucket (ycsb-kr) 에서 ycsb 를 사용하고 싶은데 안 된다면, bucket의 이름을 바꿔보자.
무슨 영문인지는 모르겠으나, 될 때가 있고 안 될 때가 있는데 bucket의 이름을 바꾸면 될 때가 많더라.
< s3 환경설정 >
s3에 접속하기 위해 configuration 을 손봐야 한다.
vi s3-binding/conf/s3.properties 로 s3.properties 파일을 연다.
그곳에 s3 access key id, s3 secret key, s3 endpoint 를 넣는 곳이 있는데 아래 이미지처럼 자신의 access key id 와 secret key 를 넣는다.
endpoint 는 그대로 두어도 됨.
bucket 접속시 endpoint 에 대한 aws document
< s3에 data를 load >
아래 load 명령어로 workload c에 맞는 data를 넣는다.
./bin/ycsb load s3 -s -P workloads/workloadc -p recordcount=10 -p fieldlength=10 -p fieldcount=20 -p table=ycsb-us
|
-s 옵션을 두어 10초마다 load 명령어가 얼마나 일을 진행했는지 보이게 하였다.
-p recordcount 를 10으로 두어서 HBase에 넣는 레코드의 양을 조절하였다.
속도를 올리고 싶다면 -threads 옵션을 사용할 수 도 있다(아래 나올 run 명령어에서도 마찬가지) 참고
-p fieldlength 를 10으로 두어 filed size 를 조절하였다.
-p fieldcount 를 20으로 두어 number of field 를 조절하였다.
-p table를 ycsb-test 로 두어 버지니아에 있는 ycsb-us 라는 이름의 bucket 에 데이터를 넣음을 명시하였다.
위의 명령어를 실행하면 아래처럼 나온다. return ok 인 것을 확인해본다.
실제 aws s3에서 보면 데이터가 들어간 게 보인다.
서울에 위치해있는 ycsb-kr bucket에도 문제 없이 들어간다.
< 선택한 workload 실행 >
현재 0.17.0 버전에서는 run 명령어가 되질 않는다(....)
아래 에러가 계속 뜬다.
com.amazonaws.services.s3.model.AmazonS3Exception: The specified key does not exist. (Service: Amazon S3; Status Code: 404; Error Code: NoSuchKey;.....)
|
코드에서 지정한 경로에 해당하는 객체가 s3 안에 없을 때 위의 에러가 뜬다고 함.
endpoint 를 이렇게도 줘보고 저렇게도 줘봤는데 되질 않음.
ycsb 에서 s3로 접속할 때 endpoint 나 파라미터 등의 값이 잘못되어있는 듯.
S3 Client 를 java 로 구축해두었기 때문에 문서 봐가면서 직접 수정하면 될 것 같지만 시간이 얼마나 걸릴지 모르겠다.
참고
https://stackoverflow.com/questions/28653249/amazon-s3-exception-the-specified-key-does-not-exist
http://lab4109.blogspot.com/2013/11/amazon-s3-error.html
https://stackoverflow.com/questions/30795320/how-to-authenticate-amazon-s3-endpoint-in-java
https://github.com/IBM/ibm-cos-sdk-js/issues/26
참고
https://github.com/brianfrankcooper/YCSB/tree/master/s3
'눈가락' 카테고리의 다른 글
[AWS] CLI를 사용하여 ec2에서 s3로 업로드/다운로드 하기 링크 (0) | 2020.02.03 |
---|---|
[Linux] terminal 에서 google drive 데이터를 wget 으로 받는 방법 (0) | 2020.01.28 |
[YCSB] Yahoo! Cloud Serving Benchmark HBase hands-on(실전 예제) (0) | 2020.01.24 |
[YCSB] Yahoo! Cloud Serving Benchmark MongoDB hands-on(실전 예제) (3) | 2020.01.23 |
[YCSB] Yahoo! Cloud Serving Benchmark 에서 workload 실행하는 6 단계 (0) | 2020.01.21 |