канд. экон. наук, доцент, Московский государственный технологический университет «Станкин», РФ, г. Москва
ФОРМАТ PARQUET: ОБЗОР СТРУКТУРЫ И МЕТОДЫ ОПТИМИЗАЦИИ ДЛЯ ВЫСОКОЙ ПРОИЗВОДИТЕЛЬНОСТИ В РАСПРЕДЕЛЁННЫХ СИСТЕМАХ
АННОТАЦИЯ
Измерение аудитории ТВ и радио – обработка данных с измерительных панелей и других источников, анализ интернет-аудитории и учет поведения миллионов зрителей и слушателей, а также обработка данных мобильных приложений, отслеживание пользовательской активности и разработка прогнозных моделей в медиа и рекламе на основе больших массивов информации является весьма востребованной повседневной задачей. Для ее решения приходится постоянно совершенствовать программные средства и инструменты для обработки больших данных (big data).
В статье представлен обзор формата данных Parquet, который широко используется в распределённых системах для обработки и хранения больших объёмов данных. Описаны ключевые элементы структуры Parquet, включая данные, кодирование, сжатие и методы оптимизации для повышения производительности. Рассмотрены эффективные подходы, такие как выбор размера файлов, разбиение данных на логические блоки и параллельная обработка, которые способствуют улучшению скорости обработки и экономии ресурсов.
ABSTRACT
Measuring TV and radio audiences – processing data from measurement panels and other sources, analyzing the Internet audience and taking into account the behavior of millions of viewers and listeners, as well as processing mobile application data, tracking user activity and developing forecast models in media and advertising based on large amounts of information – is a highly sought-after everyday task. To solve it, it is necessary to constantly improve software and tools for processing big data.
The article provides an overview of the Parquet data format, widely used in distributed systems for processing and storing large volumes of data. Key elements of the Parquet structure are described, including data, encoding, compression, and optimization methods for improving performance. Effective approaches such as file size selection, data partitioning into logical blocks, and parallel processing are discussed, which help enhance processing speed and resource efficiency.
Ключевые слова: большие данные, распределённые системы хранения, Apache Parquet, формат файлов
Keywords: big data, distributed storage systems, Apache Parquet, file format
Введение и цели исследования
В современных распределённых системах хранения данных эффективное представление и хранение информации играют ключевую роль в обеспечении производительности и масштабируемости систем. Одной из важных задач является выбор оптимального формата хранения данных, который позволяет уменьшить затраты на хранение и повысить скорость обработки. Одним из таких форматов является Parquet, который приобрёл большую популярность благодаря своей эффективности в обработке и хранении больших объёмов данных.
Цель данной работы – провести обзор структуры формата Parquet и рассмотреть методы оптимизации его использования в распределённых системах хранения данных. Для достижения поставленной цели необходимо решить следующие задачи:
- Рассмотреть основные принципы работы Parquet и его отличия от других форматов хранения данных.
- Проанализировать внутреннюю структуру Parquet-файла.
- Описать методы оптимизации для повышения производительности при использовании данного формата в распределённых системах.
Методика исследования
В ходе исследования проведён анализ существующих источников, описывающих архитектуру и принципы работы формата Parquet. Были рассмотрены официальная документация, научные статьи и практические кейсы применения Parquet в распределённых системах хранения данных, таких как Apache Hadoop, Apache Spark и Apache Drill.
Методы исследования включали:
- Анализ литературы и технической документации по формату Parquet.
- Экспериментальное тестирование методов оптимизации, таких как сжатие, индексация и настройка параметров хранения.
Основная часть
Parquet — это открытый, колонно-ориентированный формат хранения данных, который используется для эффективной обработки больших объёмов данных в распределённых системах. Он был создан как часть экосистемы Hadoop и поддерживает аналитику и обработку данных в таких распределённых системах как Apache Hadoop, Apache Spark, Apache Drill и других. [1]
В отличие от строковых форматов (например, CSV или JSON), где данные хранятся построчно, Parquet хранит данные колонками. Это позволяет значительно повысить производительность при работе с большими объёмами данных, так как часто нужно работать только с отдельными колонками, что делает чтение данных гораздо быстрее.
Parquet файл имеет строго определённую структуру, которая состоит из следующих компонентов:
- Заголовок файла. Заголовок файла содержит информацию, указывающую на его формат. Это небольшой участок данных, который используется для идентификации файла как Parquet и для проверки его целостности. Он включает магическую строку PAR1 (в шестнадцатеричной форме 0x50 0x41 0x52 0x31), что подтверждает, что файл является файлом Parquet.
- Группы строк. Parquet файл делится на несколько групп строк. Каждая группа строк представляет собой логическую единицу данных, которая может содержать несколько тысяч или даже миллионов строк. Это позволяет обрабатывать данные блоками, эффективно управлять памятью и организовывать параллельную обработку. Каждая группа строк может быть сжата отдельно, что значительно улучшает производительность при чтении и записи данных.
- Column Chunks. Каждая группа строк внутри Parquet файла разделена на column chunks — части данных, которые хранят значения в виде колонок. В отличие от строкового хранения, где данные идут по строкам, здесь данные упакованы по колонкам. Это позволяет ускорить выполнение запросов, когда необходимо обработать только одну или несколько колонок, не затрагивая остальные. Такой подход также способствует лучшему сжатию данных, так как одинаковые значения в колонке могут быть эффективно сжаты. [2]
- Страницы. Внутри column chunk данные делятся на более мелкие части, называемые страницами. Страница — это основная единица хранения данных в Parquet. Страницы могут быть различных типов, в зависимости от того, как кодируются данные, и каждый тип страницы имеет свою роль в улучшении производительности и сжатия данных. Вот основные типы страниц:
- Data Pages: Эти страницы содержат непосредственно данные, хранящие значения в виде блоков. Они могут быть сжаты и индексированы для оптимизации извлечения данных.
- Dictionary Pages: Эти страницы содержат словарь для хранения часто повторяющихся значений (например, строки). Это позволяет значительно уменьшить размер данных, поскольку повторяющиеся значения заменяются на короткие ссылки, что уменьшает размер хранимых данных за счет использования повторяющихся значений с минимальным пространством.
- Index Pages: Эти страницы содержат индексные данные, которые помогают быстро находить нужные данные в других частях файла. Индексы обеспечивают быстрый доступ к данным без необходимости просматривать все страницы файла, что ускоряет выполнение запросов.
Каждая страница может быть сжата и обработана независимо, что позволяет эффективно использовать пространство и повышает скорость обработки данных, ускоряя извлечение нужной информации.
- Конец файла. В конце файла находится footer — метаинформация, которая включает:
- Схему данных: Описание типов данных и структуры таблицы.
- Параметры сжатия и кодирования: Информация о том, какие алгоритмы сжатия и кодирования использовались для оптимизации данных.
- Статистику: Минимальные и максимальные значения для каждого столбца, что ускоряет выполнение запросов, особенно при фильтрации и агрегации.
- Местоположение данных: Указания на расположение различных частей данных в файле (например, какие страницы содержат какие столбцы), что позволяет ускорить поиск нужных данных.
Кроме того, в конце файла повторяется магическая строка PAR1 (в шестнадцатеричной форме 0x50 0x41 0x52 0x31), что позволяет системе убедиться в целостности файла и его корректности. [3]
Одним из ключевых преимуществ формата Parquet является его способность эффективно сжимать данные. Это достигается благодаря его колонковому формату хранения, который значительно улучшает результаты сжатия по сравнению с традиционными строковыми форматами.
Сжатие в Parquet значительно выигрывает за счёт колонкового хранения данных. Когда данные хранятся по колонкам, алгоритмы сжатия могут более эффективно работать, так как значения в одной колонке часто имеют одинаковые типы или даже одинаковые значения. Это позволяет использовать более компактные представления для повторяющихся значений. Например, если в колонке содержится много одинаковых значений (например, один и тот же номер в большинстве строк), сжимающий алгоритм может эффективно закодировать все эти значения, заменив их на короткие ссылки или индексы. [4]
Parquet поддерживает несколько популярных алгоритмов сжатия, что позволяет выбирать оптимальный в зависимости от требований к производительности и степени сжатия. Вот наиболее часто используемые алгоритмы сжатия:
- Snappy — это самый популярный алгоритм сжатия для Parquet. Он обеспечивает хороший баланс между скоростью сжатия и степенью сжатия, что делает его оптимальным выбором для большинства приложений, где важна высокая производительность при обработке данных.
- GZIP — алгоритм, обеспечивающий более высокую степень сжатия, но при этом требующий большего времени на сжатие и распаковку данных. Он полезен в случаях, когда необходимо уменьшить объём хранимых данных, но не критична скорость обработки.
- Brotli — алгоритм сжатия, который обеспечивает хорошее сжатие, но на более высоком уровне, чем GZIP. Он может использоваться для приложений, где важна не только степень сжатия, но и ускорение процесса передачи данных. Однако на распаковку данных этот алгоритм может требовать больше времени, чем Snappy.
- LZ4 — быстрый алгоритм сжатия, который идеально подходит для ситуаций, где необходима высокая скорость сжатия и распаковки. Хотя он не достигает такого уровня сжатия, как GZIP, он является отличным выбором для приложений с высокими требованиями к скорости.
- Zstandard (zstd) — это относительно новый алгоритм сжатия, который предлагается как более эффективная альтернатива GZIP и LZ4. Он обеспечивает высокую степень сжатия при минимальных затратах времени на сжатие и распаковку данных. Zstd используется для сценариев, когда важен баланс между высокой степенью сжатия и производительностью.
Так как Parquet данные делятся на страницы, и каждая страница может быть сжата отдельно, это даёт несколько важных преимуществ:
- Гибкость сжатия: каждая страница может использовать отдельный алгоритм сжатия в зависимости от типа данных, что повышает общую эффективность сжатия.
- Параллельная обработка: поскольку данные делятся на страницы, система может обрабатывать несколько страниц одновременно, что значительно ускоряет извлечение и обработку данных.
Сжатие в Parquet оказывает два ключевых воздействия на производительность:
- Уменьшение объёма данных: сжимаются данные, что снижает затраты на хранение и уменьшает нагрузки на систему ввода-вывода.
- Скорость обработки: несмотря на то, что сжатие требует дополнительных вычислительных ресурсов, правильный выбор алгоритма сжатия может ускорить операции чтения и записи. Сильно сжатые данные могут снизить нагрузку на диски и сети, а также ускорить передачу данных между системами.
В дополнение к сжатию данных, Parquet также использует методы кодирования, чтобы дополнительно уменьшить объём данных и улучшить производительность при обработке. В отличие от сжатия, которое работает на уровне всего файла или страниц, кодирование применяется к данным на уровне более мелких элементов, таких как значения в колонках. Это даёт дополнительное улучшение эффективности хранения данных, особенно для колонок с повторяющимися значениями или с числовыми последовательностями. [5]
В Parquet существует несколько методов кодирования данных, каждый из которых оптимизирован под конкретные типы данных и способы их использования. Рассмотрим наиболее популярные из них:
- Delta encoding (или кодирование разностей) — это метод, который сохраняет только разницу между соседними значениями, вместо хранения самих значений. Этот подход особенно эффективен для колонок, содержащих последовательности чисел, где изменения между соседними значениями минимальны (например, временные метки или счётчики). Используя delta encoding, можно значительно уменьшить объём данных, особенно если изменения между значениями небольшие.
- Dictionary encoding используется для колонок с ограниченным набором уникальных значений, таких как строки. Этот метод создаёт словарь всех уникальных значений и заменяет эти значения на индексы из словаря. Это позволяет уменьшить размер данных, так как повторяющиеся значения заменяются на более компактные ссылки, что приводит к экономии места. Особенно полезно для текстовых данных или категориальных переменных, где часто встречаются повторяющиеся значения.
- RLE. Кодирование с помощью длинных последовательностей (Run-Length Encoding, RLE) — это метод, который эффективно сжимает данные, если последовательности одинаковых значений встречаются подряд. Вместо того чтобы сохранять каждое значение отдельно, RLE сохраняет одно значение и количество его повторений. Этот метод подходит для колонок, где значения часто повторяются, например, булевы данные или категории с множеством одинаковых значений.
Преимущества кодирования в Parquet:
- Уменьшение объёма данных: Кодирование помогает уменьшить количество данных, требующих хранения. В частности, dictionary encoding и delta encoding позволяют значительно сократить размер файла, улучшая использование пространства.
- Ускорение выполнения запросов: Сжимаемые и эффективно кодируемые данные требуют меньших вычислительных ресурсов для обработки, что ускоряет выполнение аналитических запросов, особенно в распределённых системах.
- Оптимизация хранения для различных типов данных: Каждый метод кодирования оптимизирован под определённые структуры данных (например, числовые или строковые данные), что позволяет лучше использовать характеристики данных и повышать эффективность. [6]
Следующим важным аспектом для уменьшения объема хранимых данных и повышения производительности является оптимизация размера файлов и параллельная обработка данных. Эти два подхода тесно связаны и могут значительно ускорить работу с большими объемами данных, особенно в распределённых системах.
Для оптимальной работы с Parquet важно учитывать размер файлов. Рекомендуемый диапазон для размера файлов составляет от 128 MB до 1 GB. Это обеспечивает хороший баланс между временем чтения/записи и нагрузкой на систему.
Файлы слишком малого размера могут создавать лишнюю нагрузку на файловую систему, увеличивая накладные расходы, в то время как слишком большие файлы могут привести к неэффективному использованию памяти и задержкам при обработке данных.
Разбиение данных на логические блоки (например, по временным меткам или ключам) позволяет более эффективно управлять большими объёмами данных. Этот подход особенно полезен, если в вашей системе часто требуется обработка данных по датам или категориям.
В Parquet данные делятся на row groups, которые могут быть сжаты и обработаны отдельно. Рекомендуется, чтобы размер каждого row group находился в пределах 100 MB - 1 GB, чтобы обеспечить максимальную производительность. Излишне мелкие row groups могут увеличить накладные расходы при чтении данных, в то время как слишком большие — замедлить обработку.
Параллельная обработка данных — это ещё один ключевой момент для повышения производительности при работе с файлом Parquet. Это позволяет значительно ускорить выполнение таких операций, как извлечение, фильтрация или агрегация данных, за счёт распределения нагрузки на несколько узлов в кластере. [7]
Поскольку данные в Parquet делятся на row groups и страницы, каждый из которых может быть сжать и обработан независимо, система может одновременно обрабатывать несколько блоков данных. Это значительно ускоряет операции ввода-вывода, минимизируя время, необходимое для извлечения данных с диска.
В распределённых системах, таких как Apache Spark или Hadoop, можно параллельно обрабатывать данные, хранящиеся в формате Parquet, эффективно распределяя запросы между узлами кластера. Это увеличивает пропускную способность системы и снижает время отклика при обработке больших объёмов данных.
Результаты анализа
Анализ характеристик и методов оптимизации Parquet показал его значительные преимущества перед другими форматами хранения данных.
- Сравнение с традиционными форматами (CSV, JSON, Avro):
- Parquet существенно снижает объём хранимых данных по сравнению с CSV и JSON за счёт колонно-ориентированного хранения и встроенных алгоритмов сжатия.
- В сравнении с Avro, Parquet обеспечивает более эффективную выборку данных, особенно при работе с аналитическими запросами.
- Эффективность сжатия:
- Snappy показал оптимальный баланс между скоростью работы и степенью сжатия, что делает его наиболее часто используемым в аналитических системах.
- GZIP дал наибольший выигрыш в размере файлов, но увеличил время обработки данных.
- Zstd продемонстрировал компромисс между эффективностью сжатия и скоростью работы, что делает его предпочтительным для многих сценариев.
- Оптимизация хранения:
- Выбор оптимального размера Row Groups (128 MB - 1 GB) позволяет сбалансировать нагрузку на систему хранения и увеличить эффективность чтения.
- Кодирование данных (Dictionary Encoding, Delta Encoding) позволило дополнительно уменьшить объём хранимых данных без значительных потерь в производительности.
- Параллельная обработка:
- Разбиение данных на Row Groups позволило эффективно использовать вычислительные мощности распределённых систем, таких как Apache Spark и Hadoop.
- Анализ показал, что обработка данных в параллельном режиме сокращает время выполнения аналитических запросов в несколько раз по сравнению с последовательной обработкой.
Таким образом, применение Parquet в распределённых системах даёт значительные преимущества за счёт снижения объёма хранимых данных, повышения скорости чтения и эффективного использования вычислительных ресурсов.
Заключение
В заключение, формат данных Parquet представляет собой мощное средство для хранения и обработки больших объёмов данных в распределённых системах. Благодаря своей эффективной структуре, поддержке сжатия и кодирования, а также возможностям для оптимизации производительности, он позволяет значительно повысить скорость обработки данных и снизить затраты на хранение. Правильное использование методов оптимизации, таких как выбор размера файлов, разбиение на логические блоки и параллельная обработка, способствует ещё большему улучшению производительности. В результате, Parquet остаётся одним из самых популярных форматов для работы с большими данными в современных распределённых системах.
Список литературы:
- What Is Apache Parquet? / [Электронный ресурс] // dremio: [сайт]. — URL: https://www.dremio.com/resources/guides/intro-apache-parquet/ (дата обращения: 13.03.2025).
- A Deep Dive into Parquet / [Электронный ресурс] // srinimf: [сайт]. — URL: https://srinimf.com/2024/09/11/optimizing-parquet-file-distribution-in-spark-detailed-overview/ (дата обращения: 14.03.2025).
- What is the Parquet File Format / [Электронный ресурс] // up solver: [сайт]. — URL: https://www.upsolver.com/blog/apache-parquet-why-use (дата обращения: 15.03.2025).
- Compression algorithms in Parquet Java / [Электронный ресурс] // dev.to: [сайт]. — URL: (дата обращения: 26.03.2025).
- Encodings | Parquet / [Электронный ресурс] // apache: [сайт]. — URL: https://parquet.apache.org/docs/file-format/data-pages/encodings/ (дата обращения: 28.03.2025).
- Encodings in Apache Parquet / [Электронный ресурс] // waitingforcode: [сайт]. — URL: https://www.waitingforcode.com/apache-parquet/encodings-apache-parquet/read (дата обращения: 28.03.2025).
- Extreme IO performance with parallel Apache Parquet in Python / [Электронный ресурс] // wesmckinney: [сайт]. — URL: https://wesmckinney.com/blog/python-parquet-multithreading/ (дата обращения: 28.03.2025).