Открыть сервис

Apache Parquet

Apache Parquet — это формат хранения данных в столбцовом (колоночном) представлении, разработанный для экосистемы Apache Hadoop. Он предназначен для эффективного сжатия и кодирования данных, что позволяет значительно сократить объём хранимой информации и ускорить выполнение аналитических запросов, особенно при работе с большими объёмами данных (Big Data). Parquet является открытым стандартом (open-source) и не зависит от конкретной технологии обработки данных.

История

Разработка формата Parquet была начата в 2013 году инженерами компаний Twitter и Cloudera. Основной целью было создание формата хранения, который бы сочетал преимущества столбцового хранения (высокая скорость чтения отдельных колонок) и эффективное сжатие, при этом оставаясь совместимым с различными инструментами обработки данных в экосистеме Hadoop. Первая стабильная версия была выпущена в 2014 году. В 2015 году проект был передан в инкубатор Apache Software Foundation, а в 2016 году получил статус проекта верхнего уровня (Top-Level Project) фонда Apache. С тех пор Parquet стал одним из стандартных форматов для хранения данных в озёрах данных (Data Lake) и хранилищах данных (Data Warehouse).

Архитектура и принципы работы

Столбцовое хранение

В отличие от строковых форматов (например, CSV, JSON, Avro), где данные каждой строки хранятся последовательно, Parquet хранит данные по столбцам. Это означает, что все значения одного столбца (например, «возраст») хранятся вместе в одном блоке на диске. Такое представление даёт несколько ключевых преимуществ:

  • Скорость запросов: при выполнении аналитического запроса, который затрагивает только несколько столбцов из сотен, система считывает только необходимые блоки, игнорируя остальные. Это резко сокращает объём ввода-вывода (I/O).
  • Сжатие: данные в одном столбце часто имеют одинаковый тип и похожие значения, что позволяет применять специализированные алгоритмы сжатия (например, разностное кодирование, словарное кодирование), достигая высокой степени сжатия (в 2-4 раза и более по сравнению с несжатыми текстовыми форматами).

Иерархическая структура

Файл Parquet имеет сложную внутреннюю структуру, состоящую из нескольких уровней:

  • Файл (File): содержит метаданные о схеме данных и один или несколько «групп строк» (Row Groups).
  • Группа строк (Row Group): логическое горизонтальное разбиение данных. Каждая группа строк содержит определённое количество строк (обычно от нескольких тысяч до нескольких миллионов). Это позволяет параллельно обрабатывать разные части файла.
  • Столбец (Column Chunk): внутри каждой группы строк данные каждого столбца хранятся в виде отдельного «куска» (chunk). Эти куски записываются последовательно.
  • Страница (Page): минимальная единица хранения внутри куска столбца. Данные на уровне страниц могут быть дополнительно сжаты и закодированы. Parquet поддерживает три типа страниц: страницы данных (Data Page), страницы словаря (Dictionary Page) и страницы индекса (Index Page).

Схема данных

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

  • Примитивные типы: BOOLEAN, INT32, INT64, FLOAT, DOUBLE, BYTE_ARRAY, FIXED_LEN_BYTE_ARRAY.
  • Вложенные типы: группы (структуры), списки, карты (map). Это позволяет хранить данные, соответствующие, например, JSON-документам, без их предварительной нормализации.

Кодирование и сжатие

Parquet использует комбинацию кодирования и сжатия. Кодирование преобразует данные в более компактное представление, а сжатие (например, с помощью алгоритмов Snappy, Gzip, LZ4, ZSTD) уменьшает размер уже закодированных данных. Основные методы кодирования:

  • Plain (простой): данные хранятся как есть, без кодирования.
  • Dictionary (словарное): для столбца строится словарь уникальных значений, а вместо самих значений хранятся их индексы в словаре. Эффективно для столбцов с небольшим количеством уникальных значений (например, «страна», «статус»).
  • Run-Length Encoding (RLE): кодирует последовательности повторяющихся значений. Эффективно для столбцов с большим количеством одинаковых значений подряд.
  • Delta Encoding (разностное): хранит разности между последовательными значениями. Эффективно для монотонно возрастающих или убывающих последовательностей (например, временные метки).

Преимущества и недостатки

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

  • Высокая производительность аналитических запросов: за счёт столбцового хранения и эффективного сжатия.
  • Экономия места на диске: сжатие данных в несколько раз.
  • Поддержка сложных схем: возможность хранить вложенные структуры без их упрощения.
  • Совместимость: поддерживается практически всеми современными движками обработки данных (Apache Spark, Apache Hive, Apache Impala, Presto, Amazon Athena, Google BigQuery, Dremio, DuckDB и др.).
  • Открытость и стандартизация: проект Apache, не привязанный к одному вендору.

Недостатки

  • Не подходит для операционных (OLTP) нагрузок: запись данных в Parquet требует буферизации и группировки, что делает его непригодным для систем, где требуется вставка или обновление отдельных строк в реальном времени (например, для банковских транзакций).
  • Сложность записи: для создания файлов Parquet требуется больше вычислительных ресурсов и памяти, чем для записи в строковые форматы.
  • Нечитаемость человеком: в отличие от CSV или JSON, файл Parquet нельзя открыть в текстовом редакторе и прочитать.

Применение

Parquet является основным форматом хранения данных в современных архитектурах «озёр данных» (Data Lake) и «озёр данных-хранилищ» (Lakehouse). Он используется для:

  • Хранения исторических данных: логи, события, транзакции, данные датчиков.
  • Аналитики и бизнес-отчётности: выполнение сложных SQL-запросов к большим наборам данных.
  • Машинного обучения: хранение и чтение больших датасетов для обучения моделей.
  • ETL-процессов: промежуточное и финальное хранение данных при их трансформации.

Взаимодействие с другими технологиями

Parquet является частью более широкой экосистемы форматов и технологий:

  • Apache Avro: строковый формат, часто используемый для сериализации данных в потоковой передаче (например, Kafka). Parquet и Avro часто используются вместе: Avro для передачи, Parquet для хранения.
  • Apache ORC: другой популярный столбцовый формат, также разработанный в экосистеме Hadoop. ORC часто оптимизирован для работы с Apache Hive, в то время как Parquet более универсален и поддерживается большим количеством инструментов.
  • Apache Arrow: формат для представления данных в памяти (in-memory), который позволяет эффективно передавать данные между различными системами без сериализации. Parquet и Arrow часто используются совместно: Parquet для долговременного хранения, Arrow для обработки в памяти.

Интересные факты

  • Parquet поддерживает «прогнозирование» (predicate pushdown) — возможность отфильтровать данные на уровне чтения файла, не загружая в память те группы строк, которые не удовлетворяют условию запроса.
  • Формат позволяет хранить метаданные о статистике (минимум, максимум, количество null-значений) для каждого куска столбца, что также ускоряет фильтрацию.
  • Parquet не является форматом для хранения данных в реальном времени — он ориентирован на пакетную обработку и аналитику.

Источники

  • Официальная документация Apache Parquet (parquet.apache.org)
  • Документация Apache Hadoop
  • Книга «Hadoop: The Definitive Guide» (Tom White)
  • Статья «Dremel: Interactive Analysis of Web-Scale Datasets» (S. Melnik et al., 2010) — описывает алгоритмы, лежащие в основе Parquet

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →