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

 

ycsb s3 공식 문서를 적극 참고한다.

 

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

 

s3 사용 방법은 여기서 설명하지 않습니다.

 

 

 

 

< 운영 환경 >

 

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

s3 의 region 은 미국 동부 버지니아 북부(us-east-1) 과 아시아 태평양 서울(ap-northeast-2) 에 만들었다.

리전 이름을 알고싶다면 aws service endpoint 안내서의 region endpoint 부분을 참고.

 

 

 

 

 

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

 

 

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

 

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

 

  1. workload 선택
  2. s3 에 미리 bucket 을 만들어 둠
  3. s3 jar files 업데이트
  4. s3 환경 설정
  5. 2번에서 만든 bucket 에 ycsb 의 데이터를 넣음(load)
  6. 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://opencpp.tistory.com/entry/S3-keycopy%EC%99%80-bucketcopykey%EC%97%90%EC%84%9C-%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94-NoSuchKey-%EC%97%90%EB%9F%AC

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

 

 

 

 

 

+ Recent posts