Каковы распространенные алгоритмы сжатия данных? Как выбрать формат сжатия данных Hive?

Apache Hive

Это 8-й день моего участия в августовском испытании обновлений.Подробности о событии:Испытание августовского обновления

алгоритм сжатия данных

Распространенными форматами сжатия в области больших данных являются gzip, snappy, lzo, lz4, bzip2, zstd.

在这里插入图片描述

Почему сжатие данных?

Чтобы оптимизировать хранилище (уменьшить место для хранения) и полностью использовать пропускную способность сети, часто используются методы сжатия. Большие данные должны работать с огромными объемами данных, и в настоящее время очень важно сжатие данных.

Во многих сценариях, существующих на предприятии, источником данных часто являются данные в нескольких текстовых форматах (CSV, TSV, XML, JSON и т. д.). Эти файлы удобочитаемы для человека, но занимают много места для хранения.

Однако при обработке больших данных данные должны быть как можно более машиночитаемыми. Сжатие этих удобочитаемых данных в машиночитаемые данные с использованием методов сериализованного сжатия гарантирует, что для хранения потребуется гораздо меньше места.

Вот некоторые хорошо известные широко используемые форматы сжатия (называемые кодеками, которые позволяют сжимать/сериализовать и декомпрессировать/десериализовать данные).

Gzip (расширение .gz)

А именно GNU Zip (GZip), хорошо известный формат сжатия, широко используемый в мире Интернета. Запросы и ответы могут быть сжаты с использованием этого формата для эффективного использования полосы пропускания веб-сайта/веб-приложения.

преимущество

Сжатие относительно высокое, и сам hadoop поддерживает его.Обработка файлов в формате gzip в приложении аналогична обработке текста напрямую.Присутствует нативная библиотека hadoop.Большинство Linux-систем имеют свои собственные команды gzip, которые просты в использовании.

недостаток

Разделение не поддерживается

что такое родной для хаупа?

Из-за проблем с производительностью и отсутствия некоторых библиотек классов Java Hadoop предоставляет собственную реализацию для некоторых компонентов. Эти компоненты хранятся в отдельной динамически подключаемой библиотеке в Hadoop. Эта библиотека называется libhadoop.so на платформах Unix.

Snappy (расширение .snappy)

Кодек, разработанный Google (ранее называвшийся Zippy), считается лучшим среди средних коэффициентов сжатия. Для этого формата производительность важнее степени сжатия. Snappy — один из наиболее широко используемых форматов, очевидно, из-за его отличной производительности.

преимущество

Быстрое сжатие; поддержка собственной библиотеки Hadoop

недостаток

Split не поддерживается, степень сжатия низкая, сам hadoop не поддерживается и требует установки, под linux-системой нет соответствующей команды

ЛЗО (расширение .lzo)

Под лицензией GNU Public License (GPL), очень похожей на Snappy, он имеет умеренную степень сжатия и высокую производительность сжатия и распаковки. LZO — это алгоритм сжатия данных без потерь, ориентированный на скорость распаковки.

преимущество

Скорость сжатия/распаковки также относительно высока, с разумной степенью сжатия; он поддерживает разделение, которое является наиболее популярным форматом сжатия в Hadoop; он поддерживает нативную библиотеку Hadoop; вам необходимо установить команду lzop в системе Linux, которая прост в использовании

недостаток

Сам Hadoop не поддерживает его, и его необходимо установить; хотя lzo поддерживает разделение, ему необходимо построить индекс для файла lzo, в противном случае hadoop также будет рассматривать файл lzo как обычный файл (для поддержки разделения индексу необходимо должен быть построен, а InputFormat должен быть указан как формат lzo).

LZ4 (расширение .lz4)

преимущество

Хорошая производительность, высокая степень сжатия, хорошая начальная скорость инициализации, хорошая скорость сжатия и стабильность

недостаток

  1. Распаковка lz4 более проблематична, и необходимо указать размер исходного массива байтов, поэтому рабочая нагрузка разработки больше.
  2. Разделение не поддерживается

Bzip2 (расширение .bz2)

Более или менее похоже на GZip, степень сжатия выше, чем у GZip. Но, как и ожидалось, Bzip2 распаковывает данные медленнее, чем GZip. Одним из важных аспектов является то, что он поддерживаетсегментация данных, что очень важно при использовании HDFS в качестве хранилища. Это сжатие было бы хорошим выбором, если данные просто сохраняются без запроса.

преимущество:

Поддержка разделения; имеет высокую степень сжатия, выше, чем у gzip; сам Hadoop поддерживает, но не поддерживает родной; поставляется с командой bzip2 в системе Linux, прост в использовании

недостаток:

Медленное сжатие/распаковка; нет встроенной поддержки

zstd (расширение .zstd)

Zstd — это новый алгоритм сжатия без потерь, открытый исходным кодом Facebook в 2016 году. Преимущество заключается в том, что коэффициент сжатия и производительность сжатия/распаковки выдающиеся. В zstd также есть специальная функция, поддерживающая создание файлов словарей в режиме обучения, что может значительно улучшить степень сжатия небольших пакетов данных по сравнению с традиционными методами сжатия.

  1. Для сценариев сжатия текста с большими объемами данных лучше всего подходит zstd, учитывая коэффициент сжатия и производительность сжатия, за которым следует lz4.
  2. Для сценариев сжатия с небольшими объемами данных, если можно использовать метод словаря zstd, эффект сжатия будет более заметным.
  3. Поддержка разделена, но не идеальна, детали видны——Is zstd splitabble in hadoop/spark/etc?

Инструкции по сжатию данных

Оценка сжатого режима

  • Методы компрессии можно оценить по следующим трем критериям.
  1. Степень сжатия: Чем выше степень сжатия, тем меньше сжатый файл, поэтому чем выше степень сжатия, тем лучше.
  2. Время сжатия: чем быстрее, тем лучше
  3. Можно ли разделить файл сжатого формата: разделяемый формат позволяет обрабатывать один файл несколькими программами Mapper, которые могут быть лучше распараллелены.

Распространенные форматы сжатия

В сравнении

Метод сжатия коэффициент сжатия Скорость сжатия скорость декомпрессии Это отделимо
gzip 13.4% 21 MB/s 118 MB/s нет
bzip2 13.2% 2.4MB/s 9.5MB/s да
lzo 20.5% 135 MB/s 410 MB/s да
snappy 22.2% 172 MB/s 409 MB/s нет

Метод кодировщика/декодера Hadoop

Формат сжатия Соответствующий кодер/декодер
DEFLATE org.apache.hadoop.io.compress.DefaultCodec
Gzip org.apache.hadoop.io.compress.GzipCodec
BZip2 org.apache.hadoop.io.compress.BZip2Codec
LZO com.hadoop.compress.lzo.LzopCodec
Snappy org.apache.hadoop.io.compress.SnappyCodec

использование сжатия данных

Сжатие промежуточных данных таблицы Hive

#设置为true为激活中间数据压缩功能,默认是false,没有开启
set hive.exec.compress.intermediate=true;
#设置中间数据的压缩算法
set mapred.map.output.compression.codec= org.apache.hadoop.io.compress.SnappyCodec;

Сжатие конечного результата таблицы Hive

set hive.exec.compress.output=true;
set mapred.output.compression.codec= 
org.apache.hadoop.io.compress.SnappyCodec;