Back to blog

EDB Postgres AIยทApache Spark GPU ๊ฐ€์† ๊ตฌ์ถ• ๊ฐ€์ด๋“œ

August 05, 2026

์ž‘์„ฑ์ผ: 2026๋…„ 3์›” 16์ผ

์ž‘์„ฑ์ž: Dunith Danushka

์ด ๊ธ€์€ EDB Postgres์—์„œ GPU ๊ฐ€์† ์ฟผ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•œ ์ถœ์‹œ ๋ธ”๋กœ๊ทธ์˜ ํ›„์† ํ•ธ์ฆˆ์˜จ ํŠœํ† ๋ฆฌ์–ผ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” NVIDIA RAPIDS Accelerator for Apache Spark๋ฅผ ์‚ฌ์šฉํ•ด EDB Postgres ์ฟผ๋ฆฌ๋ฅผ GPU๋กœ ๊ฐ€์†ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. EDB Postgres AI์™€ Apache Spark ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํ†ตํ•ฉํ•˜๊ณ , CPU ์ „์šฉ ํ™˜๊ฒฝ์—์„œ ์—ฐ๊ฒฐ์„ ๊ฒ€์ฆํ•œ ๋’ค NVIDIA Brev์˜ L40S GPU ํ™˜๊ฒฝ์—์„œ TPC-DS ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด, ๋ฐ์ดํ„ฐ ๊ณผํ•™์ž, ์†”๋ฃจ์…˜ ์•„ํ‚คํ…ํŠธ๊ฐ€ ๊ณ ์„ฑ๋Šฅ ๋ถ„์„ ํ™˜๊ฒฝ์„ ์ง์ ‘ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ช…๋ น์–ด์™€ ์„ค์ •์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์Šต์„ ๋ฐ”๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•„์š”ํ•œ Docker Compose ์Šคํƒ๊ณผ ์„ค์ •์ด ํฌํ•จ๋œ GitHub ์ €์žฅ์†Œ๋ฅผ ํ•จ๊ป˜ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ณธ ๊ฐ€์ด๋“œ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ํŒŒํŠธ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

  • Part 1: CPU ์ „์šฉ ์Šคํƒ์œผ๋กœ ๋กœ์ปฌ ๊ฒ€์ฆ: CPU๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ์ „์ฒด ์Šคํƒ์„ ๊ตฌ์„ฑํ•˜๊ณ , ์šด์˜ ํ™˜๊ฒฝ์œผ๋กœ ์˜ฎ๊ธฐ๊ธฐ ์ „ ์†Œ๊ทœ๋ชจ TPC-DS ๋ฐ์ดํ„ฐ์…‹(SF10)์œผ๋กœ ์—ฐ๊ฒฐ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • Part 2: NVIDIA Brev ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰: GPU ๊ฐ€์† ์Šคํƒ์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. NVIDIA L40S GPU๊ฐ€ ํƒ‘์žฌ๋œ Brev VM์„ ์‚ฌ์šฉํ•˜์—ฌ spark-rapids ๊ฐ€์†์˜ ๊ฐ•๋ ฅํ•œ ์„ฑ๋Šฅ์„ ์ง์ ‘ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Part 1: CPU ์ „์šฉ ์Šคํƒ์œผ๋กœ ๋กœ์ปฌ ํ™˜๊ฒฝ ๊ฒ€์ฆํ•˜๊ธฐ

Brev ํ™˜๊ฒฝ์˜ NVIDIA L40S๋กœ ํ™•์žฅํ•˜๊ธฐ์— ์•ž์„œ, ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ๊ตฌ์„ฑ์„ ๋จผ์ € ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ์ด โ€œCPU ์ „์šฉ(CPU-only)โ€ ๋‹จ๊ณ„์—์„œ๋Š” ํด๋ผ์šฐ๋“œ GPU ๋น„์šฉ์„ ๋“ค์ด์ง€ ์•Š๊ณ ๋„ EDB Postgres AI์™€ OSS Apache Spark ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ถฉ๋ถ„ํžˆ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ ์•„ํ‚คํ…์ฒ˜

์Šคํƒ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Postgres๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , Apache Spark ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๊ณ ์„ฑ๋Šฅ ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌํ•˜๋Š” โ€œ์Šคํ† ๋ฆฌ์ง€์™€ ์ปดํ“จํŒ…์˜ ๋ถ„๋ฆฌ(Separation of Storage and Compute)โ€ ๋ชจ๋ธ์„ ๊ตฌ์ถ•ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Postgres, PGAA ๋ฐ Spark ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๊ฒฝ๊ณ„

๊ทธ๋ฆผ 01 โ€“ Postgres, PGAA ๋ฐ Spark ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๊ฒฝ๊ณ„

๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•˜๋“  Brev ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•˜๋“  ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ ์•„ํ‚คํ…์ฒ˜๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

  • EDB Postgres (๊ฒŒ์ดํŠธ์›จ์ด): EDB Analytics Accelerator(AA) ํ™•์žฅ์ด ํฌํ•จ๋œ ์ „์šฉ Postgres 17 ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  SQL ์ฟผ๋ฆฌ์˜ ์ง„์ž…์ (Entry point) ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • OSS Apache Spark Master: ์ž‘์—… ๋ถ„์‚ฐ์„ ์กฐ์œจํ•˜๋Š” ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ(Control plane)์ž…๋‹ˆ๋‹ค. ํ‘œ์ค€ OSS Apache Spark 3.5.6์„ ์‚ฌ์šฉํ•˜์—ฌ PGAA๊ฐ€ ๊ด‘๋ฒ”์œ„ํ•œ ๋ฐ์ดํ„ฐ ์ƒํƒœ๊ณ„์™€ ์–ผ๋งˆ๋‚˜ ์›ํ™œํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜๋Š”์ง€ ์ฆ๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  • OSS Apache Spark Workers: ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์›Œ์ปค ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค.
  • Spark Connect (๋ธŒ๋ฆฟ์ง€): Postgres์™€ Spark ํด๋Ÿฌ์Šคํ„ฐ ์‚ฌ์ด์˜ ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์‹  Spark Connect ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ณ„ํš์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ํ• ๋‹น๋œ ๋ฆฌ์†Œ์Šค๋‚˜ GPU ๊ฐ€์† ์—ฌ๋ถ€์˜ ์ฐจ์ด๋Š” ์žˆ์ง€๋งŒ, EDB Postgres, Spark Master, Spark Worker, Spark Connect๋กœ ์ด์–ด์ง€๋Š” ๋…ผ๋ฆฌ์  ๊ตฌ์กฐ๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.


์‚ฌ์ „ ์ค€๋น„ ์‚ฌํ•ญ ๋ฐ ํ™˜๊ฒฝ ์ ๊ฒ€

์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋กœ์ปฌ ํ™˜๊ฒฝ์ด ๋‹ค์Œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ๋กœ์ปฌ GPU๊ฐ€ ์—†๋”๋ผ๋„ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. ๋…ธํŠธ๋ถ์—์„œ ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ๋ฐ ๊ฒ€์ฆ์„ ์ง„ํ–‰ํ•œ ํ›„, ์‹ค์ œ ๋Œ€๋Ÿ‰ ์—ฐ์‚ฐ ์‹œ์—๋งŒ Brev ์ธ์Šคํ„ด์Šค๋กœ ์ „ํ™˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • EDB Token: EDB Postgres Analytics Accelerator(PGAA) ํ™•์žฅ์„ ๋‚ด๋ ค๋ฐ›๊ธฐ ์œ„ํ•ด EDB_TOKEN์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. [EDB ๊ณ„์ • ๋“ฑ๋ก ํŽ˜์ด์ง€]์—์„œ ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์œผ์„ธ์š”.
  • Docker Desktop: ๋ฒ„์ „ 4.x ์ด์ƒ (Docker Compose V2 ํฌํ•จ).
  • ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค (๋กœ์ปฌ): CPU: 4์ฝ”์–ด ์ด์ƒ.
    • RAM: ์ตœ์†Œ 16GB (TPC-DS SF10 ์‹ค์Šต์„ ์œ„ํ•ด 32GB ๊ถŒ์žฅ).
    • ๋””์Šคํฌ: ์—ฌ์œ  ๊ณต๊ฐ„ 50GB ์ด์ƒ.
  • Git ํด๋ผ์ด์–ธํŠธ: ์ €์žฅ์†Œ ํด๋ก ์„ ์œ„ํ•œ Git ๋„๊ตฌ.
  • AWS CLI: TPC-DS SF10 ๋ฐ์ดํ„ฐ์…‹ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์œ„ํ•ด ๋กœ์ปฌ์— ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŠœํ† ๋ฆฌ์–ผ์„ ๋”ฐ๋ผ ํ•˜๋ ค๋ฉด ๋ชจ๋“  docker-compose ๋งค๋‹ˆํŽ˜์ŠคํŠธ์™€ PGAA ์„ค์ •์ด ํฌํ•จ๋œ ์‹ค์Šต์šฉ GitHub ์ €์žฅ์†Œ์— ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


CPU ์ „์šฉ ์Šคํƒ ์‹คํ–‰

๋กœ์ปฌ ํ™˜๊ฒฝ์˜ ํ•˜๋“œ์›จ์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณ ๋ คํ•˜์—ฌ, ์›ํ™œํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ์ž‘์€ ๋ฐ์ดํ„ฐ์…‹์ธ TPC-DS SF10์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ„ฐ๋ฏธ๋„์—์„œ ํด๋ก ํ•œ ์ €์žฅ์†Œ๋กœ ์ด๋™ํ•˜์—ฌ EDB_TOKEN์„ ์„ค์ •ํ•œ ๋’ค, ํ”„๋กœ์ ํŠธ ๋กœ์ปฌ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ฐ์ดํ„ฐ์…‹์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

Bash

# EDB ํ† ํฐ ๋‚ด๋ณด๋‚ด๊ธฐ
export EDB_TOKEN=<๋ฐœ๊ธ‰๋ฐ›์€_ํ† ํฐ_์ž…๋ ฅ>

# ์ €์žฅ์†Œ ํด๋ก  ๋ฐ ์ด๋™
git clone https://github.com/EnterpriseDB/spark-rapids-tutorial.git
cd spark-rapids-tutorial/cpu-only

# ๋ฐ์ดํ„ฐ์…‹ ๋‹ค์šด๋กœ๋“œ
aws s3 cp s3://beacon-analytics-demo-data-us-east-1-prod/tpcds_sf_10 ./data/tpcds_sf_10 --recursive --no-sign-request

์ด์ œ ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ์Šคํƒ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Bash

docker compose up -d --build

์ด ๋ช…๋ น์€ EDB Postgres ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋นŒ๋“œํ•˜๊ณ , Spark ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์™€ OSS Apache Spark 3.5.6 ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. CPU ์ „์šฉ ๋ฒ„์ „์€ nvidia ๋Ÿฐํƒ€์ž„๊ณผ spark-rapids jar ํŒŒ์ผ์„ ์ œ์™ธํ•˜๋ฉฐ, ํ‘œ์ค€ Spark CPU ์‹คํ–‰ ๋ฐฉ์‹์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฐ€๋™๋˜๋ฉด docker ps๋ฅผ ์‹คํ–‰ํ•˜์—ฌ postgres, spark-master, spark-worker-0, spark-connect ๋“ฑ 4๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ •์ƒ ์ž‘๋™ ์ค‘์ธ์ง€ ํ™•์ธํ•˜์„ธ์š”.


Postgres์—์„œ Spark ์ฟผ๋ฆฌ ์‹คํ–‰

์ด์ œ Postgres ์ปจํ…Œ์ด๋„ˆ๊ฐ€ Spark ํด๋Ÿฌ์Šคํ„ฐ์— ์ •์ƒ์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Postgres ์ปจํ…Œ์ด๋„ˆ์— ์ ‘์†ํ•˜์—ฌ psql ์…ธ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Bash

docker compose exec postgres psql -U postgres

๋จผ์ € EDB Postgres Analytics Accelerator(pgaa) ํ™•์žฅ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

SQL

CREATE EXTENSION IF NOT EXISTS pgaa CASCADE;

๊ทธ๋‹ค์Œ \dx ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด pgaa์™€ pgfs ํ™•์žฅ์ด ๋ชจ๋‘ ์„ค์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์‹คํ–‰ ์—”์ง„์„ ๊ธฐ๋ณธ๊ฐ’์ธ seafowl์—์„œ spark-connect๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์˜ GUC(Grand Unified Configuration) ์„ค์ •์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

SQL

SET pgaa.executor_engine = 'spark_connect';
SET pgaa.spark_connect_url = 'sc://spark-connect:15002';

pgaa.spark_connect_url ์„ค์ •์€ 15002 ํฌํŠธ์—์„œ ์‹คํ–‰ ์ค‘์ธ spark-connect ์ปจํ…Œ์ด๋„ˆ์˜ ์—ฐ๊ฒฐ URL์„ ์ง€์ •ํ•˜์—ฌ Postgres์™€ Spark ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ„์˜ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์ด ์ •์ƒ์ ์ธ์ง€ Spark ๋ฒ„์ „์„ ์ฟผ๋ฆฌํ•˜์—ฌ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

SQL

SELECT pgaa.spark_sql('SELECT version()');

Spark ๋ฒ„์ „์ด ์ •์ƒ์ ์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค๋ฉด ์„ฑ๊ณต์ž…๋‹ˆ๋‹ค. \q๋ฅผ ์ž…๋ ฅํ•ด ์…ธ์„ ๋น ์ ธ๋‚˜์˜ต๋‹ˆ๋‹ค.

๊ทธ๋‹ค์Œ, TPC-DS ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฑ„์šธ ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ์ €์žฅ์†Œ์— ํฌํ•จ๋œ create_tables_for_spark_sf10.sql ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DDL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Bash

cat create_tables_for_spark_sf10.sql | docker exec -i postgres psql -U postgres -d postgres

์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์Šคํ† ๋ฆฌ์ง€ ์œ„์น˜ ์ƒ์„ฑ: ๋‹ค์šด๋กœ๋“œํ•œ TPC-DS ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ์œ„์น˜๋ฅผ pgfs๋ฅผ ํ†ตํ•ด ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค. SELECT pgfs.create_storage_location('spark_sf10', 'file:///data/tpcds_data');
  2. ํ…Œ์ด๋ธ” ์ƒ์„ฑ: ๊ฐ ํ…Œ์ด๋ธ”์€ pgaa ์ง€์‹œ์–ด๋ฅผ ํ†ตํ•ด Parquet ํ˜•์‹์˜ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋„๋ก ์„ค์ •๋ฉ๋‹ˆ๋‹ค. CREATE TABLE customer_address () USING PGAA WITH (pgaa.storage_location = 'spark_sf10', pgaa.path = 'customer_address', pgaa.format = 'parquet');

๋งˆ์ง€๋ง‰์œผ๋กœ, psql ํ„ฐ๋ฏธ๋„์—์„œ ์ƒ˜ํ”Œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ โ€˜CPU ๊ธฐ์ค€ ์„ฑ๋Šฅ(CPU Baseline)โ€™์„ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ˆ˜์น˜๋Š” ๋‚˜์ค‘์— GPU ๊ฐ€์† ํ™˜๊ฒฝ์œผ๋กœ ์˜ฎ๊ฒผ์„ ๋•Œ ์„ฑ๋Šฅ ํ–ฅ์ƒ ํญ์„ ๋น„๊ตํ•˜๋Š” ์ค‘์š”ํ•œ ๊ธฐ์ค€์ ์ด ๋ฉ๋‹ˆ๋‹ค.

SQL

WITH customer_total_return AS (
   SELECT 
       sr_customer_sk AS ctr_customer_sk,
       sr_store_sk AS ctr_store_sk,
       SUM(sr_return_amt) AS ctr_total_return
   FROM store_returns, date_dim
   WHERE sr_returned_date_sk = d_date_sk 
     AND d_year = 2000
   GROUP BY sr_customer_sk, sr_store_sk
)
SELECT c_customer_id
FROM customer_total_return ctr1, store, customer
WHERE ctr1.ctr_total_return > (
   SELECT AVG(ctr_total_return) * 1.2
   FROM customer_total_return ctr2
   WHERE ctr1.ctr_store_sk = ctr2.ctr_store_sk
)
AND s_store_sk = ctr1.ctr_store_sk
AND s_state = 'TN'
AND ctr1.ctr_customer_sk = c_customer_sk
ORDER BY c_customer_id
LIMIT 100;

CPU ์ „์šฉ ๋กœ๊ทธ๋ฅผ ๋ณด๋ฉด Spark ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ‘œ์ค€ Java ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SF10 ๋ฐ์ดํ„ฐ์…‹์—์„œ๋„ ์ด ์ž‘์—…์€ ์–ด๋А ์ •๋„ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜์ค‘์— L40S GPU ํ™˜๊ฒฝ์—์„œ ๊ฒฝํ—˜ํ•˜๊ฒŒ ๋  โ€œ์ฆ‰๊ฐ์ ์ธโ€ ๊ฒฐ๊ณผ์™€ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋ฉ”๋ชจํ•ด ๋‘์„ธ์š”.

Postgres์™€ Spark๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ํ†ต์‹ ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค๋ฉด, ์ด์ œ spark-rapids์˜ ์ง„์ •ํ•œ ์œ„๋ ฅ์„ ์ฒดํ—˜ํ•˜๊ธฐ ์œ„ํ•ด Part 2: Brev ํ™˜๊ฒฝ ๋ฐฐํฌ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐˆ ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Part 2: NVIDIA Brev ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•˜๊ธฐ

๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ์œ„ํ•ด, ์šฐ๋ฆฌ๋Š” L40S GPU๊ฐ€ ํƒ‘์žฌ๋œ NVIDIA Brev VM์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. NVIDIA Brev๋Š” ์˜จ๋””๋งจ๋“œ GPU ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. ๊ฐ•๋ ฅํ•œ ๊ณ„์‚ฐ ์„ฑ๋Šฅ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๋Œ€์—ญํญ์ด ํ•„์ˆ˜์ ์ธ spark-rapids ์›Œํฌ๋กœ๋“œ๋ฅผ ์œ„ํ•ด, ๊ณ ์„ฑ๋Šฅ L40S GPU๋ฅผ ํ”„๋กœ๋น„์ €๋‹ํ•˜์—ฌ ์‹ค์Šต์„ ์ง„ํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


1. Brev ์ธ์Šคํ„ด์Šค ํ”„๋กœ๋น„์ €๋‹

๊ฐ€์žฅ ๋จผ์ €, L40S ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ํฌ๋ ˆ๋”ง์ด Brev ๊ณ„์ •์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ๋ณธ ๊ฐ€์ด๋“œ์—์„œ ๊ตฌ์ถ•ํ•˜๋Š” ์ธ์Šคํ„ด์Šค์˜ ๋น„์šฉ์€ ์‹œ๊ฐ„๋‹น ์•ฝ $2~$3์ž…๋‹ˆ๋‹ค.

Brev ์ฝ˜์†”์— ๋กœ๊ทธ์ธํ•œ ๋’ค, ์ƒ๋‹จ ๋ฉ”๋‰ด์—์„œ GPUs๋ฅผ ์„ ํƒํ•˜๊ณ  Create Environment๋ฅผ ํด๋ฆญํ•˜์—ฌ ์ƒˆ๋กœ์šด GPU ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

NVIDIA Brev๋ฅผ ํ†ตํ•œ ๋น ๋ฅธ GPU ํ™˜๊ฒฝ ํ”„๋กœ๋น„์ €๋‹

๊ทธ๋ฆผ 02 โ€“ NVIDIA Brev๋ฅผ ํ†ตํ•œ ๋น ๋ฅธ GPU ํ™˜๊ฒฝ ํ”„๋กœ๋น„์ €๋‹

๋ณธ ํŠœํ† ๋ฆฌ์–ผ์€ ์•„๋ž˜์™€ ๊ฐ™์€ ์‚ฌ์–‘์˜ Brev ์ธ์Šคํ„ด์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ธ์Šคํ„ด์Šค ๋ชจ๋“œ (Instance Mode): VM Mode
  • GPU: 2x NVIDIA L40S (๊ฐ 48GB VRAM)
  • ์ปดํ“จํŒ… (Compute): 16 vCPUs
  • ๋ฉ”๋ชจ๋ฆฌ (Memory): 294 GiB RAM
  • ์Šคํ† ๋ฆฌ์ง€ (Storage): 1.94TB ๋””์Šคํฌ (SF100 ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•ด NVMe ๊ถŒ์žฅ)

์ตœ์†Œ 1๊ฐœ ์ด์ƒ์˜ GPU๊ฐ€ ์žˆ๋Š” Brev ์ธ์Šคํ„ด์Šค๋ผ๋ฉด ์‹ค์Šต์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ๊ฐ€์ด๋“œ์™€ ๋‹ค๋ฅธ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ docker-compose.yml ํŒŒ์ผ์—์„œ GPU ๊ฐœ์ˆ˜ ์„ค์ •์„ ํ•ด๋‹น ์‚ฌ์–‘์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์œ ์˜ํ•˜์„ธ์š”.

VM ์ธ์Šคํ„ด์Šค ํ”„๋กœ๋น„์ €๋‹์—๋Š” ์•ฝ 2~3๋ถ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. ๋Œ€๊ธฐํ•˜๋Š” ๋™์•ˆ ๋กœ์ปฌ ๋จธ์‹ ์— Brev CLI๋ฅผ ์„ค์น˜ํ•˜๊ณ , ์ฝ˜์†”์˜ Using Brev CLI (SSH) ์ง€์นจ์— ๋”ฐ๋ผ ์„ค์ •์„ ์™„๋ฃŒํ•˜์„ธ์š”. ๋ณธ ๊ฐ€์ด๋“œ์˜ ๋ชจ๋“  ์ƒํ˜ธ์ž‘์šฉ์€ ์ฃผ๋กœ ์ด CLI๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

๋กœ์ปฌ ํ™˜๊ฒฝ์— Brev CLI ๋„๊ตฌ ์„ค์น˜

๊ทธ๋ฆผ 03 โ€“ ๋กœ์ปฌ ํ™˜๊ฒฝ์— Brev CLI ๋„๊ตฌ ์„ค์น˜

2. ํ•„์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ๋ฐ ๋””๋ ‰ํ† ๋ฆฌ ๊ถŒํ•œ ์„ค์ •

ํ”„๋กœ๋น„์ €๋‹์ด ์™„๋ฃŒ๋˜๋ฉด CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์ธ์Šคํ„ด์Šค ์ด๋ฆ„์„ tutorial์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Bash

brev shell tutorial

์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ƒ์„ฑํ•œ VM ์ธ์Šคํ„ด์Šค์— SSH ์—ฐ๊ฒฐ์ด ํ™œ์„ฑํ™”๋˜์–ด, ์›๊ฒฉ ๋จธ์‹ ์—์„œ ์ง์ ‘ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ, nvtop๊ณผ AWS CLI๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

Bash

sudo apt install awscli nvtop
  • nvtop: GPU ์‚ฌ์šฉ๋ฅ , ๋ฉ”๋ชจ๋ฆฌ ์ ์œ ๋„, ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์‹œ๊ฐํ™”ํ•ด ์ฃผ๋Š” ๊ฐ€๋ฒผ์šด ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋ฒค์น˜๋งˆํฌ ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ GPU ์„ฑ๋Šฅ์„ ๊ด€์ฐฐํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • AWS CLI (awscli): ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ๋ฒค์น˜๋งˆํฌ ๋ฐ์ดํ„ฐ์…‹์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ํ›„, Spark๊ฐ€ ์‚ฌ์šฉํ•  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

Bash

sudo mkdir /data
sudo mkdir /data/spark-app
sudo chmod 777 -R /data/spark-app

๋งˆ์ง€๋ง‰์œผ๋กœ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— EDB_TOKEN์„ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

Bash

export EDB_TOKEN=<๋ฐœ๊ธ‰๋ฐ›์€_ํ† ํฐ_์ž…๋ ฅ>

3. ์ฝ”๋“œ ๋ฐ ๋ฒค์น˜๋งˆํฌ ๋ฐ์ดํ„ฐ์…‹ ๋‹ค์šด๋กœ๋“œ

VM์˜ ํ™ˆ ํด๋”(/home/ubuntu)์— ์‹ค์Šต์šฉ GitHub ์ €์žฅ์†Œ๋ฅผ ํด๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ €์žฅ์†Œ์ด์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” spark-rapids๊ฐ€ ํ™œ์„ฑํ™”๋œ GPU ๊ธฐ๋ฐ˜ Spark ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Bash

cd /home/ubuntu
git clone https://github.com/dunithd/spark-rapids-tutorial.git
cd spark-rapids-tutorial/gpu-2xl40s

์ด์ œ Parquet ํ˜•์‹์˜ TPC-DS ๋ฐ์ดํ„ฐ์…‹์„ ๋‹ค์šด๋กœ๋“œํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. spark-rapids์˜ ์ง„์ •ํ•œ ์œ„๋ ฅ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด, ์••์ถ• ํ›„์—๋„ ์ˆ˜ ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ์— ๋‹ฌํ•˜๋Š” SF100(Scale Factor 100) ๋ฐ์ดํ„ฐ์…‹์„ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ์…‹์„ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด ์ธ์Šคํ„ด์Šค์˜ /ephemeral ๋ณผ๋ฅจ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. (df -h ๋ช…๋ น์–ด๋กœ ํ™•์ธํ•ด ๋ณด๋ฉด ์•ฝ 1TB์˜ ์—ฌ์œ  ๊ณต๊ฐ„์ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์…‹์„ ๋‹ค์šด๋กœ๋“œํ•˜์„ธ์š”.

Bash

aws s3 cp s3://beacon-analytics-demo-data-us-east-1-prod/tpcds_sf_100 /ephemeral/tpcds_sf_100 --recursive --no-sign-request

ํ•„์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์ •๊ณผ ๋ฐ์ดํ„ฐ์…‹ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ Docker Compose ์Šคํƒ์„ ์‹คํ–‰ํ•˜๊ณ  ๋ณธ๊ฒฉ์ ์ธ GPU ๊ฐ€์† ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ค€๋น„๊ฐ€ ๋ชจ๋‘ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

spark-rapids ํ†ตํ•ฉ ์•„ํ‚คํ…์ฒ˜ ์ƒ์„ธ ๋ถ„์„

GPU ๊ฐ€์† ์Šคํƒ์„ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๊ฐ€๋™ํ•˜๊ธฐ ์ „์—, ๊ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ ์œผ๋กœ๋Š” ์•ž์„œ ์‚ดํŽด๋ณธ CPU ์Šคํƒ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•˜์ง€๋งŒ, spark-rapids ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  ๊ทธ์— ๋”ฐ๋ฅธ ๋ฆฌ์†Œ์Šค ํ• ๋‹น ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์ง„ ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

Brev ํ™˜๊ฒฝ์˜ Docker Compose ์Šคํƒ ๊ตฌ์„ฑ. Spark Connect์— spark-rapids jar๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  Spark ์›Œ์ปค๊ฐ€ GPU์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๊ทธ๋ฆผ 04 โ€“ Brev ํ™˜๊ฒฝ์˜ Docker Compose ์Šคํƒ ๊ตฌ์„ฑ. Spark Connect์— spark-rapids jar๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  Spark ์›Œ์ปค๊ฐ€ GPU์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GPU ๊ฐ€์† ์Šคํƒ์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ

./gpu-2xl40s/docker-compose.yml ํŒŒ์ผ์€ ํฌ๊ฒŒ ๋„ค ๊ฐ€์ง€ ๋…ผ๋ฆฌ์  ๋‹จ์œ„๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

  • EDB Postgres (๊ฒŒ์ดํŠธ์›จ์ด): EDB Analytics Accelerator(AA) ํ™•์žฅ์ด ํƒ‘์žฌ๋œ ์ „์šฉ Postgres 17 ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค. SQL ์ฟผ๋ฆฌ๋ฅผ ๋ฐ›์•„๋“ค์ด๋Š” ์ง„์ž…์ ์ž…๋‹ˆ๋‹ค.
  • OSS Apache Spark Master: ํƒœ์Šคํฌ ๋ถ„์‚ฐ์„ ์กฐ์œจํ•˜๋Š” ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์ž…๋‹ˆ๋‹ค.
  • OSS Apache Spark Workers: nvidia ๋Ÿฐํƒ€์ž„์œผ๋กœ ์„ค์ •๋˜์–ด L40S ํ•˜๋“œ์›จ์–ด์— ์ง์ ‘ ์ ‘๊ทผํ•˜์—ฌ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • Spark Connect (๋ธŒ๋ฆฟ์ง€): Postgres์™€ Spark ํด๋Ÿฌ์Šคํ„ฐ ์‚ฌ์ด์˜ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

์‹ค์ œ โ€œ๋งˆ๋ฒ•โ€์ด ์ผ์–ด๋‚˜๋Š” ๋ถ€๋ถ„์€ compose ํŒŒ์ผ ๋‚ด์˜ spark-connect ์„ค์ • ์„น์…˜์ž…๋‹ˆ๋‹ค.

YAML

spark-connect:
   <<: *spark-common
   container_name: spark-connect
   depends_on: ["spark-master"]
   ports: ["4040:4040", "15002:15002"]
   command: >
     /opt/spark/sbin/start-connect-server.sh --master spark://spark-master:7077
     --packages "org.apache.spark:spark-connect_2.12:3.5.6,com.nvidia:rapids-4-spark_2.12:25.10.0,io.delta:delta-spark_2.12:3.3.1,org.apache.hadoop:hadoop-aws:3.3.4"
     --conf "spark.executor.extraClassPath=/data/spark-app/jars/com.nvidia_rapids-4-spark_2.12-25.10.0.jar"
     --conf "spark.plugins=com.nvidia.spark.SQLPlugin"
     --conf "spark.rapids.memory.pinnedPool.size=8g"
     --conf "spark.rapids.sql.concurrentGpuTasks=3"
     --conf "spark.shuffle.manager=com.nvidia.spark.rapids.spark356.RapidsShuffleManager"
     # ... (๊ธฐํƒ€ ์„ธ๋ถ€ ์„ค์ • ์ƒ๋žต)

์šฐ๋ฆฌ๋Š” ๋‹จ์ˆœํžˆ Spark๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๊ณ„์ธต์„ ํ†ตํ•ด Spark ์—”์ง„์— NVIDIA spark-rapids ๊ฐ€์†๊ธฐ๋ฅผ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.

1. Spark RAPIDS ํ”Œ๋Ÿฌ๊ทธ์ธ ์ฃผ์ž…

spark.plugins=com.nvidia.spark.SQLPlugin ์„ค์ •์„ ํ†ตํ•ด Spark๊ฐ€ ํ‘œ์ค€ CPU ์ฟผ๋ฆฌ ๊ณ„ํš์„ ๊ฐ€๋กœ์ฑ„๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. Join์ด๋‚˜ Aggregate์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์ด spark-rapids์—์„œ ์ง€์›๋˜๋Š” ๊ฒฝ์šฐ, Spark๋Š” CPU ๋ฒ„์ „ ๋Œ€์‹  ๊ณ ๋„๋กœ ๋ณ‘๋ ฌํ™”๋œ GPU ์ปค๋„๋กœ ์—ฐ์‚ฐ์„ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

2. ์ง€๋Šฅํ˜• GPU ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

TPC-DS SF100๊ณผ ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹์€ GPU ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ ์œ ํ•ฉ๋‹ˆ๋‹ค. ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด ๋‹ค์Œ ์„ค์ •์„ ํŠœ๋‹ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • spark.rapids.memory.pinnedPool.size=8g: ์‹œ์Šคํ…œ RAM๊ณผ GPU VRAM ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „์†ก ์†๋„๋ฅผ ๋น„์•ฝ์ ์œผ๋กœ ๋†’์—ฌ์ฃผ๋Š” โ€œPinnedโ€ ํ˜ธ์ŠคํŠธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.
  • spark.rapids.sql.concurrentGpuTasks=3: ์—ฌ๋Ÿฌ ํƒœ์Šคํฌ๊ฐ€ ํ•˜๋‚˜์˜ GPU๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ L40S์˜ ๋ฐฉ๋Œ€ํ•œ ์ฝ”์–ด ํ™œ์šฉ๋ฅ ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค.

3. GPU ๊ฐ€์† ์…”ํ”Œ

Spark์—์„œ ์›Œ์ปค ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋™์‹œํ‚ค๋Š” โ€˜์…”ํ”Œ(Shuffling)โ€™์€ ๊ฐ€์žฅ ํฐ ๋ณ‘๋ชฉ ๊ตฌ๊ฐ„์ž…๋‹ˆ๋‹ค. RapidsShuffleManager๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด GPU๋ฅผ ํ™œ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์••์ถ•ํ•˜๊ณ  ์ด๋™์‹œํ‚ค๋ฏ€๋กœ I/O ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


GPU ๊ฐ€์† ์Šคํƒ ์‹คํ–‰ ๋ฐ ํ™•์ธ

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Bash

docker compose up -d --build

์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— Spark๊ฐ€ L40S ํ•˜๋“œ์›จ์–ด๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์ธ์‹ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ํ˜ธ์ŠคํŠธ์—์„œ nvidia-smi๋ฅผ ์‹คํ–‰ํ•˜์—ฌ 48GB VRAM์„ ๊ฐ€์ง„ L40S GPU 2๊ฐœ๊ฐ€ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

NVIDIA L40S GPU ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” nvidia-smi ํ™”๋ฉด

๊ทธ๋‹ค์Œ, ์›Œ์ปค ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ๋„ GPU๊ฐ€ ๋ณด์ด๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Bash

docker exec -it spark-worker-0 nvidia-smi

์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ๋„ ๋™์ผํ•œ GPU ์ƒํƒœ ํ…Œ์ด๋ธ”์ด ๋‚˜ํƒ€๋‚˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ spark-connect ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ๊ฐ€์†๊ธฐ๊ฐ€ ํ™œ์„ฑํ™”๋˜์—ˆ๋Š”์ง€ ์ตœ์ข… ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Bash

docker compose logs spark-connect | grep -i "RAPIDS Accelerator"
# ์ถœ๋ ฅ ๊ฒฐ๊ณผ์— "RAPIDS Accelerator 25.10.0: enabled"๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋กœ์ปฌ ํ„ฐ๋ฏธ๋„์—์„œ ํฌํŠธ ํฌ์›Œ๋”ฉ์„ ์„ค์ •ํ•˜์—ฌ 4040 ํฌํŠธ๋กœ Spark UI์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

Bash

brev port-forward tutorial -p 8080:8080 -p 4040:4040

์ด์ œ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:4040์œผ๋กœ ์ ‘์†ํ•˜์—ฌ Spark UI๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


GPU ๊ฐ€์† ์ฟผ๋ฆฌ ์‹คํ–‰

์ด์ œ ๋ชจ๋“  ์ค€๋น„๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. TPC-DS SF100์šฉ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

Bash

cat create_tables_for_spark_sf100.sql | docker exec -i postgres psql -U postgres -d postgres

์ด์ œ ์‹ค์ œ ์ฟผ๋ฆฌ๋ฅผ ๋˜์ ธ๋ณผ ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํ„ฐ๋ฏธ๋„ ์„ธ์…˜์—์„œ nvtop์„ ์‹คํ–‰ํ•˜์—ฌ GPU ์‚ฌ์šฉ๋Ÿ‰์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ฉด์„œ, ๊ธฐ์กด ํ„ฐ๋ฏธ๋„์˜ psql์—์„œ ์•„๋ž˜์˜ ๋ณต์žกํ•œ TPC-DS ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ด ๋ณด์„ธ์š”.

SQL

WITH customer_total_return AS (
   SELECT 
       sr_customer_sk AS ctr_customer_sk,
       sr_store_sk AS ctr_store_sk,
       SUM(sr_return_amt) AS ctr_total_return
   FROM store_returns, date_dim
   WHERE sr_returned_date_sk = d_date_sk 
     AND d_year = 2000
   GROUP BY sr_customer_sk, sr_store_sk
)
SELECT c_customer_id
FROM customer_total_return ctr1, store, customer
WHERE ctr1.ctr_total_return > (
   SELECT AVG(ctr_total_return) * 1.2
   FROM customer_total_return ctr2
   WHERE ctr1.ctr_store_sk = ctr2.ctr_store_sk
)
AND s_store_sk = ctr1.ctr_store_sk
AND s_state = 'TN'
AND ctr1.ctr_customer_sk = c_customer_sk
ORDER BY c_customer_id
LIMIT 100;

์ด ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ GPU ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณต์žกํ•œ ์กฐ์ธ(Complex Joins): 4๊ฐœ ์ด์ƒ์˜ ๋Œ€ํ˜• ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณตํ†ต ํ…Œ์ด๋ธ” ํ‘œํ˜„์‹(CTE): Spark๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์—์„œ ์ตœ์ ํ™”ํ•ด์•ผ ํ•˜๋Š” ์ž„์‹œ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ธŒ์ฟผ๋ฆฌ: AVG(...) * 1.2 ๊ณ„์‚ฐ์„ ์œ„ํ•œ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋˜๋Š” ์…”ํ”Œ ์กฐ์ธ์ด ๋ฐœ์ƒํ•˜๋ฉฐ, ์—ฌ๊ธฐ์„œ RAPIDS Shuffle Manager์˜ ์„ฑ๋Šฅ์ด ๋น›์„ ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ nvtop์„ ๋ณด๋ฉด ๋‘ ๊ฐœ์˜ GPU ์‚ฌ์šฉ๋Ÿ‰์ด ์น˜์†Ÿ๋Š” ๊ฒƒ์„ ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ์‹คํ–‰ ์ค‘ GPU ์‚ฌ์šฉ๋ฅ ์˜ ๋ณ€ํ™”๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” nvtop ํ™”๋ฉด

๊ทธ๋ฆผ 06 โ€“ ์ฟผ๋ฆฌ ์‹คํ–‰ ์ค‘ GPU ์‚ฌ์šฉ๋ฅ ์˜ ๋ณ€ํ™”๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” nvtop ํ™”๋ฉด

๋˜ํ•œ Spark UI(http://localhost:4040)์˜ SQL ํƒญ์—์„œ ์‹คํ–‰ ์ค‘์ธ ์ฟผ๋ฆฌ๋ฅผ ํด๋ฆญํ•ด ๋ณด์„ธ์š”.

  • โ€œGpuโ€ ๋…ธ๋“œ ํ™•์ธ: ์‹คํ–‰ ๊ณ„ํš(Physical Plan)์—์„œ ๊ธฐ์กด ๋…ธ๋“œ๋“ค์ด GpuHashJoin, GpuHashAggregate, GpuColumnarExchange ๋“ฑ GPU ๋ฒ„์ „์œผ๋กœ ๊ต์ฒด๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ „ํ™˜ ๋…ธ๋“œ: ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ์˜ GpuRowToColumnar์™€ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋  ๋•Œ์˜ GpuColumnarToRow ๋…ธ๋“œ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Spark UI์—์„œ ํ™•์ธํ•œ GPU ๊ฐ€์† ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ณ„ํš


EDB Postgres AI์™€ Apache Spark GPU ๊ฐ€์† ์‹ค์Šต ์š”์•ฝ

์ด ํŠœํ† ๋ฆฌ์–ผ์„ ํ†ตํ•ด CPU ์ „์šฉ ๊ธฐ์ค€์ (Baseline) ์ˆ˜๋ฆฝ๋ถ€ํ„ฐ NVIDIA Brev VM ์ƒ์—์„œ์˜ ์™„๋ฒฝํ•œ GPU ๊ฐ€์† EDB Postgres AI ๋ฐ Apache Spark ํด๋Ÿฌ์Šคํ„ฐ ๋ฐฐํฌ๊นŒ์ง€ ์ „ ๊ณผ์ •์„ ๋งˆ์ณค์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” EDB Analytics Accelerator์™€ Spark์˜ ์›ํ™œํ•œ ํ†ตํ•ฉ์„ ํ™•์ธํ–ˆ์œผ๋ฉฐ, ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ๊ณ„ํš์ด GPU ์ปค๋„๋กœ ์˜คํ”„๋กœ๋“œ๋˜๋Š” ๊ณผ์ •์„ ๊ฒ€์ฆํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ TPC-DS SF100๊ณผ ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹์—์„œ RAPIDS Shuffle Manager์™€ L40S GPU๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์••๋„์ ์ธ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๋ชฉ๊ฒฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ์‹ค๋ฌด ๊ฒฝํ—˜์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์šด์˜ ํ™˜๊ฒฝ์— GPU ๊ฐ€์† ๋ถ„์„์„ ๋„์ž…ํ•˜๋Š” ๋ฐ ๊ฐ•๋ ฅํ•œ ํ† ๋Œ€๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ์ž์„ธํ•œ ์„ค์ • ์˜ต์…˜๊ณผ ๊ณ ๊ธ‰ ํŠœ๋‹ ๊ฐ€์ด๋“œ๋Š” EDB ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.


EDB Postgres์™€ Spark GPU ๊ฐ€์† FAQ

๋กœ์ปฌ GPU๊ฐ€ ์—†์–ด๋„ ์ด ํŠœํ† ๋ฆฌ์–ผ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

๋„ค. Part 1์€ CPU ์ „์šฉ Docker Compose ์Šคํƒ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ๋กœ์ปฌ GPU ์—†์ด๋„ EDB Postgres AI์™€ Apache Spark ๊ฐ„ ์—ฐ๊ฒฐ์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GPU ๊ฐ€์† ํ™•์ธ์€ Part 2์˜ NVIDIA Brev ํ™˜๊ฒฝ์—์„œ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

EDB Postgres์™€ Apache Spark๋Š” ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋‚˜์š”?

EDB Postgres๋Š” SQL ์ฟผ๋ฆฌ์˜ ์ง„์ž…์  ์—ญํ• ์„ ํ•˜๊ณ , Spark Connect๊ฐ€ Postgres์™€ Spark ํด๋Ÿฌ์Šคํ„ฐ ์‚ฌ์ด์—์„œ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ณ„ํš์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ์—”์ง„์€ pgaa.executor_engine ์„ค์ •์„ spark_connect๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

CPU์™€ GPU ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋Š” TPC-DS ๋ฐ์ดํ„ฐ์…‹์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

๋กœ์ปฌ CPU ๊ฒ€์ฆ์—๋Š” ๋น„๊ต์  ์ž‘์€ TPC-DS SF10 ๋ฐ์ดํ„ฐ์…‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. NVIDIA Brev์˜ GPU ๊ฐ€์† ์‹ค์Šต์—์„œ๋Š” Parquet ํ˜•์‹์˜ TPC-DS SF100 ๋ฐ์ดํ„ฐ์…‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Spark RAPIDS ๊ฐ€์†์ด ํ™œ์„ฑํ™”๋˜์—ˆ๋Š”์ง€ ์–ด๋–ป๊ฒŒ ํ™•์ธํ•˜๋‚˜์š”?

ํ˜ธ์ŠคํŠธ์™€ Spark ์›Œ์ปค ์ปจํ…Œ์ด๋„ˆ์—์„œ nvidia-smi๋ฅผ ์‹คํ–‰ํ•ด GPU ์ธ์‹ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. spark-connect ๋กœ๊ทธ์˜ โ€˜RAPIDS Accelerator 25.10.0: enabledโ€™ ๋ฉ”์‹œ์ง€์™€ Spark UI์˜ GpuHashJoin, GpuHashAggregate ๋“ฑ์˜ ์‹คํ–‰ ๊ณ„ํš ๋…ธ๋“œ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์‹ค์Šต์— ์‚ฌ์šฉ๋œ NVIDIA Brev ์ธ์Šคํ„ด์Šค ์‚ฌ์–‘์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

๊ฐ€์ด๋“œ๋Š” 48GB VRAM์„ ๊ฐ–์ถ˜ NVIDIA L40S GPU 2๊ฐœ, 16 vCPU, 294GiB RAM, 1.94TB ๋””์Šคํฌ๋กœ ๊ตฌ์„ฑ๋œ VM Mode ์ธ์Šคํ„ด์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. GPU๊ฐ€ 1๊ฐœ ์ด์ƒ์ธ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ docker-compose.yml์˜ GPU ๊ฐœ์ˆ˜ ์„ค์ •์„ ์‚ฌ์–‘์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์ผ: salesinquiry@enterprisedb.com

Share this