나그네소

YCSB(Yahoo! Cloud Serving Benchmark tool) 본문

sunjesoft/Goldilocks 성능

YCSB(Yahoo! Cloud Serving Benchmark tool)

나그네소티 2019. 6. 4. 09:14

<< YCSB를 이용한 NoSQL BMT >>
보통 NoSQL을 처음 접하고 서비스에 사용 될 오픈소스 NoSQL을 찾다보면 가장먼저 하는 질문이 어느 제품을 써야 하나 이다.
간단히 말하면 빅데이터 개발자는 모든 schema-less Bigdata DB 제품을 통틀어서 NoSQL이라 부르지만 사실상 모든 NoSQL 제품
마다 사용 되는 용도와 적합한 환경이 제각기 다르다. 그렇기 때문에 각 NoSQL의 용도와 접근 패턴별 성능, 확장성, 안정성
등을 요구사항에 맞춰 선택해야 한다.

본인이 직적 NoSQL 성능 테스트를 쿼리 유형 및 패턴별 성능 테스트를 할 수 있게 하는 오픈소스 툴이 있는데 YCSB 이라 한다.

* 참고용 2010년 성능 자료 
SDS DB LAB에서 수행한 YCSB 성능 BMT 수행 결과 보고서

[ 시스템별 성능 영향도 영역 ]
하드웨어 성능 - 동일 클러스터에 YCSB 테스트를 진행하여 하드웨어 성능 차를 최소화 할 수 있다.
네트워크 성능 및 구조 - 네트워크 의존도가 높은 NoSQL과 그렇지 않은 NoSQL을 비교 할 경우 네크워크 성능은 큰 변화를 줄 수 있다.
NoSQL 아키텍쳐 :  NoSQL 코어와 아키텍쳐에 따라 사용되느 ㄴ용도가 결정되는데 이부분이 YCSB를 사용하여 확실한 성능을 확인하고자
                  하는 부분이다. Consistency, Read 최적화 or Write 최적화, Avaliability(데이터이중화 및 복제) 캐쉬 기술 적용
NoSQL 설정 및 튜닝 노하우 :
데이터 스키마 및 키 디자인 - 스키마 디자인에 따라 NoSQL 성능 역시 크게 변할 수 있다. 흔히 RowKey 디자인과 Column Key 디자인을
일컫는데, 데이터 쿼리 요구 사항에 맞추어 wbrkload Generator를 적당히 구성 하면 된다.
사용자 엑세프 패턴 - 스키마 디자인이랑은 다른 영역이다. 스키마 디자인은 어떻게 테이터를 DB상에 보관하느랴이고 엑세스 패턴은
                     데이터를 어떤 패턴으로 읽느냐는 것이다.
                     (Read와 Write 비중, 랜덤 및 시퀀셜 쓰기, 배치 및 실시간, 최신 데이터 및 아카이브 데이터 쿼리)등 다양한 패턴이
                     있지만 이도 스키마 디자인과 마찬가지로 요구사항에 지정되어 있으므로 비교 NoSQ양측에 동일하게 Workload를 구성
                     하면 된다.

[ YCSB ]
Yahoo 에서 사용되는 PNUTS와 최근 급격히 늘어나는 타 NoSQL 솔루션을 비교하기 위해 자체 오픈소스 NoSQL 벤치마크 테스트 툴을 개발
하였다. YCSB는 크게 다음과 같이 두 부분으로 나누어진다.

YCSB 클라이너트 - 워크로드를 생성하고 NoSQL DB Connector 역할을 한다
워크로드 패키지(Property file 포맷)- 워크로드를 생성 하는데 필요한 설정 값 리스트



[ YCSB 테스트 ]
* workload
성능 테스트는 사용자 접근 패턴에 맞는 워크로드를 사용하여 YCSB 내부적으로 테스트를 진행한다.
워크 로드는 다음과 같이 기본 제공되는 워크로드와 사용자 정의 워크로드를 사용 할 수 있다.
* workload A: Update Heavy( read 50%, upate 50% )
실무 예) 최근의 액션을 저장하는 세션 정보 어플리케이션

* workload B: Read Heavy (read 95%, update 5%)
실무 예) 포토 태그 - 태그는 한번만 작성하고 주로 읽기 작업이 실행 된다.

* workload C: Read Only(read 100%)
실무 예) 사용자 프로파일 캐시 - 외부 저장소에 저장되어 있는 사용자 정보를 조회

* Workload D: Read Latest Record(read 95%, insert 5%)
레코드 선택 알고리즘:Zipfian
실무 예) SNS 사용자 상태 업데이터 - 가장 최근의 상태와 뉴스만이 중요 함.

* WorkLoad E: Short Range Scan(Read 95%, Insert 5%)
각 작업마다 100개 내외의 레코드 영역을 한번에 쿼리 한다.
실무 예) 쓰레드 형식의 게시판 - 각 조회마다 포스트의 쓰레드를 스캔 한다.

* WorkLoad F : read-modify-write
읽기, 수정, 쓰기의 단계를 순서대로 수행
실무 예) 상요자 데이터베이스 - 각 사용자 활동마다 사용자 레코드를 읽고 업데이트 한다.
DB 접근 패턴은 매우 다양하므로 사용ㅇ자 요구사항에 맞춰서 워크로드를 구성하면 된다.

아래 부터는 YCSB에서 제공하는 프레임은 아니고 사용자가 위에서 설명한 YCSB툴을 이용하여 직접 테스트
해볼 수 있는 항목이다.

* Tier1 - Performance
동일한 하드웨어 구성에서 데이터 로드에 변화를 주어 성능을 측정하는 테스트이다. 사용자가 목표 쓰루수을 지정하고
위의 워크로드를 실행하면 평균 응답시간(latency)을 받을 수 있다. 쓰루풋을 높일 수록 응답시간은 길어 지는데 특정
쓰루풋에서 응답시간이 매우 높아지거나 응답이 안오는 지수가 있다. 이 지수를 해당 시스템위에서의 NoSQL 최대 쓰루풋
이라 보면 된다.

* Tier2 -Scaling
Scale Up - 클러스터의 워커 노드가 증가함에 따른 성능 차이 테스트이다. 테스트 방식은 데이터를 미리 클러스터에
로드하고 10분정도 기다린다.(데이터가 클러스터에 분산되고 안정화되는 시간). 그 다음엔 원하는 워크로드 와 쓰루풋
(Tier1에서 찾은 최대 쓰루)을 지정하여 성능을 테스트 한다. 테스트 종료하고 노드를 추가한 다음 같은 테스트를 다시
진행하여 응답속도에 대한 변화를 찾아낸다. 노드를 증가하면서 테스트를 반복한다.





<< YCSB 환경 >>
1. java version "1.8.0_211" 이상

2. 결과 확인
ex) ./bin/ycsb run mongodb-async -s -P workloads/workloada > outputRun.txt
--> outputRun.txt 확인
<< YCSB 간단 사용기 >>

이 툴의 주요 목적은 특정 상황에 대해 NoSQL 을 도입 검토하려 할 때 상황에 맞는 벤치마킹 환경 및 결과를 제공함으로써 해당 NoSQL 이 상황에 적합한지, 여러 
개의 NoSQL 중 어떤 게 가장 적합한지를 쉽게 알 수 있도록 함에 있다.

(또한, NoSQL 의 설정을 변경했을 때의 효과 또한 테스트할 수 있을 것 같다) 
이 툴은 크게 두 가지의 장점이 있다.
  1. 지원하는 NoSQL 이 많다: 유명한 NoSQL 은 대부분 지원하는 것 같다
  2. Workload 를 사용하는 것이 간단하다: 기본 Workload 가 대부분의 기능을 지원하므로, 특정 상황을 시뮬레이션하는 데 별다른 노력이 필요하지 않다. operation 횟수 및 operation 의 CRU 비율을 지정할 수 있고 데이터 양과 필드 수, 필드 크기, 심지어 초당 몇 개의 operation (ops) 을 시도할 것인지까지 설정 가능하다 

[ 설치 1 ]
JDK 설치 (필자는 Oracle-Java 1.7.0_05 사용)
tar xvfz ycsb-0.1.4.tar.gz
cd ycsb-0.1.4
./bin/ycsb 해서 실행이 되면 설치 완료


[ 설치 2 ]
$ tar xzf ycsb-0.1.4.tar.gz
$ cd ycsb-0.1.4
$ ./bin/ycsb
Usage: ./ycsb command database [options]

Commands:
load Execute the load phase
run Execute the transaction phase
shell Interactive mode

Databases:

Options:
-P file Specify workload file
-p key=value Override workload property
-s Print status to stderr
-target n Target ops/sec (default: unthrottled)
-threads n Number of client threads (default: 1)

Workload Files:
There are various predefined workloads under workloads/ directory.
for the list of workload properties.

YCSB - Goldi JDBC 환경설정 ]
$ vi jdbc-binding/conf/db.properties
dbc.driver=sunje.goldilocks.jdbc.GoldilocksDriver
db.user=TEST
db.passwd=test

YCSB 수행 ]
$ gsql TEST test

Copyright © 2010 SUNJESOFT Inc. All rights reserved.
Release Venus.3.1.1 revision(23756)


Connected to GOLDILOCKS Database.

gSQL> CREATE TABLE usertable (
2 YCSB_KEY VARCHAR(255) PRIMARY KEY,
3 FIELD0 VARCHAR(4000), FIELD1 VARCHAR(4000),
4 FIELD2 VARCHAR(4000), FIELD3 VARCHAR(4000),
5 FIELD4 VARCHAR(4000), FIELD5 VARCHAR(4000),
6 FIELD6 VARCHAR(4000), FIELD7 VARCHAR(4000),
7 FIELD8 VARCHAR(4000), FIELD9 VARCHAR(4000)
8 );

Table created.

gSQL> quit;

$ ./bin/ycsb load jdbc -P jdbc-binding/conf/db.properties -P workloads/workloada -s > load.dat
Loading workload...
Starting test.
0 sec: 0 operations;
0 sec: 1000 operations; 3389.83 current ops/sec; [INSERT AverageLatency(us)=140.1]

[ 참고 메뉴얼 ]




<< YCSB 간단 사용기2 >>
[ 설치 방법 ]
JDK 설치 (필자는 Oracle-Java 1.7.0_05 사용)

step2. tar xvfz ycsb-0.1.4.tar.gz
step3. cd ycsb-0.1.4
step4. ./bin/ycsb 해서 실행이 되면 설치 완료

[ 실행 방법 : MongoDB ]


1. start MongoDB

2. 압축해제
- tar xvfz mongodb-linux-x86_64-2.4.6.tgz
- mv mongodb-linux-x86_64-2.4.6 mongodb

3. 데이터와 로그가 저장될 디렉토리 생성
mkdir datalogs

4. 설정 파일 생성

# vi mongodb.conf
dbpath=/usr/local/mongodb/data
logpath=/usr/local/mongodb/logs/mongodb.log

logappend=true
verbose=true
port=27017
fork=true
slowms=100
directoryperdb=true
auth=true
rest=true

5. 몽고디비 실행

[root@localhost mongodb]# ./bin/mongod --config mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 1195
all output going to: /usr/local/mongodb/logs/mongodb.log

6. 프로세스 및 포트 확인
[son2865@tech9 mongodb]$ netstat -nlp|grep mongod
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:28017           0.0.0.0:*               LISTEN      25074/./bin/mongod  
tcp        0      0 0.0.0.0:27017           0.0.0.0:*               LISTEN      25074/./bin/mongod  
unix  2      [ ACC ]     STREAM     LISTENING     256139589 25074/./bin/mongod   /tmp/mongodb-27017.sock

7. 실행 확인
SHELL]# ./bin/mongo

> show dbs
admin   (empty)
local   0.078125GB

> use ycsb // ycsb 스키마 접속
> db.usertable.count() // table count 조회
1000
> db.usertable.drop() // usertable truncate




[ ycsb mongodb 측정 example ]

1. 데이터 적재(load)
./bin/ycsb load mongodb-async -s -P workloads/workloada > outputLoad.txt
(default : 1000) 

2. 수행 방법(run)
2-1) aync
./bin/ycsb run mongodb-async -s -P workloads/workloada > outputRun.txt

2-2) sync
./bin/ycsb load mongodb -s -P workloads/workloada > outputLoad.txt
--> 위의 수행은 오류가 나는데 web에서 오류 찾아 수정 해야 함.


[ ycsb mongodb 측정  ]
1. 데이터 적재
${YCSBHOME}/bin/ycsb load mongodb-async -P ${YCSBHOME}/workloads/workloada -p recordcount=5000000 -p operationcount=5000000 -p readallfields=true -p hotspotdatafraction=1 -p insertorder=ordered -threads 50    

2. run
step1. a 
${YCSBHOME}/bin/ycsb run mongodb-async -s -P ${YCSBHOME}/workloads/workloada -p recordcount=5000000 -p operationcount=5000000 -p readallfields=true -p hotspotdatafraction=1 -p insertorder=ordered -threads 50 >> ${YCSBHOME}/ycsb_log/mongodb/ycsb-run-a.log 2>&1

step2. b
${YCSBHOME}/bin/ycsb run mongodb-async -s -P ${YCSBHOME}/workloads/workloadb -p recordcount=5000000 -p operationcount=5000000 -p readallfields=true -p hotspotdatafraction=1 -p insertorder=ordered -threads 50 >> ${YCSBHOME}/ycsb_log/mongodb/ycsb-run-b.log 2>&1

step3. c
${YCSBHOME}/bin/ycsb run mongodb-async -s -P ${YCSBHOME}/workloads/workloadc -p recordcount=5000000 -p operationcount=5000000 -p readallfields=true -p hotspotdatafraction=1 -p insertorder=ordered -threads 50 >> ${YCSBHOME}/ycsb_log/mongodb/ycsb-run-c.log 2>&1

step4. d
${YCSBHOME}/bin/ycsb run mongodb-async -s -P ${YCSBHOME}/workloads/workloadd -p recordcount=5000000 -p operationcount=5000000 -p readallfields=true -p hotspotdatafraction=1 -p insertorder=ordered -threads 50 >> ${YCSBHOME}/ycsb_log/mongodb/ycsb-run-d.log 2>&1

step5. f
${YCSBHOME}/bin/ycsb run mongodb-async -s -P ${YCSBHOME}/workloads/workloadf -p recordcount=5000000 -p operationcount=5000000 -p readallfields=true -p hotspotdatafraction=1 -p insertorder=ordered -threads 50 >> ${YCSBHOME}/ycsb_log/mongodb/ycsb-run-f.log 2>&1

step6. e
db.usertable.drop()
- ${YCSBHOME}/bin/ycsb load mongodb-async -P ${YCSBHOME}/workloads/workloade -p recordcount=5000000 -p operationcount=5000000 -p readallfields=true -p hotspotdatafraction=1 -p insertorder=ordered -threads 50    
--> e을 수행하려면 다시 e로 Load를 해야 한다.

- ${YCSBHOME}/bin/ycsb run mongodb-async -s -P ${YCSBHOME}/workloads/workloade -p recordcount=5000000 -p operationcount=5000000 -p readallfields=true -p hotspotdatafraction=1 -p insertorder=ordered -threads 50 >> ${YCSBHOME}/ycsb_log/mongodb/ycsb-run-e.log 2>&1

--> [OVERALL], Throughput(ops/sec), 25265.79617576909 값을 보면 되고 위의 값은 TPS로 보면 될거 같다.


[ ycsb goldilocks 측정  ]
* jdbc library copy

* jdbc 환경 설정

- path : /home/son2865/work/ycsb-0.15.0/jdbc-binding/conf/db.properties
         cp db.properties gold.properties
         cp goldilocks7.jar  /home/son2865/work/ycsb-0.15.0/lib -- jar file copy
db.driver=sunje.goldilocks.jdbc.GoldilocksDriver
# jdbc.fetchsize=20
db.user=test
db.passwd=test
* gold_autoscript.sh   

YCSBHOME=/home/son2865/work/ycsb-0.15.0

if [ -z "${host}" ]; then host=`hostname -s`; fi

host=`echo $host | sed "s/\-/_/g"`

if [ -z "${tag}" ]; then LOGSUFFIX=`date +"%y%m%d%H%M"`; else LOGSUFFIX=${tag}; fi

gsqlnet --conn-string 'HOST=192.168.0.120;PORT=21004;UID=test;PWD=test' -i $YCSBHOME/ycsb_shell/ginittable.sql

### To Load the workload data#####


${YCSBHOME}/bin/ycsb load jdbc -P ${YCSBHOME}/workloads/workloada -P ${YCSBHOME}/jdbc-binding/conf/gold.properties   -p recordcount=5000000 -p operationcount=5000000 -p readallfields=true -p hotspotdatafraction=1 -p insertorder=ordered -threads 50

for th in 50 35 25 10

do

for wl in a b c f d e

do

if [ "$wl" == "e" ];then
    echo "workload is e"
    gsqlnet --conn-string 'HOST=192.168.0.120;PORT=21004;UID=test;PWD=test' -i $YCSBHOME/ycsb_shell/truncate.sql    
    
    ${YCSBHOME}/bin/ycsb load jdbc -P ${YCSBHOME}/workloads/workloade -P ${YCSBHOME}/jdbc-binding/conf/gold.properties   -p recordcount=5000000 -p operationcount=5000000 -p readallfields=true -p hotspotdatafraction=1 -p insertorder=ordered -threads 50    
    
fi
echo "Results for $th thread ??workload $wl are .."  >> ${YCSBHOME}/ycsb_log/$th\_thread_$wl\_workload_logs.txt

echo "Workload $wl with $th thread started ??"


DTSTART=`date +"%y/%m/%d %H:%M:%S"`


${YCSBHOME}/bin/ycsb run jdbc -s -P ${YCSBHOME}/workloads/workload$wl -P ${YCSBHOME}/jdbc-binding/conf/gold.properties  -p recordcount=5000000 -p operationcount=5000000 -p readallfields=true -p hotspotdatafraction=1 -p insertorder=ordered -threads $th  >> ${YCSBHOME}/ycsb_log/ycsb-${host}-${wl}-run-${th}-${LOGSUFFIX}.log 2>&1


DTEND=`date +"%y/%m/%d %H:%M:%S"`

echo "Workload $wl with $th thread completed .."
echo "ycsbrun,${host},${wl},${DTSTART},${DTEND},${LOGSUFFIX},${th}" >> ${YCSBHOME}/ycsb_log/ycsbtest.log


done

done

* ginittable.sql

DROP TABLE usertable;

--CREATE TABLE usertable (
--        YCSB_KEY VARCHAR(255) PRIMARY KEY,
--        FIELD0 VARCHAR(4000) , FIELD1 VARCHAR(4000) ,
--        FIELD2 VARCHAR(4000) , FIELD3 VARCHAR(4000) ,
--        FIELD4 VARCHAR(4000) , FIELD5 VARCHAR(4000) ,
--        FIELD6 VARCHAR(4000) , FIELD7 VARCHAR(4000) ,
--        FIELD8 VARCHAR(4000) , FIELD9 VARCHAR(4000)
--)SHARDING BY HASH(YCSB_KEY)
--SHARD COUNT 24 AT CLUSTER WIDE;

CREATE TABLE usertable (
        YCSB_KEY VARCHAR(255) PRIMARY KEY,
        FIELD0 VARCHAR(4000) , FIELD1 VARCHAR(4000) ,
        FIELD2 VARCHAR(4000) , FIELD3 VARCHAR(4000) ,
        FIELD4 VARCHAR(4000) , FIELD5 VARCHAR(4000) ,
        FIELD6 VARCHAR(4000) , FIELD7 VARCHAR(4000) ,
        FIELD8 VARCHAR(4000) , FIELD9 VARCHAR(4000)
);

SET AUTOCOMMIT ON;

QUIT;
--> shell에서 수행하여 schmea를 만들어줌.

* truncate.sql

truncate table usertable;
commit;
quit;

* 결과 출력
tech9:/home/son2865/work/ycsb-0.15.0/ycsb_log] ls *run-50*|xargs grep Throughput
ycsb-tech9-a-run-50-1905171725.log:[OVERALL], Throughput(ops/sec), 1497.005988023952
ycsb-tech9-b-run-50-1905171725.log:[OVERALL], Throughput(ops/sec), 2288.329519450801
ycsb-tech9-c-run-50-1905171725.log:[OVERALL], Throughput(ops/sec), 2252.252252252252
ycsb-tech9-d-run-50-1905171725.log:[OVERALL], Throughput(ops/sec), 2178.649237472767
ycsb-tech9-e-run-50-1905171725.log:[OVERALL], Throughput(ops/sec), 1869.1588785046729
ycsb-tech9-f-run-50-1905171725.log:[OVERALL], Throughput(ops/sec), 2202.643171806167

--> 50의 의미는 50개의 스레드에서 출력 한것을 얘기 하는 것이고 현재 50에서의 a~f까지의 결과이다.


[ ycsb oracle 측정  ]
* jdbc library copy

* jdbc 환경 설정

- path : /home/son2865/work/ycsb-0.15.0/jdbc-binding/conf/db.properties
         cp db.properties gold.properties
         cp goldilocks7.jar  /home/son2865/work/ycsb-0.15.0/lib -- jar file copy
db.driver=sunje.goldilocks.jdbc.GoldilocksDriver
# jdbc.fetchsize=20
db.user=test
db.passwd=test
* gold_autoscript.sh   
YCSBHOME=/home/son2865/work/ycsb-0.15.0

if [ -z "${host}" ]; then host=`hostname -s`; fi

host=`echo $host | sed "s/\-/_/g"`

if [ -z "${tag}" ]; then LOGSUFFIX=`date +"%y%m%d%H%M"`; else LOGSUFFIX=${tag}; fi

gsqlnet --conn-string 'HOST=192.168.0.120;PORT=21004;UID=test;PWD=test' -i $YCSBHOME/ycsb_shell/ginittable.sql

### To Load the workload data#####


${YCSBHOME}/bin/ycsb load jdbc -P ${YCSBHOME}/workloads/workloada -P ${YCSBHOME}/jdbc-binding/conf/gold.properties   -p recordcount=5000000 -p operationcount=5000000 -p readallfields=true -p hotspotdatafraction=1 -p insertorder=ordered -threads 50

for th in 50 35 25 10

do

for wl in a b c f d e

do

if [ "$wl" == "e" ];then
    echo "workload is e"
    gsqlnet --conn-string 'HOST=192.168.0.120;PORT=21004;UID=test;PWD=test' -i $YCSBHOME/ycsb_shell/truncate.sql    
    
    ${YCSBHOME}/bin/ycsb load jdbc -P ${YCSBHOME}/workloads/workloade -P ${YCSBHOME}/jdbc-binding/conf/gold.properties   -p recordcount=5000000 -p operationcount=5000000 -p readallfields=true -p hotspotdatafraction=1 -p insertorder=ordered -threads 50    
    
fi
echo "Results for $th thread ??workload $wl are .."  >> ${YCSBHOME}/ycsb_log/$th\_thread_$wl\_workload_logs.txt

echo "Workload $wl with $th thread started ??"


DTSTART=`date +"%y/%m/%d %H:%M:%S"`


${YCSBHOME}/bin/ycsb run jdbc -s -P ${YCSBHOME}/workloads/workload$wl -P ${YCSBHOME}/jdbc-binding/conf/gold.properties  -p recordcount=5000000 -p operationcount=5000000 -p readallfields=true -p hotspotdatafraction=1 -p insertorder=ordered -threads $th  >> ${YCSBHOME}/ycsb_log/ycsb-${host}-${wl}-run-${th}-${LOGSUFFIX}.log 2>&1


DTEND=`date +"%y/%m/%d %H:%M:%S"`

echo "Workload $wl with $th thread completed .."
echo "ycsbrun,${host},${wl},${DTSTART},${DTEND},${LOGSUFFIX},${th}" >> ${YCSBHOME}/ycsb_log/ycsbtest.log


done

done

* ginittable.sql
DROP TABLE usertable;

--CREATE TABLE usertable (
--        YCSB_KEY VARCHAR(255) PRIMARY KEY,
--        FIELD0 VARCHAR(4000) , FIELD1 VARCHAR(4000) ,
--        FIELD2 VARCHAR(4000) , FIELD3 VARCHAR(4000) ,
--        FIELD4 VARCHAR(4000) , FIELD5 VARCHAR(4000) ,
--        FIELD6 VARCHAR(4000) , FIELD7 VARCHAR(4000) ,
--        FIELD8 VARCHAR(4000) , FIELD9 VARCHAR(4000)
--)SHARDING BY HASH(YCSB_KEY)
--SHARD COUNT 24 AT CLUSTER WIDE;

CREATE TABLE usertable (
        YCSB_KEY VARCHAR(255) PRIMARY KEY,
        FIELD0 VARCHAR(4000) , FIELD1 VARCHAR(4000) ,
        FIELD2 VARCHAR(4000) , FIELD3 VARCHAR(4000) ,
        FIELD4 VARCHAR(4000) , FIELD5 VARCHAR(4000) ,
        FIELD6 VARCHAR(4000) , FIELD7 VARCHAR(4000) ,
        FIELD8 VARCHAR(4000) , FIELD9 VARCHAR(4000)
);

SET AUTOCOMMIT ON;

QUIT;
--> shell에서 수행하여 schmea를 만들어줌.

* truncate.sql
truncate table usertable;
commit;
quit;

* 결과 출력
tech9:/home/son2865/work/ycsb-0.15.0/ycsb_log] ls *run-50*|xargs grep Throughput
ycsb-tech9-a-run-50-1905171725.log:[OVERALL], Throughput(ops/sec), 1497.005988023952
ycsb-tech9-b-run-50-1905171725.log:[OVERALL], Throughput(ops/sec), 2288.329519450801
ycsb-tech9-c-run-50-1905171725.log:[OVERALL], Throughput(ops/sec), 2252.252252252252
ycsb-tech9-d-run-50-1905171725.log:[OVERALL], Throughput(ops/sec), 2178.649237472767
ycsb-tech9-e-run-50-1905171725.log:[OVERALL], Throughput(ops/sec), 1869.1588785046729
ycsb-tech9-f-run-50-1905171725.log:[OVERALL], Throughput(ops/sec), 2202.643171806167

--> 50의 의미는 50개의 스레드에서 출력 한것을 얘기 하는 것이고 현재 50에서의 a~f까지의 결과이다.