Сводная таблица 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 — золотой стандарт для вашего кластера! 🚀📦