Apache Parquet

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 11:16, 21 января 2019.
Apache Parquet
Apache Parquet icon
ApacheParquetFormatinAction.png
Apache Parquet Viewer
Расширение файла(ов) .parquet
Тип кода
  • "parquet"
Разработчик Apache Software Foundation
Начальная версия 2013; 7 years ago (2013)
Последний релиз
1.11.0
(9 January 2019 года; 18 months ago (2019-01-09))
Тип формата Data Storage format
Открытый формат? Да
Веб-сайт Apache Parquet

Apache Parquet - это бинарный, колоночно-ориентированный (столбцовый) формат хранения данных, изначально созданный для экосистемы Hadoop.

Описание

Apache Parquet был создан с целью сделать преимущества сжатого и эффективного столбцового представления данных доступными для любого проекта в экосистеме Hadoop. Он позволяет задавать схемы сжатия на уровне столбцов и рассчитан на возможность добавлять новые кодировки по мере их изобретения и реализации.

Терминология

При понимании принципа работы Apache Parquet применяются следующие термины:

  • Файл. HDFS файл, который должен включать метаданные для файла. В принципе не обязан содержать какие-либо данные.
  • Группа строк. Логическое горизонтальное разбиение данных на строки. Не существует физической структуры, которая гарантирована для группы строк. Группа строк состоит из фрагмента столбца для каждого столбца в наборе данных.
  • Блок столбца. Блок данных для определенного столбца. Они находятся в определенной группе строк и гарантированно будут смежными в файле.
  • Страница. Столбцы разделены на страницы. Страница концептуально является неделимой единицей (с точки зрения сжатия и кодирования). Может быть несколько типов страниц, которые чередуются в блоке столбца.

Иерархически файл состоит из одной или нескольких групп строк. Группа строк содержит ровно один кусок столбца на столбец. Куски столбцов содержат одну или несколько страниц.

Особенности

Apache Parquet реализован с использованием алгоритма измельчения и сборки записей, вмещающий сложные структуры данных, которые можно использовать для хранения данных. Это дает свои преимущества и недостатки.

Преимущества

Значения в каждом столбце физически хранятся в смежных местах памяти, и это столбцовое хранилище обеспечивает следующие преимущества:

  • Сжатие по столбцам эффективно и экономит место для хранения
  • Запросы, извлекающие определенные значения столбцов, не должны считывать все необработанные данные, что повышает производительность
  • Различные методы кодирования могут быть применены к различным столбцам
  • Кроме того, Apache Parquet реализован с использованием фреймворка Apache Thrift, что повышает его гибкость; он может работать с рядом языков программирования, таких как C++, Java, Python, PHP и т.д.
  • Несмотря на то, что данные в Parquet и созданы для HDFS, данные могут храниться и в других файловых системах, таких как GlusterFs или поверх NFS
  • По сути это просто файлы, а значит с ними легко работать, перемещать, делать бэкапы и осуществлять репликацию.
  • Колоночный вид позволяет значительно ускорить работу аналитика, если ему не нужны все колонки сразу.
  • Нативная поддержка в Spark из коробки обеспечивает возможность просто взять и сохранить файл в любимое хранилище.
  • Как показывает практика, именно этот способ обеспечивает самую быструю работу на чтение по сравнению с использованием других файловых форматов.

Недостатки

К недостаткам можно отнести:

  • Колоночный вид заставляет задумываться о схеме и типах данных.
  • Parquet в других продуктах не всегда обладает такой же нативной поддержкой как в Spark.
  • Не поддерживает изменение данных и эволюцию схемы.
  • Не поддерживаются транзакции, так как это обычные файлы, а не БД.

Модули

Модули Apache Parquet:

Формат проекта Описание
Parquet Содержит спецификации формата и метаданные Thrift, необходимые для правильного чтения файлов Parquet.
Parquet-mr Cодержит несколько подмодулей, которые реализуют основные компоненты чтения и записи вложенного ориентированного на столбцы потока данных, сопоставляют это ядро с форматом паркета и предоставляют форматы ввода / вывода Hadoop, загрузчики Pig и другие. Java-утилиты для взаимодействия с Parquet.
Parquet-cpp Библиотека C++ для чтения и записи файлов Parquet.
Parquet-rs Библиотека Rust для чтения и записи файлов Parquet.
Parquet-compatibility Cодержит тесты совместимости, которые можно использовать для проверки того, что реализации на разных языках могут читать и записывать файлы друг друга.

Сжатие и кодирование

В Parquet сжатие выполняется столбец за столбцом, что позволяет использовать разные схемы кодирования для текстовых и целочисленных данных. Эта стратегия также работает для новых и лучших схем кодирования, которые будут реализованы по мере их изобретения.

Кодировка словаря

Parquet имеет автоматическое кодирование словаря, динамически включаемое для данных с небольшим количеством уникальных значений (<10^5), что обеспечивает значительное сжатие и повышает скорость обработки.

На данный момент поддерживается RLE кодировка для уровней.

Кодирование длин серий (RLE)

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

Parquet реализует гибрид упаковки битов и RLE, в котором переключатели кодирования на основе которых дают лучшие результаты сжатия. Эта стратегия хорошо работает для определенных типов целочисленных данных и хорошо сочетается со словарным кодированием.

Упаковка битов

Хранение целых чисел обычно выполняется с выделенными 32 или 64 битами на целое число. Для небольших целых чисел упаковка нескольких целых в одном и том же пространстве делает хранение более эффективным.

Вложенная кодировка

Для кодирования вложенных столбцов Parquet использует кодировку Dremel с уровнями определения и повторения. Уровни определения указывают, сколько необязательных полей в пути для столбца определены. Уровни повторения указывают, для какого повторяемого поля в пути значение имеет повторение. Максимальные уровни определения и повторения могут быть вычислены из схемы (т. е. сколько существует вложенности). Это определяет максимальное количество битов, необходимых для хранения уровней (уровни определены для всех значений в столбце).

Структура файла

Рассмотрим следующий пример:

4-byte magic number "PAR1"
<Column 1 Chunk 1 + Column Metadata>
<Column 2 Chunk 1 + Column Metadata>
...
<Column N Chunk 1 + Column Metadata>
<Column 1 Chunk 2 + Column Metadata>
<Column 2 Chunk 2 + Column Metadata>
...
<Column N Chunk 2 + Column Metadata>
...
<Column 1 Chunk M + Column Metadata>
<Column 2 Chunk M + Column Metadata>
...
<Column N Chunk M + Column Metadata>
File Metadata
4-byte length in bytes of file metadata
4-byte magic number "PAR1"

В приведенном выше примере в этой таблице есть N столбцов, разбитых на M групп строк. Метаданные файла содержат местоположения всех начальных местоположений метаданных столбца.

Parquet использует архитектуру (см. рисунок 1), основанную на “уровнях определения” (definition levels) и “уровнях повторения” (repetition levels), что позволяет довольно эффективно кодировать данные, а информация о схеме выносится в отдельные метаданные[Источник 1]. При этом оптимально хранятся и пустые значения.

Метаданные, в свою очередь, записываются после данных, чтобы обеспечить однопроходную запись. Ожидается, что сначала прочитаются метаданные файла, чтобы найти все интересующие их фрагменты столбцов. Затем фрагменты столбцов будут прочтены последовательно.

Рисунок 1 - Макет файла

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

  • Row-group — разбиение, позволяющее параллельно работать с данными на уровне Map-Reduce
  • Column chunk — разбиение на уровне колонок, позволяющее распределять IO операции
  • Page — разбиение колонок на страницы, позволяющее распределять работу по кодированию и сжатию

Метаданные

В Apache Parquet осуществляется работа с тремя типами метаданных[Источник 2]:

  • Метаданные файла
  • Метаданные столбца (чанка)
  • Метаданные заголовка страницы

Рассмотрим формат на рисунке 2:

Рисунок 2 - Формат

Формат явно предназначен для отделения метаданных от данных. Это позволяет разбивать столбцы на несколько файлов, а также иметь один файл метаданных, ссылающийся на несколько файлов паркета.

Типы

Предполагается, что типы переменных, поддерживаемые форматом файла, должны быть как можно более минимальны, с учетом того, как типы влияют на дисковое хранилище. Например, 16-разрядные числа явно не поддерживаются в формате хранения, поскольку они покрыты 32-разрядными числами с эффективным кодированием. Это уменьшает сложность реализации чтения и записи для формата. Типы:

  • BOOLEAN. 1-битный логический
  • INT32. 32-битные подписанные числа
  • INT64. 64-битные подписанные числа
  • INT96. 96-битные подписанные числа
  • FLOAT. IEEE 32-битные значения с плавающей точкой
  • DOUBLE. IEEE 64-битные значения с плавающей точкой
  • BYTE_ARRAY. Произвольно длинные байтовые массивы.

Восстановление после ошибок

Если метаданные файла повреждены, файл теряется. Если метаданные столбца повреждены, этот фрагмент столбца теряется (но фрагменты столбца для этого столбца в других группах строк в порядке). Если заголовок страницы поврежден, остальные страницы в этом чанке будут потеряны. Если данные на странице повреждены, эта страница теряется. Файл будет более устойчивым к повреждению с небольшими группами строк.

Потенциальное расширение: с небольшими группами строк самой большой проблемой является размещение метаданных файла в конце. Если во время записи метаданных файла произойдет ошибка, все записанные данные будут нечитаемыми. Это можно исправить, записав метаданные файла в каждую N-ю группу строк. Метаданные каждого файла будут включать все группы строк, написанные до сих пор. Комбинируя это со стратегией, используемой для файлов rc или avro с использованием маркеров синхронизации, читатель может восстановить частично записанные файлы.

Источники

  1. Как использовать Parquet и не поскользнуться // Habrahabr. [2006—2019]. Дата обновления: 22.03.2016. URL: https://habr.com/company/wrike/blog/279797/ (дата обращения: 22.12.2018)
  2. Метаданные в Apache Parquet // Документация Apache Parquet. [2018—2018]. Дата обновления: 30.05.2018. URL: https://parquet.apache.org/documentation/latest/ (дата обращения: 22.12.2018)