Какие схемы сжатия данных вы применяли в DWH и Big Data?

Ответ

Выбор схемы сжатия — это всегда компромисс между степенью сжатия, скоростью и вычислительными затратами. Вот мой опыт:

В колоночных форматах (Parquet, ORC), которые являются стандартом для DWH/Data Lakes:

  • Snappy: Использую по умолчанию для "горячих" данных, с которыми часто работают интерактивные запросы. Очень высокая скорость распаковки при умеренной степени сжатия.
  • Gzip/Zlib: Применяю для исторических или "холодных" данных, где приоритет — экономия на хранении, а не скорость чтения. Даёт лучшее сжатие, но нагружает CPU.
  • Zstandard (Zstd): Мой фаворит для новых проектов. Обеспечивает степень сжатия, близкую к Gzip, при скорости, сравнимой со Snappy. Поддерживает настраиваемые уровни сжатия.

Настройка в Apache Spark:

# Запись с указанием компрессии для Parquet
(df.write
   .option("compression", "zstd")  # или "snappy", "gzip"
   .parquet("/data/events"))

# Для ORC
(df.write
   .option("compression", "snappy")
   .orc("/data/events_orc"))

Для строковых/текстовых форматов (логи, JSON в S3/Blob Storage):

  • Brotli: Отлично подходит для сжатия текстовых данных перед загрузкой в облачное хранилище, даёт высокий коэффициент.
  • LZ4: Использую в стриминговых конвейерах (например, при промежуточной записи в Kafka), где критически важна минимальная задержка.

В колонках реляционных СУБД (Oracle, PostgreSQL):

  • Использую встроенное сжатие на уровне таблиц или партиций. Например, в Oracle — COMPRESS FOR OLTP или COMPRESS FOR QUERY, в PostgreSQL — pg_repack с включённым сжатием TOAST.

Критерии выбора в проекте:

  1. Паттерн доступа: Частые чтения → Snappy/Zstd. Редкие чтения/архив → Gzip/Brotli.
  2. Вычислительные ресурсы: Gzip требует больше CPU, что может стать узким местом при массовой загрузке.
  3. Экономика: Для петабайтных хранилищ даже 10-15% экономии от выбора более агрессивного сжатия дают значительную финансовую выгоду.

Ответ 18+ 🔞

Эх, выбор схемы сжатия — это вечная история, как выбрать между пивом и водкой. Всё зависит от того, что тебе важнее: быстро допиться до состояния или сэкономить на закуске. Так и тут — вечный компромисс между скоростью, размером и тем, насколько твой процессор будет вздрачивать.

Для колоночных форматов (Parquet, ORC), которые у нас в дата-лайках царствуют:

  • Snappy: Это мой дефолтный выбор для «горячих» данных, с которыми постоянно носятся аналитики. Распаковывается с такой скоростью, что удивление пиздец. Степень сжатия средненькая, но зато не грузит систему — красота.
  • Gzip/Zlib: А это уже для «холодного» архива, который лежит и пылится. Тут главное — впихнуть побольше и сэкономить место, а скорость — да похуй. Жмёт отлично, но процессор нагружает знатно, будто он картошку на зиму чистит.
  • Zstandard (Zstd): Вот это, ёпта, моя новая любовь. Как будто взяли всё лучшее от Snappy и Gzip, скрестили и получили идеального химера. Сжимает почти как Gzip, а работает почти как Snappy. Просто овердохуища, всем рекомендую.

Как это в Apache Spark приляпать:

# Писалка в Parquet с указанием компрессии
(df.write
   .option("compression", "zstd")  # или "snappy", "gzip"
   .parquet("/data/events"))

# Для ORC
(df.write
   .option("compression", "snappy")
   .orc("/data/events_orc"))

А вот для всяких текстовых форматов (логи, JSON в облаке):

  • Brotli: Это для тех случаев, когда нужно запихнуть невпихуемое. Текстовые данные перед отправкой в S3 им сжать — экономия будет, ядрёна вошь. Но готовься, что сжимать будет дольше.
  • LZ4: А это наш спринтер. Для стримов, где каждая миллисекунда на счету (типа Kafka), — самое то. Быстрее только ручной ввод, блядь.

Ну и в классических базах данных (Oracle, Postgres):

  • Там обычно пользуюсь тем, что дали. Встроенное сжатие на уровне таблиц включаю и радуюсь. В Oracle, например, есть COMPRESS FOR OLTP — звучит солидно, как «вилка в глаз».

А вообще, чувак, как выбирать-то? Да просто:

  1. Часто трогаешь данные? Бери Snappy или Zstd — чтобы не ждать, пока распакуется.
  2. Процессор слабенький или облако дорогое? Не гонись за Gzip, а то накладные расходы такие, что волнение ебать.
  3. Хранилище размером с петабайт? Тут каждый процент сжатия — это тебе не хуй с горы, а реальные тысячи долларов в год. Вот тут уже думай головой, э бошка думай, Gzip или Brotli.