DIP 플랫폼 TPC-DS 벤치마크 테스트 계획

DIP 플랫폼의 배치 ELT, 실시간 CDC, 분석 쿼리 성능을 TPC-DS 표준 벤치마크로 정량 측정하는 테스트 계획서입니다. Spark, StarRocks, OLake, Kafka CDC 파이프라인을 비교 검증합니다.

DIP 플랫폼 TPC-DS 벤치마크 테스트 계획

목차

  1. 테스트 목적
  2. 테스트 환경
  3. 테스트 시나리오
  4. TPC-DS 데이터 생성 및 적재
  5. 성능 측정 도구 및 자동화
  6. 테스트 수행 일정
  7. 결과 보고서 형식
  8. 성공 기준 (Pass/Fail Criteria)
  9. 리스크 및 고려사항
  10. 참고 자료

1. 테스트 목적

DIP 플랫폼의 데이터 처리 성능을 TPC-DS 표준 벤치마크를 기반으로 정량적으로 측정합니다. 테스트는 배치 적재, 실시간 CDC, 분석 쿼리의 세 가지 영역으로 구분하며, 각 영역별 핵심 지표를 아래와 같이 정의합니다.

테스트 영역 측정 대상 DIP 구성요소
ELT — 배치 대량 데이터 적재 처리량(throughput) Spark → Iceberg → StarRocks (External Catalog)
ELT — 실시간(CDC) 변경 데이터 전파 지연시간(latency) 및 초기적재 처리량 경로A: OLake → Iceberg / 경로B: Debezium → Kafka → Iceberg
Query 분석 쿼리 응답시간(response time) StarRocks (Iceberg External Catalog)

2. 테스트 환경

2.1 테스트 절차

아래 다이어그램은 전체 벤치마크 파이프라인의 데이터 흐름을 나타냅니다. DuckDB로 생성한 TPC-DS 데이터를 PostgreSQL에 적재한 뒤, 배치(Spark) 및 실시간(OLake/Kafka) 경로를 통해 Iceberg에 기록하고, StarRocks External Catalog로 분석 쿼리를 수행합니다.

┌──────────────────────────────────────────────────────────────────────────────┐
│                     DIP TPC-DS 벤치마크 파이프라인                              │
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  ① 데이터 생성        ② 소스 적재          ③ Batch ELT                       │
│  ┌──────────┐        ┌──────────┐         ┌──────────────┐                  │
│  │  DuckDB  │Parquet │PostgreSQL│  JDBC   │ Spark-Iceberg│                  │
│  │ TPC-DS   │──────▶│  tpcds   │───────▶│   Batch ELT  │                  │
│  │ dsdgen() │ 24tbl  │  _sf1    │  Read   │              │                  │
│  └──────────┘        └────┬─────┘         └──────┬───────┘                  │
│                           │                       │ Write                    │
│                           │                       ▼                          │
│  ④ 쿼리 벤치마크         │               ┌──────────────┐                   │
│  ┌──────────────┐  Ext.  │               │   Iceberg    │                   │
│  │  StarRocks   │◀───────┼───────────────│  (MinIO S3)  │                   │
│  │  TPC-DS 99Q  │ Catalog│               │  Lakekeeper  │                   │
│  └──────────────┘        │               └──────────────┘                   │
│                           │                       ▲                          │
│  ⑤ CDC 실시간 적재       │                       │                          │
│  ┌──────────────┐        │               ┌───────┴──────┐                   │
│  │  경로A: OLake │◀───────┤               │  Iceberg     │                   │
│  │  (Kafka-less) │───────┼──────────────▶│  Write       │                   │
│  └──────────────┘   WAL  │               └──────────────┘                   │
│  ┌──────────────┐        │                       ▲                          │
│  │ 경로B: Kafka  │◀───────┘               ┌───────┴──────┐                   │
│  │ Debezium+Sink│────────────────────────▶│  Iceberg     │                   │
│  └──────────────┘                         │  Sink        │                   │
│                                           └──────────────┘                   │
└──────────────────────────────────────────────────────────────────────────────┘

2.2 HW/SW 사양

2.2.1 HW (Google Cloud)

구분 머신 타입 vCPU RAM Boot Disk Data Disk
rke2-node × 3 n2-standard-8 8 32 GB 100 GB pd-ssd 1,000 GB pd-ssd
pg × 1 e2-standard-8 8 32 GB 50 GB pd-ssd 1,000 GB pd-ssd
  • rke2-node Data Disk 마운트: /var/lib/longhorn (Longhorn 분산 스토리지)
  • PostgreSQL Data Disk 마운트: /data

2.2.2 SW

항목 버전
PostgreSQL 16.x
Spark 3.5.x
StarRocks 3.5.2
Kafka 3.8.1 (KRaft, 단일 브로커)
Debezium 2.7 (PostgreSQL Source Connector)
Iceberg Sink Tabular 0.6.19
OLake v0.3.16 (olakego/source-postgres)
Lakekeeper latest (Iceberg REST Catalog)

2.3 TPC-DS 데이터 스케일 팩터

단계 Scale Factor 데이터 크기 (Parquet) 행 수 (전체 24 테이블) 용도
SF-1 1 ~264 MB 약 1,960만 건 기능 검증, 파이프라인 디버깅
SF-100 100 ~100 GB 약 수십억 건 본 성능 측정

SF-100 이상은 클러스터 리소스 여유에 따라 선택적으로 수행합니다.

2.4 TPC-DS 스키마 개요

  • Fact 테이블 (7개): store_sales, catalog_sales, web_sales, inventory, store_returns, catalog_returns, web_returns
  • Dimension 테이블 (17개): customer, item, date_dim, store, warehouse, customer_demographics 등
  • 총 테이블 수: 24개

3. 테스트 시나리오

3.1 ELT 성능 — 배치 (Batch ELT)

목적: PostgreSQL에서 Iceberg로의 대량 데이터 일괄 적재 성능을 측정합니다.

3.1.1 테스트 경로

PostgreSQL ──(Spark JDBC Read)──▶ Iceberg (MinIO S3) ──▶ StarRocks (External Catalog)

3.1.2 측정 항목

지표 단위 설명
Total Load Time 초(s) 전체 24개 테이블 적재 완료까지의 총 소요 시간
Throughput rows/s 단위 시간당 처리 행 수
Table Load Time 초(s) 개별 테이블(특히 Fact 테이블) 적재 시간
Resource Utilization % CPU, Memory, Disk I/O, Network 사용률

3.1.3 실행 절차

  1. TPC-DS 데이터 생성 (DuckDB dsdgen)
  2. PostgreSQL에 스키마 생성 및 데이터 로드 (DuckDB postgres 확장)
  3. Spark Job 실행 — 시간 측정 시작
  4. 적재 완료 확인 및 소스-타겟 행 수 검증
  5. 시간 측정 종료, 리소스 메트릭 수집

3.2 ELT 성능 — 실시간 CDC (Real-time ELT)

목적: 소스 DB 변경 사항의 실시간 반영 지연시간을 측정하고, 두 CDC 경로(OLake vs Kafka)의 초기적재 처리량을 비교합니다.

3.2.1 테스트 경로

경로A: PostgreSQL (WAL) ──▶ OLake Worker ──▶ Iceberg (Lakekeeper)
경로B: PostgreSQL (WAL) ──▶ Debezium Source ──▶ Kafka ──▶ Iceberg Sink Connector ──▶ Iceberg (Lakekeeper)
경로 CDC 엔진 특징
경로A OLake Kafka 없이 PostgreSQL → Iceberg 직접 적재. Iceberg 타겟에 특화되어 있으며 UI 기반 설정 제공
경로B Debezium + Kafka Kafka 기반 이벤트 스트리밍. 다양한 타겟으로 확장 가능하나 설정이 상대적으로 복잡

3.2.2 측정 항목

지표 단위 설명 적용 경로
Initial Load Time 초(s) 전체 테이블 초기적재 완료 시간 A, B
Initial Load Throughput rows/s 초기적재 시 초당 처리 행 수 A, B
End-to-End Latency ms 소스 INSERT/UPDATE 시점 ~ Iceberg 반영 시점 A, B
P50 / P95 / P99 Latency ms 백분위별 지연 시간 A, B
CDC Throughput events/s 초당 처리 CDC 이벤트 수 A, B
Kafka Consumer Lag events Kafka consumer lag (Kafka 경로에만 해당) B
Data Consistency % 소스-타겟 간 데이터 일치율 A, B

3.2.3 테스트 케이스

초기적재 (Initial Load) 비교:

ID 테스트명 설명 경로 SF
R-01 OLake Initial Load OLake 전체 테이블 초기적재 A 100
R-02 Kafka CDC Initial Load Debezium 스냅샷 기반 초기적재 B 100
R-03 Throughput Comparison R-01, R-02 결과 기반 초기적재 처리량 비교 분석 A, B 100

CDC 실시간 변경 반영:

ID 테스트명 설명 경로 부하
R-04 Single Row Latency 단건 INSERT 후 Iceberg 반영 시간 A, B 1 row
R-05 Burst Insert 100만 건 일괄 INSERT 후 전체 반영 완료 시간 A, B 1M rows
R-06 Sustained Load 지속적 INSERT (100 rows/s × 10분) A, B 60K rows
R-07 Mixed DML INSERT 70% / UPDATE 20% / DELETE 10% 혼합 부하 A, B 10K rows
R-08 Peak Load 최대 처리량 도달 시점까지의 부하 증가 테스트 A, B 600K rows
R-09 Schema Evolution 컬럼 추가 후 CDC 정상 동작 여부 확인 A, B
R-10 Recovery Test CDC 프로세스 장애 후 복구 시 데이터 정합성 검증 A, B
R-11 Large Transaction 단일 트랜잭션 내 10만 건 변경 처리 A, B 100K rows

3.2.4 지연시간 측정 방법

소스 테이블에 타임스탬프 컬럼(_benchmark_ts)을 추가하고, Iceberg 반영 시점과의 차이를 계산합니다.

-- PostgreSQL 소스: 타임스탬프 포함 INSERT
INSERT INTO store_sales_cdc (ss_sold_date_sk, ..., _benchmark_ts)
VALUES (..., clock_timestamp());

-- Iceberg 타겟: 반영 시점 확인 (Spark SQL)
SELECT _benchmark_ts,
       current_timestamp() AS received_ts,
       (unix_timestamp(current_timestamp()) - unix_timestamp(_benchmark_ts)) * 1000 AS latency_ms
FROM lakekeeper.<namespace>.store_sales_cdc
WHERE _benchmark_ts > '2026-03-10 10:00:00';

경로A (OLake): Iceberg namespace는 OLake Job 설정에 의해 자동 생성됩니다.
경로B (Kafka): Iceberg namespace는 Sink 커넥터의 동적 라우팅에 의해 결정됩니다 (예: debezium_tpcds_sf1).

⚠️ 주의: 지연시간 정확도를 높이기 위해 소스와 타겟 시스템 간 NTP 시간 동기화가 필수입니다. 가능하면 동일 서버에서 측정하는 것을 권장합니다.

3.2.5 실행 절차

경로A (OLake):

  1. OLake UI에서 Source 등록 (PostgreSQL, tpcds_sf1)
  2. Destination 등록 (Iceberg REST Catalog + MinIO)
  3. Job 생성 (Full Refresh + CDC, Upsert 모드)
  4. 초기적재 완료 확인 및 소스-타겟 행 수 검증
  5. 부하 생성 스크립트 실행 (INSERT / UPDATE / DELETE)
  6. Spark SQL로 Iceberg 반영 시점 확인 및 지연시간 측정
  7. 메트릭 수집 및 결과 기록

경로B (Kafka CDC):

  1. Kafka + Connect 클러스터 시작
  2. register-connectors.sh 실행 (멱등 커넥터 등록)
  3. Debezium Source 스냅샷 완료 대기 (초기적재)
  4. Iceberg 행 수 검증 (StarRocks External Catalog 활용)
  5. 부하 생성 스크립트 실행 (INSERT / UPDATE / DELETE)
  6. Iceberg 반영 시점 확인 및 지연시간 측정
  7. Kafka UI에서 Consumer Lag 모니터링
  8. 메트릭 수집 및 결과 기록

3.3 Query 성능 (Analytical Query)

목적: Iceberg에 적재된 TPC-DS 데이터에 대해 StarRocks External Catalog를 통한 분석 쿼리 응답 시간을 측정합니다.

3.3.1 테스트 대상

  • 엔진: StarRocks 3.5.2 (Iceberg External Catalog)
  • 쿼리 수: TPC-DS 99개 쿼리 (StarRocks 호환 문법으로 변환 완료)
  • 데이터: 배치 ELT 또는 CDC로 적재된 Iceberg 테이블

3.3.2 쿼리 분류

카테고리 TPC-DS 쿼리 예시 특성
단순 스캔/필터 Q3, Q7, Q19, Q42, Q52, Q55 단일 Fact 테이블, 간단한 조인
다중 조인 Q13, Q17, Q25, Q29, Q34 3개 이상 테이블 조인
집계/그룹핑 Q1, Q6, Q11, Q27, Q46 GROUP BY, HAVING, 윈도우 함수
서브쿼리/CTE Q4, Q14, Q23, Q31, Q39 복잡한 서브쿼리, WITH절
대규모 조인 Q64, Q72, Q78, Q80, Q82 대형 Fact 테이블 간 조인

3.3.3 측정 항목

지표 단위 설명
Query Response Time 초(s) 개별 쿼리 실행 시간
Geometric Mean 초(s) TPC-DS 표준 기하평균 성능 지표
Cold / Warm Run 초(s) 캐시 미적용 상태(Cold) vs 캐시 활용 상태(Warm)
Throughput queries/hr 시간당 처리 쿼리 수 (Power + Throughput test)
Concurrency 동시 사용자 증가에 따른 성능 변화
Query Profile 실행 계획, 스캔 행 수, 메모리 사용량

3.3.4 테스트 케이스

ID 테스트명 설명 SF
Q-01 Power Test (Cold Run) 99개 쿼리 순차 실행, 캐시 초기화 후 1회차 100
Q-02 Warm Run 99개 쿼리 순차 실행, 2회차 (캐시 활용) 100
Q-03 Category Drill-down 카테고리별 대표 쿼리 상세 프로파일링 100
Q-04 Concurrency — 2 users 2개 동시 세션에서 쿼리 실행 100
Q-05 Concurrency — 4 users 4개 동시 세션에서 쿼리 실행 100
Q-06 Concurrency — 8 users 8개 동시 세션에서 쿼리 실행 100
Q-07 Mixed Workload 쿼리 실행 중 배치 적재 동시 수행 시 영향 측정 100
Q-08 Top-10 Slowest 가장 느린 10개 쿼리에 대한 튜닝 전/후 비교 100

3.3.5 실행 절차

  1. DuckDB tpcds_queries()로 표준 쿼리 추출 → StarRocks 문법으로 변환
  2. StarRocks 호환성 검증 및 비호환 쿼리 수정
  3. 캐시 초기화 (Cold Run 시)
  4. 쿼리 순차 실행 및 개별 실행 시간 측정
  5. 쿼리 프로파일(EXPLAIN ANALYZE) 수집
  6. Geometric Mean 산출

4. TPC-DS 데이터 생성 및 적재

4.1 데이터 생성

DuckDB TPC-DS 확장(dsdgen)을 사용하여 데이터를 생성하고, Parquet(ZSTD 압축) 형식으로 내보냅니다.

# TPC-DS 데이터 생성 (SF-1)
python benchmark/data/generate_tpcds.py 1

# TPC-DS 데이터 생성 (SF-100)
python benchmark/data/generate_tpcds.py 100

4.2 PostgreSQL 적재

DuckDB postgres 확장을 통해 Parquet 파일을 PostgreSQL에 고속으로 적재합니다. 스크립트는 멱등성이 보장되어 반복 실행 시 기존 데이터를 안전하게 교체합니다.

# PostgreSQL 적재 (멱등)
python benchmark/data/load_to_postgres.py 1

4.3 StarRocks External Catalog 설정

StarRocks에서 Iceberg 테이블에 대해 별도 적재 없이 External Catalog를 통해 직접 쿼리합니다.

CREATE EXTERNAL CATALOG bmt_catalog
PROPERTIES (
    "type" = "iceberg",
    "iceberg.catalog.type" = "rest",
    "iceberg.catalog.uri" = "http://lakekeeper:8181/catalog",
    "iceberg.catalog.warehouse" = "iceberg",
    "aws.s3.endpoint" = "http://minio:9000",
    "aws.s3.region" = "us-east-1",
    "aws.s3.enable_path_style_access" = "true"
);

-- 쿼리 예시
SELECT COUNT(*) FROM bmt_catalog.tpcds_sf1.store_sales;

5. 성능 측정 도구 및 자동화

용도 도구 설명
데이터 생성 DuckDB dsdgen TPC-DS 표준 데이터 생성 (Python 스크립트)
쿼리 생성 DuckDB tpcds_queries() TPC-DS 표준 쿼리 추출 및 StarRocks 문법 변환
배치 ELT Spark + Lakekeeper JDBC Read → Iceberg Write
CDC (경로A) OLake PostgreSQL → Iceberg 직접 적재
CDC (경로B) Debezium + Kafka + Iceberg Sink Kafka 기반 CDC 파이프라인
CDC 부하 생성 Python 스크립트 / pgbench INSERT / UPDATE / DELETE 부하
쿼리 벤치마크 Python + pymysql StarRocks 쿼리 자동 실행 및 시간 측정
Kafka 모니터링 Kafka UI (Provectus) Consumer Lag, Topic, Connector 상태 확인
리소스 수집 sar, iostat, vmstat OS 레벨 CPU / Memory / Disk I/O 모니터링

6. 테스트 수행 일정

단계 Activity 주요 Task
Step 1 환경 준비 인프라 생성, TPC-DS 데이터 생성 및 PostgreSQL 적재, 각 컴포넌트 구성
Step 2 배치 ELT Spark → Iceberg 적재 수행 및 성능 측정
Step 3 Query 성능 Q-01 ~ Q-08 수행 (Cold/Warm Run), 쿼리 호환성 수정
Step 4 실시간 CDC — 초기적재 R-01 ~ R-03 수행, OLake vs Kafka 초기적재 처리량 비교
Step 5 실시간 CDC — 변경 반영 R-04 ~ R-11 수행, 지연시간 및 정합성 측정
Step 6 분석 및 보고 결과 정리, 병목 구간 분석, 최종 보고서 작성

7. 결과 보고서 형식

아래는 보고서 템플릿입니다. 실측값은 테스트 수행 후 채워집니다.

7.1 배치 ELT 결과 요약

SF 테이블 수 총 행 수 총 크기 적재 시간 Throughput
1 24 19,557,579 ~264 MB 324초 57K rows/s
100 24 ~100 GB

7.2 CDC 초기적재 비교 결과

경로 방식 데이터 소요 시간 Throughput 비고
A OLake 10,550,966행 (3 tbl) 125초 84K rows/s Kafka 없이 직접 적재
B Kafka CDC (최적화 후) 19,557,579행 (24 tbl) ~600초 ~33K rows/s Debezium + Kafka
B Kafka CDC (최적화 전) 19,557,579행 (24 tbl) ~1,740초 ~11K rows/s 기본 설정

⚠️ 경로A(OLake)와 경로B(Kafka CDC)는 적재 대상 테이블 수가 다르므로(3개 vs 24개), 행당 처리량(rows/s)으로 비교해야 합니다. 동일 조건 비교를 위해 SF-100 테스트에서는 양 경로 모두 동일 테이블 셋을 대상으로 수행할 예정입니다.

7.3 CDC 실시간 결과 요약

테스트 건수 P50 (ms) P95 (ms) P99 (ms) Max (ms) 경로
Single Row 1 A, B
Burst 1M 1,000,000 A, B
Sustained 60,000 A, B
Mixed DML 10,000 A, B
Peak Load 600,000 A, B

7.4 Query 성능 결과 요약

SF 쿼리 수 성공률 Geometric Mean Min Max Cold / Warm
1 99 100% 1.044초 0.150초 21.793초 1.044s / —
100 99 — / —

7.5 동시성 테스트 결과

동시 사용자 Geometric Mean Throughput (queries/hr) 성능 저하율
1 baseline
2
4
8

8. 성공 기준 (Pass/Fail Criteria)

8.1 배치 ELT

항목 기준
데이터 정합성 소스-타겟 행 수 100% 일치
SF-100 적재 시간 3시간 이내
Throughput 최소 10K rows/s 이상

8.2 실시간 CDC

항목 기준 적용 경로
초기적재 데이터 정합성 소스-타겟 행 수 100% 일치 A, B
초기적재 Throughput 경로A(OLake)가 경로B(Kafka CDC) 대비 우위 확인 A, B
단건 E2E Latency (P95) 3초 이내 A, B
지속 부하 시 Latency (P95) 10초 이내 A, B
CDC 데이터 정합성 INSERT / UPDATE / DELETE 모두 소스-타겟 100% 일치 A, B
장애 복구 후 정합성 데이터 유실 0건 A, B

8.3 Query 성능

항목 기준
SF-1 Geometric Mean 5초 이내
SF-100 Geometric Mean 60초 이내
동시 4 사용자 성능 저하 단일 사용자 대비 50% 이내

성공 기준은 실제 HW 사양 및 클러스터 리소스 상황에 따라 조정될 수 있습니다.


9. 리스크 및 고려사항

리스크 영향 대응 방안
TPC-DS 쿼리 StarRocks 비호환 일부 쿼리 측정 불가 비호환 쿼리 수동 수정 (Q49, Q70, Q86 수정 완료)
리소스 부족 (SF-100) 테스트 불가 또는 OOM 발생 SF-10으로 대체 수행 후 리소스 확장 검토
OLake 비ASCII 컬럼명 미지원 한글 컬럼 포함 스키마에서 충돌 발생 영문 컬럼명으로 사전 변환
OLake 커뮤니티 성숙도 부족 예상치 못한 버그 발생 가능 이슈 발생 시 Kafka CDC 경로로 대체
Kafka CDC 설정 복잡도 초기 셋업 지연 멱등 스크립트 및 커넥터 JSON 템플릿 활용
Debezium tasks.max=1 제약 Source Connector 병렬 처리 불가 snapshot.max.threads 설정으로 스냅샷 단계 병렬화
Kafka Sink 토픽 발견 지연 초기적재 시 신규 토픽 동시 소비 불가 metadata.max.age.ms=5000 설정으로 메타데이터 갱신 주기 단축
시스템 간 시간 동기화 미비 지연시간(Latency) 측정 오차 증가 NTP 동기화 필수 적용, 가능 시 동일 서버에서 측정
네트워크 병목 테스트 결과 왜곡 전용 네트워크 확보 또는 동일 호스트 구성

10. 참고 자료

Subscribe to PAASUP IDEAS

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe