BlazingSQL: GPU‑SQL и ANSI‑совместимость

Задача страницы. Инженерный гид по BlazingSQL — движку SQL поверх RAPIDS для выполнения ANSI‑совместимых запросов на GPU. Разбираем паттерны: интерактивная аналитика и ETL на Parquet/ORC, интеграция с cuDF/Dask‑CUDA, кэш‑планирование (HBM ↔ pinned‑host ↔ NVMe), профили производительности на 24/48/80 ГБ, конфиги, наблюдаемость (p50/p95), экономика и траблшутинг. Страница стыкуется с: https://cloudcompute.ru/solutions/rapids/, https://cloudcompute.ru/solutions/spark-rapids/, https://cloudcompute.ru/solutions/storage-data/.

TL;DR

  • Когда выбирать BlazingSQL. Нужен GPU‑SQL без Spark: быстрые селекты/джойны/агрегаты на Parquet/ORC, интерактив в ноутбуке и лёгкие пайплайны ETL на RAPIDS.

  • Поддержка ANSI. Подмножество ANSI SQL: SELECT/FROM/WHERE, JOIN (INNER/LEFT), GROUP BY/AGG, ORDER BY/LIMIT, UNION ALL, частично оконные функции и CTE; UDF — через последующую стадию в cuDF.

  • **Режимы:

  • Single‑GPU (интерактив/прототип): cuDF + BlazingSQL, RMM‑пул 70–80% HBM.

  • Multi‑GPU (батчи/большие таблицы): BlazingSQL + Dask‑CUDA (UCX, NVMe‑spill).

  • Кэш‑планирование: горячие справочники/«малые таблицы» — в HBM; «тёплые» фрагменты фактов — в pinned‑host; «холодные» — на NVMe; метаданные Parquet (row group/статистика) — локально.

  • Наблюдаемость: sql_query_seconds (p50/p95), gpu_utilization, rmm_current_bytes, spill_bytes, read_gib_s/write_gib_s. Дашборды: https://cloudcompute.ru/solutions/monitoring-logging/, методология — https://cloudcompute.ru/solutions/llm-inference/observability/

  • Экономика: T_query ≈ S_scan / (N_gpu × BW_eff), Cost ≈ c_gpu × T. Для ETL: 0.5–5 GiB/s/узел (по профилям ниже, зависит от схемы/IO/шардинга). См. https://cloudcompute.ru/solutions/cost-planner/ и https://cloudcompute.ru/solutions/throughput-vs-latency/

Сценарии (когда это нужно)

  • Интерактивная BI/ад‑hoc SQL на файлах Parquet/ORC на NVMe/объектном хранилище без подъёма Spark‑кластера.
  • GPU‑ETL для рексиса/ML: категоризация/фильтрация/джойны/агрегации; материализованные фичи в Parquet для downstream (см. https://cloudcompute.ru/solutions/recsys/).
  • Предобработка логов/манифестов для аудио/видео пайплайнов (ASR/диаризация/музыка), см. навигацию «Речь и аудио».
  • Прототипирование SQL‑логики с последующей интеграцией cuDF/cuML и сервингом через Triton (см. https://cloudcompute.ru/solutions/triton-inference-server/).

Архитектуры и пайплайны 1) Single‑GPU: ноутбук/сервис (интерактив)

NVMe / Object Storage
 └─ Parquet/ORC
 └─ BlazingSQL (GPU SQL)
 ├─ SELECT / WHERE / JOIN / GROUP BY
 └─ → cuDF (post-processing / UDF)
 └─ Write Parquet / Arrow → downstream

Особенности: RMM‑пул 70–80% HBM, избегать лишних host↔device копий; кэшировать справочники в HBM.

2) Multi‑GPU: Dask‑CUDA (батчи/широкие таблицы)

Object/NVMe ─> Dask‑cuDF IO (UCX) ─> BlazingSQL (распределённые операторы)
 └─ Repartition/Shuffle (UCX, NVMe spill)
 └─ CTAS/Write Parquet (partitioned)

Особенности: UCX‑транспорт, NVLink/IB, локальный NVMe‑spill; партиционирование по ключам/датам.

3) Гибрид SQL→ML

BlazingSQL (ETL) ──> Parquet Features ──> cuDF/cuML (обучение/инференс) ──> Triton Serving

Профили GPU и ориентиры пропускной способности

Инженерные ориентиры пропускной способности для типового запроса «scan→filter→join→groupby» на Parquet (NVMe), при U≈0.7. Реальные значения зависят от ширины строк, кардинальностей и IO.

**Профиль GPU** **Память** **Типовой стек** **Эффективная скорость SQL/ETL\*** **Комментарии**
24 ГБ (Compact) 24 ГБ BlazingSQL + cuDF **0.5–1.5 GiB/s** Интерактив, средние джойны.
48 ГБ (Balanced) 48 ГБ BlazingSQL + Dask‑CUDA (2–4 GPU) **1–3 GiB/s** Батчи, оконные/широкие аггрегаты.
80 ГБ (HQ) 80 ГБ BlazingSQL + Dask‑CUDA (4–8 GPU) **2–5 GiB/s** Тяжёлые джойны/окна, крупные партиции.

* На узел/группу узлов; масштабируйте до потолка NVMe/сети. Тюнинг: https://cloudcompute.ru/solutions/performance-tuning/, распределёнка — https://cloudcompute.ru/solutions/multi-gpu/

Конфиги и скелеты кода

Docker Compose (ноутбук с BlazingSQL + Dask)

version: "3.9"
x-env: &env
 RMM_POOL_SIZE: "70%"
 UCX_TLS: "tcp,cuda_copy,cuda_ipc"
 UCX_SOCKADDR_TLS_PRIORITY: "tcp"
 CUDA_VISIBLE_DEVICES: "0,1" # укажите ваши GPU
 WORKER_SPILL_DIR: "/nvme/spill"
services:
 rapids-notebook:
 image: cloudcompute/rapids-notebook:latest
 environment: *env
 deploy:
 resources:
 reservations:
 devices: [{ capabilities: ["gpu"] }]
 ports: ["8888:8888"]
 volumes:
 - /nvme/datasets:/data
 - /nvme/spill:/nvme/spill
 command: ["jupyter","lab","--ip=0.0.0.0","--allow-root"]
 dask-scheduler:
 image: cloudcompute/dask-cuda:latest
 environment: *env
 ports: ["8786:8786","8787:8787"]
 command: ["dask-scheduler"]
 dask-worker:
 image: cloudcompute/dask-cuda:latest
 depends_on: [dask-scheduler]
 environment: *env
 deploy:
 resources:
 reservations:
 devices: [{ capabilities: ["gpu"] }]
 volumes:
 - /nvme/spill:/nvme/spill
 command:
 ["dask-cuda-worker","dask-scheduler:8786",
 "--rmm-pool-size","${RMM_POOL_SIZE}",
 "--local-directory","/nvme/spill",
 "--enable-tcp-over-ucx","--enable-cuda-ipc"]

Python: BlazingSQL single‑/multi‑GPU

# Single-GPU или интеграция с Dask (при наличии scheduler/worker из Compose)
from blazingsql import BlazingContext
import cudf
try:
 from dask_cuda import LocalCUDACluster
 from dask.distributed import Client
 cluster = LocalCUDACluster(protocol="ucx", rmm_pool_size="70%")
 client = Client(cluster)
 bc = BlazingContext(dask_client=client)
except Exception:
 bc = BlazingContext()
# Регистрируем таблицы (Hive-партиции поддерживаются по префиксу папок)
bc.create_table("events", "/data/events/*.parquet")
bc.create_table("catalog", "/data/catalog/*.parquet")
# ANSI-подмножество: SELECT/JOIN/GROUP BY/ORDER BY/LIMIT
sql = """
SELECT e.user_id,
 DATE_TRUNC('week', e.ts) AS week,
 c.category,
 SUM(e.price) AS spend_sum,
 COUNT(*) AS views
FROM events e
LEFT JOIN catalog c USING (item_id)
WHERE e.ts >= TIMESTAMP '2025-01-01 00:00:00'
GROUP BY e.user_id, week, c.category
ORDER BY week, spend_sum DESC
"""
df = bc.sql(sql) # cuDF (single) или dask_cudf (multi)
# Сохранение результата
try:
 # dask_cudf
 df.to_parquet("/data/features/dt=2025-08-28/")
except AttributeError:
 # cuDF
 df.to_parquet("/data/features/dt=2025-08-28/", index=False)
# Пост-обработка в cuDF (пример UDF-стадии вне SQL)
import cupy as cp
gdf = df.to_pandas() if hasattr(df, "compute") else df
# при multi-GPU сначала df = df.compute()

CTAS (материализация представления)

res = bc.sql("""
SELECT user_id, category, SUM(price) AS spend_sum
FROM events e LEFT JOIN catalog c USING(item_id)
GROUP BY user_id, category
""")
# Материализуем «вью» для downstream пайплайнов (партиционирование по category)
try:
 res.to_parquet("/data/mv/user_cat/", partition_on=["category"])
except TypeError:
 # cuDF без partition_on — разложим вручную
 for cat in res["category"].unique().to_pandas():
 sub = res[res["category"] == cat]
 sub.to_parquet(f"/data/mv/user_cat/category={cat}/", index=False)
``` ## **Кэш‑планирование (HBM ↔ Host ↔ NVMe)**

**Цели:** минимизировать повторные чтения «горячих» данных и шифлы, удерживать стабильный p95.

**Слои:**

1. **HBM (GPU):
 
 - Кэш «малых» таблиц (справочники: бренды/категории/гео).
 - Материализованные представления (узкие агрегаты).
 - Порог: ≤ 20–30% HBM на кэш (остальное — операторный пул).
2. **Pinned Host:
 
 - Буфер чтения row groups, промежуточные батчи.
 - Ускоряет host↔device.
3. **NVMe (локальный):
 
 - Spill при шифлах/перегрузке, кэш метаданных Parquet (footers/статистика), «тёплые» CTAS.
4. **Object Storage (холодный слой):
 
 - Источники/архив.

**Практика:**

- «Горячие» таблицы — загрузить единожды и держать ссылку в процессе (например, DIM = bc.sql("SELECT ...")).
- План вычислений дробить на **CTAS**‑шаги с явной материализацией на NVMe.
- Партиционирование (например, по dt/region) — уменьшает объём сканов.

## **Наблюдаемость/метрики/алерты**

**Метрики (Prometheus‑стиль):**

- **Latency/Perf:** sql\_query\_seconds{op=scan|join|agg|sort} (p50/p95), read\_gib\_s, write\_gib\_s.
- **GPU:** gpu\_utilization, gpu\_memory\_bytes, gpu\_mem\_peak\_bytes, rmm\_current\_bytes, rmm\_peak\_bytes.
- **Spill/IO:** spill\_bytes{to=host|disk}, nvme\_{read,write}\_mb\_s.
- **Dask (multi‑GPU):** dask\_task\_duration\_seconds{type=shuffle|map|reduce}, scheduler\_queue\_len.

**Алерты:**

- sql\_query\_seconds\_p95 > SLA — пересмотреть партиционирование/индексы каталогов, сократить ширину строк/колонки.
- gpu\_mem\_peak/HBM > 0.9 — уменьшить batch/конкурентность, повысить долю NVMe‑spill, расширить HBM‑профиль.
- spill\_bytes{to=disk}\_p95 ↑ — оптимизировать join (pre‑agg, broadcast малых таблиц), переразбить партиции.
- dask\_task\_duration\_p95{shuffle} ↑ — включить UCX/NVLink, вынести тяжёлые стадии в Interruptible.

См. подробнее: <https://cloudcompute.ru/solutions/monitoring-logging/>, <https://cloudcompute.ru/solutions/llm-inference/observability/>

## **Экономика и формулы**

Обозначения: S\_scan — объём прочтения, N\_gpu — число GPU, BW\_eff — эффективная пропускная (GiB/с/GPU), c\_gpu — цена/час, U — целевая загрузка.

- **Время запроса:** T\_query ≈ S\_scan / (N\_gpu × BW\_eff).
- **Стоимость:** Cost ≈ c\_gpu × T\_query.
- **ETL‑окно:** T\_window ≈ (Σ S\_scan\_i) / (N\_gpu × BW\_eff × U).

**Оптимизация:** уменьшение S\_scan (проекцией/фильтрами/партициями), увеличение BW\_eff (NVMe/UCX/RMM), декомпозиция на CTAS‑шаги. Подробно — <https://cloudcompute.ru/solutions/throughput-vs-latency/> и <https://cloudcompute.ru/solutions/cost-planner/>

**Безопасность/политики**

- **PII/минимизация:** выбирайте только нужные колонки, маскируйте чувствительные поля на этапе SQL/ETL.
- **Шифрование:** «в канале» (межузловые), «на диске» (spill/артефакты на NVMe).
- **Ретеншн:** TTL на CTAS/временные партиции и кэш метаданных.
- **Изоляция:** отдельные GPU‑пулы (интерактив/батчи), квоты на Dask‑кластер, разграничение доступа к бакетам.

Подробнее: <https://cloudcompute.ru/solutions/security/>, <https://cloudcompute.ru/solutions/storage-data/>

**Траблшутинг**

<table><tbody><tr><td>**Симптом**

</td><td>**Возможная причина**

</td><td>**Решение**

</td></tr><tr><td>NOT IMPLEMENTED на функцию

</td><td>Конструкция вне подмножества ANSI/оператор не поддержан

</td><td>Переписать запрос на поддерживаемые функции; вынести стадию в cuDF

</td></tr><tr><td>Медленный join

</td><td>Перекос ключей/отсутствие пред‑агрегации

</td><td>Пред‑аггрегировать факты, брокастить малые таблицы, партиционировать по ключу

</td></tr><tr><td>Высокий spill на диск

</td><td>Недостаточно HBM/слишком широкие строки

</td><td>Сузить проекцию, уменьшить batch, повышать долю pinned‑host, CTAS по шагам

</td></tr><tr><td>Нестабильная латентность

</td><td>Смешанные нагрузки/шифлы

</td><td>Разнести пулы (интерактив/батч), ограничить конкуренцию задач, настроить UCX

</td></tr><tr><td>Ошибки типов

</td><td>Смешанные dtypes в источниках

</td><td>Явные CAST, унификация схемы до джойна

</td></tr><tr><td>Узкое чтение Parquet

</td><td>Много мелких файлов/низкий row group

</td><td>Репак файлов (coalesce), выбрать разумный row\_group\_size

</td></tr><tr><td>OOM при группировке

</td><td>Высокая кардинальность/неподходящее окно

</td><td>Пред‑аггрегация/скользящие окна, CTAS частями

</td></tr></tbody></table>

См. также: <https://cloudcompute.ru/solutions/performance-tuning/>, <https://cloudcompute.ru/solutions/interruptible-patterns/>

**Как запустить в cloudcompute.ru**

1. Откройте **Шаблоны запусков**: <https://cloudcompute.ru/solutions/templates/> и выберите **BlazingSQL Notebook** или **BlazingSQL + Dask‑CUDA Cluster**.
2. Профиль GPU: **24/48/80 ГБ** — по ширине строк/джойнам и SLA интерактива/батчей.
3. Подключите диски: /nvme/datasets (источники), /nvme/spill (spill/кэш метаданных).
4. Настройте окружение: RMM\_POOL\_SIZE, UCX‑флаги, директории spill, как в docker-compose.yml.
5. Для продакшна: пулы On‑Demand/Interruptible, дашборды и алерты (latency/HBM/spill/IO), канареечные обновления CTAS/схем.

**Чек‑лист перед продом**

- Ключевые запросы укладываются в целевой p95 sql\_query\_seconds.
- RMM‑пул 70–80% HBM; spill на NVMe протестирован.
- Партиционирование источников/CTAS согласовано (дата/ключ).
- Сформирован кэш‑план (HBM горячие таблицы, pinned‑host буфер, NVMe метаданные).
- Дашборды и алерты: gpu\_mem\_peak/HBM, spill\_bytes, read\_gib\_s/write\_gib\_s, scheduler\_queue\_len.
- Политики PII/ретеншн/шифрование внедрены.
- Нагрузочный прогон ≥ 30 мин с реальными запросами и фоновой нагрузкой.

**Навигация**

- Хаб «Решения»: <https://cloudcompute.ru/solutions/>
- RAPIDS (cuDF/cuML): <https://cloudcompute.ru/solutions/rapids/>
- Spark RAPIDS: <https://cloudcompute.ru/solutions/spark-rapids/>
- Рекомендательные системы: <https://cloudcompute.ru/solutions/recsys/>
- Хранилища и данные: <https://cloudcompute.ru/solutions/storage-data/>
- Производительность и тюнинг: <https://cloudcompute.ru/solutions/performance-tuning/>
- Throughput vs Latency: <https://cloudcompute.ru/solutions/throughput-vs-latency/>
- Multi‑GPU: <https://cloudcompute.ru/solutions/multi-gpu/>
- Планирование стоимости: <https://cloudcompute.ru/solutions/cost-planner/>
- Мониторинг и логи: <https://cloudcompute.ru/solutions/monitoring-logging/>
- Наблюдаемость пайплайнов: <https://cloudcompute.ru/solutions/llm-inference/observability/>
- Interruptible‑паттерны: <https://cloudcompute.ru/solutions/interruptible-patterns/>
- Triton Inference Server: <https://cloudcompute.ru/solutions/triton-inference-server/>
- Gradio + FastAPI: <https://cloudcompute.ru/solutions/gradio-fastapi/>
- CI/CD контейнеров: <https://cloudcompute.ru/solutions/containers-ci-cd/>

Готовы запустить?

Запустить GPU-сервер