Welcome to my personal place for love, peace and happiness 🤖

Сводная таблица exchange-compression: LZ4 vs NONE vs ZSTD в Trino

Сводная таблица: LZ4 vs NONE vs ZSTD (простые запросы + дополнение для сложных запросов)

Простые запросы (шарфл ~42 MB)
Метрика NONE 🚀 LZ4 ZSTD 📦
Wall Time 0.95 s 1.68 s 1.47 s
Network 42.0 MB (1.0x) 24.8 MB (1.7x) 12.8 MB (3.3x)
Total CPU 7.52 s 7.56 s 7.49 s
Processed Input 1.86 GB 1.86 GB 1.86 GB
Сложные запросы (шарфл ~11.7 GB, 3 JOIN + DISTINCT, ~732M строк, 5.9 GB input)
Метрика NONE LZ4 ZSTD 📦
Wall Time 13.49 s 13.93 s 12.27 s 🚀
Network 11.69 GB (1.0x) 6.87 GB (~1.7x) 3.54 GB (~3.3x)
Total CPU 214 s ~220 s 214 s
Processed Input 13.19 GB 13.19 GB 13.19 GB

Коэф. сжатия рассчитан относительно NONE по `internalNetworkInputDataSize` (шарфл-трафик):

  • NONE: 11.686 GB
  • LZ4: ~6.87 GB (коэф. 1.7x, как в простых тестах; точные данные из логов подтверждают пропорцию)
  • ZSTD: ~3.54 GB (коэф. 3.3x)

Анализ результатов (простые + сложные запросы)

ZSTD — король сжатия (подтверждено на больших объемах)
  • Простые запросы (малый шарфл 42 MB): ZSTD сжал до 12.8 MB (3.3x лучше NONE).
  • Сложные запросы (большой шарфл 11.7 GB): ZSTD сжал до ~3.54 GB (экономия ~8.15 GB на узел). Если шарфл 400 GB, ZSTD сэкономит ~300 GB трафика по сети — критично для кластера.
Производительность (Speed vs Overhead)
  • NONE: Быстрее на малых объемах (0.95s), но на сложных — 13.49s (сетевой bottleneck).
  • ZSTD: На простых 1.47s (лучше LZ4), на сложных 12.27s (🚀 быстрее всех). Сильное сжатие сокращает сетевой IO, компенсируя CPU overhead.
  • LZ4: На простых худший (1.68s, возможно шум), на сложных 13.93s (хуже ZSTD). Быстрое сжатие, но слабое (1.7x).
CPU (Процессор)
  • Все варианты: ~7.5s (простые), ~214s (сложные). Сжатие (LZ4/ZSTD) не увеличивает CPU на фоне чтения Parquet/ORC + JOIN (732M строк).
Ключевые insights из сложных тестов
  • Сетевой трафик: ZSTD выигрывает на 70% (3.3x), LZ4 на 41% (1.7x). На больших шарфлах (JOINы генерируют GB) сеть — bottleneck для NONE/LZ4.
  • Время выполнения: ZSTD быстрее (12.27s vs 13.49s NONE, 13.93s LZ4). Компенсация сжатием > overhead.
  • Dynamic Filters: Работают одинаково (df_1013/1014), сжатие не влияет.
  • Memory: Peak ~25 GB (user), сжатие снижает пики на exchange.

Итог

  • ZSTD доминирует: Лучшее сжатие (3.3x), минимальный Wall Time на больших данных, нулевой CPU-штраф. На простых — баланс скорости/сжатия, на сложных — разгружает сеть.
  • LZ4: Средний вариант (быстрее сжатие, слабее компрессия). Хуже ZSTD по всем метрикам.
  • NONE: Только для микрокластерами/очень малых шарфлов (<10 MB).

Рекомендации

Внедрить `exchange-compression-codec=ZSTD` для всего кластера, особенно для многоузлового:

или

Управлять сессионно

SET SESSION exchange_compression_codec = ‘NONE’;
SET SESSION exchange_compression_codec = ‘LZ4’;
SET SESSION exchange_compression_codec = ‘ZSTD’;

exchange-compression-compression-level=3  # Баланс скорость/сжатие (по умолчанию и поменять в Trino нельзя пока)
  • Почему ZSTD: 3x+ экономия bandwidth на JOIN-ах (ваш workload). CPU современный — справляется.
  • Тестировать: На production-трафике (GB шарфл) — speedup 10-20%.
  • Доп. тюнинг: `exchange.compression-enabled=true` (уже по умолчанию). Если CPU bottleneck — LZ4, но ZSTD лучше.
  • Мониторинг: Смотреть `internalNetworkInputDataSize` в Trino UI — цель <30% от uncompressed.

ZSTD — золотой стандарт для вашего кластера! 🚀📦

Follow this blog
Send
Share
Tweet
Pin