해당 문서는 StarRocks에서 TPC-DS 100GB 정도의 사이즈를 대상으로 돌리는것을 목표로한 문서입니다. TPC-DS Benchmarking | StarRocks 해당 링크의 내용을 참고하였습니다. 최종 결과는 아래와 같습니다.
다만 개인적으로 테스트를 진행하다보니 해당 Shell script및 Python 코드가 이슈가 있는 경우가 있어서 따로 github에 기존 테스트 pr 포크해서 수정한 내용 공유드립니다(ㅠㅠ)
- 준비사항
- 작성자의 StarRocks Cluster
- 진행순서
- 1. 데이터 생성
- 2. 테이블 스키마 생성
- 3. Load Data(약 1시간 ~)
- 4. Query Data
- 5. 최종결과
- 6. 부록 - Warm up을 없에고 돌려 본다면?
- 결론
준비사항
- StarRocks 클러스터
- Bash shell이 실행 가능한 환경
- mysql-client
- 시간(?) - 데이터 생성에 시간이 많이 소요됩니다(생성에 2시간 이상…)
작성자의 StarRocks Cluster
작성자는 AWS가 아닌 온프램 k8s를 구축하고 테스트를 진행하였습니다.
- CPU : AMD Ryzen™ Threadripper™ PRO 9975WX(Total 32Core / 64Thread) * 2 EA
- RAM : DDR5-5600 RAM(ECC/REG) 64GB * 16EA
- Disk : Local, NAS iSCSI
- Network : 10 Gbps LAN * 2 EA - BOND(balance-rr) 구성
- MinIO(S3) : On-prem(k8s) + NAS(Synology) + SATA SSD
구성요소 | Pod Size(vCore/Mem/Storage) | EA |
FE | 4vCPU / 16GB / 50Gi(Local) | 3 |
CN | 6vCPU / 24GB / 200Gi(NAS CSI) | 5 |
Total | 42vCPU / 168GB / 1,150Gi | 8 |
진행순서
만약 sh 커맨드에서 에러가 발생한다면 bash로 돌려보시길 바랍니다. 혹은 아래와 같이 권한을 부여하는 방식으로도 가능합니다.
1. 데이터 생성
데이터 생성은 아래의 StarRocks에서 제공하는 tpcds 셋을 기준으로 진행합니다.
wget https://starrocks-public.oss-cn-zhangjiakou.aliyuncs.com/tpcds-poc-1.0.zip
unzip tpcds-poc-1.0
cd tpcds-poc-1.0
sh bin/gen_data/gen-tpcds.sh 100 data_100#!/usr/bin/env bash
chmod +x bin/gen_data/gen-tpcds.sh2. 테이블 스키마 생성
아래의 커맨드를 실행하기전에 conf/starrocks.conf 폴더에 cluster 접속 주소 및 정보를 업데이트 하고 진행해야 합니다.
sh bin/create_db_table.sh ddl_1003. Load Data(약 1시간 ~)
해당 코드에서는 shell script를 통해서 Stream Load로 StarRocks에 데이터를 적재하는 Python 코드를 호출합니다. 해당 Python 코드는 후술하는 다음 문제들을 가지고 있습니다.
sh bin/stream_load.sh data_100Issue
- 비밀번호에 특수문자 ‘(’ 같은게 있는 경우 아래 사진과 같은 오류가 발생합니다.
- Stream Load를 호출하기 때문에 k8s의 네부 도메인을 못찾아서 문제 발생
해결방안 : FE-Proxy 사용을 통한 해결, 이 경우 이전 conf/starrocks.conf에 mysql_host(혹은 코드를 수정...)를 FE-Proxy IP 로 그리고 http_port 를Proxy 포트로 변경해 줘야 합니다.4. Query Data
sh bin/benchmark.sh -p -d tpcdsIssue
- 비밀번호에 특수문자 ‘(’ 같은게 있는 경우 아래 사진과 같은 오류가 발생합니다.
# 해결방안 1 : 비밀번호 변경
# 해결방안 2 :
## lib/starrocks_lib.py에 아래의 함수 수정
class StarrocksLib(object):
...
def get_parallel_cmd(self, query_dict):
### cmd 부분 수정필요
cmd = "%s -p%s" % (cmd, self.mysql_password)
### 아래와 같이 -u 부분이 "'" 추가
cmd = "%s -p'%s'" % (cmd, self.mysql_password)5. 최종결과
TPC-DS 쿼리 실행 시간 데이터를 기반으로 차트를 그려보겠습니다.
SQL | SQL | Time(ms) | SQL | Time(ms) | |
Query01 | Query31 | 406 | Query61 | 500 | |
Query02 | Query32 | 42 | Query62 | 92 | |
Query03 | Query33 | 305 | Query63 | 215 | |
Query04 | Query34 | 211 | Query64 | 607 | |
Query05 | Query35 | 351 | Query65 | 552 | |
Query06 | Query36 | 240 | Query66 | 209 | |
Query07 | Query37 | 37 | Query67 | 2090 | |
Query08 | Query38 | 759 | Query68 | 281 | |
Query09 | Query39 | 326 | Query69 | 200 | |
Query10 | Query40 | 103 | Query70 | 628 | |
Query11 | Query41 | 30 | Query71 | 307 | |
Query12 | Query42 | 74 | Query72 | 703 | |
Query13 | Query43 | 379 | Query73 | 173 | |
Query14 | Query44 | 1107 | Query74 | 944 | |
Query15 | Query45 | 103 | Query75 | 921 | |
Query16 | Query46 | 334 | Query76 | 212 | |
Query17 | Query47 | 384 | Query77 | 395 | |
Query18 | Query48 | 359 | Query78 | 1851 | |
Query19 | Query49 | 317 | Query79 | 557 | |
Query20 | Query50 | 379 | Query80 | 589 | |
Query21 | Query51 | 876 | Query81 | 112 | |
Query22 | Query52 | 72 | Query82 | 43 | |
Query23 | Query53 | 228 | Query83 | 82 | |
Query24 | Query54 | 247 | Query84 | 65 | |
Query25 | Query55 | 69 | Query85 | 198 | |
Query26 | Query56 | 304 | Query86 | 98 | |
Query27 | Query57 | 236 | Query87 | 787 | |
Query28 | Query58 | 258 | Query88 | 1370 | |
Query29 | Query59 | 942 | Query89 | 231 | |
Query30 | Query60 | 306 | Query90 | 103 | |
Query91 | 60 | Query95 | 718 | Query99 | 175 |
Query92 | 72 | Query96 | 184 | ||
Query93 | 297 | Query97 | 513 | All time(ms): | 46490 |
Query94 | 173 | Query98 | 403 |
6. 부록 - Warm up을 없에고 돌려 본다면?
test_parallel_performance 해당 코드에는 쿼리를 돌리기전에 Prewarming을 위해서 동일한 쿼리를 한번 돌리고 시작합니다. 그래서 개인적인 호기심으로 해당 Warm up을 아래 사진처럼 주석처리하고 돌려보았습니다(뭔가 치트를 썼던 느낌이 들…..)
SQL | Time(ms) | SQL | Time(ms) | SQL | Time(ms) |
Query01 | 109 | Query11 | 2168 | Query21 | 212 |
Query02 | 190 | Query12 | 72 | Query22 | 1028 |
Query03 | 77 | Query13 | 293 | Query23 | 5060 |
Query04 | 2015 | Query14 | 2310 | Query24 | 723 |
Query05 | 384 | Query15 | 312 | Query25 | 339 |
Query06 | 142 | Query16 | 335 | Query26 | 178 |
Query07 | 376 | Query17 | 551 | Query27 | 288 |
Query08 | 185 | Query18 | 247 | Query28 | 889 |
Query09 | 976 | Query19 | 112 | Query29 | 396 |
Query10 | 206 | Query20 | 71 | Query30 | 112 |
SQL | Time(ms) | SQL | Time(ms) | SQL | Time(ms) |
Query31 | 624 | Query41 | 29 | Query51 | 881 |
Query32 | 46 | Query42 | 89 | Query52 | 90 |
Query33 | 326 | Query43 | 265 | Query53 | 226 |
Query34 | 225 | Query44 | 1091 | Query54 | 224 |
Query35 | 334 | Query45 | 103 | Query55 | 92 |
Query36 | 235 | Query46 | 323 | Query56 | 320 |
Query37 | 50 | Query47 | 398 | Query57 | 256 |
Query38 | 794 | Query48 | 231 | Query58 | 255 |
Query39 | 323 | Query49 | 312 | Query59 | 934 |
Query40 | 99 | Query50 | 400 | Query60 | 317 |
SQL | Time(ms) | SQL | Time(ms) | SQL | Time(ms) |
Query61 | 501 | Query71 | 321 | Query81 | 155 |
Query62 | 99 | Query72 | 742 | Query82 | 54 |
Query63 | 207 | Query73 | 204 | Query83 | 80 |
Query64 | 609 | Query74 | 970 | Query84 | 75 |
Query65 | 554 | Query75 | 907 | Query85 | 204 |
Query66 | 206 | Query76 | 226 | Query86 | 109 |
Query67 | 2129 | Query77 | 394 | Query87 | 739 |
Query68 | 285 | Query78 | 1726 | Query88 | 1322 |
Query69 | 219 | Query79 | 402 | Query89 | 232 |
Query70 | 645 | Query80 | 653 | Query90 | 75 |
SQL | Time(ms) | SQL | Time(ms) | SQL | Time(ms) |
Query91 | 72 | Query95 | 718 | Query99 | 185 |
Query92 | 81 | Query96 | 185 | ||
Query93 | 328 | Query97 | 548 | All time(ms): | 47797 |
Query94 | 195 | Query98 | 193 |
결론
- 저의 예상보다는 쿼리가 더 빨리 돌아가긴 했습니다(예전에 10GB를 작은 사이즈에서 돌렸던 적이 있는데 확실히… 클러스터 사이즈가)
- 웜업하는 구조도 있긴 하지만 영향도가 크지 않은 것으로 보입니다.. 이미 디스크 캐시에 들어가 있으면 크게 효과가 사실상 크게 효과가 없어 보입니다.
- StarRocks 3.0.5 버전결과로 올라왔던 네이티브 결과보다 약 4배 더 빨라진 쿼리속도입니다!
- 서버의 사이즈는 StarRocks 공식이 32core/128GB 정도이며 저의 환경이 42core / 168GB 인걸 감수하고도 엄청난 차이인거 같습니다. + 저는 CN 구조이지만 StarRocks는 BE구조로 테스트 했으니 코어랑 메모리 차이는 비슷하다고 봐도…되지 않을까요?
