Любой, кто работает с «большими данными», знает об Apache Parquet как о решении для хранения данных. Parquet обеспечивает производительность, масштабируемость и совместимость с различными платформами обработки, что делает его отличным выбором для конвейера ETL.

Этот пост имеет следующие разделы:

  • Раздел 1. Паркет Apache
  • Раздел 2. Сжатие паркета
  • Раздел 3: Golang + Apache Parquet
  • Раздел 4. Заключение

Раздел 1: Паркет Apache

Apache Parquet — это столбцовый формат хранения, который предлагает отличную альтернативу традиционным форматам хранения на основе строк, таким как CSV, TSV и RDBMS. Он предназначен для обеспечения производительности и масштабируемости, необходимых для конвейеров обработки больших данных.

Если вы не уверены, что влечет за собой «столбцовое хранилище», рассмотрите этот пример сценария упорядочения хот-догов, в котором сравниваются форматы хранения на основе строк и столбцов:

На основе строк (CSV):

order_id,order_date,customer_name,product,order_price,order_quantity
1,2023-01-01,Chad,hotdog,1.00,1
2,2023-01-01,Jane,hotdog,1.00,3
3,2023-01-01,Jane,dietcoke,.50,3

Столбчатый (Паркетный):

Примечание: Это упрощенный пример, фактический формат паркета гораздо сложнее.

<column order_id>
1
2
3

<column order_date>
2023-01-01
2023-01-01
2023-01-01

<column customer_name>
Chad
Jane
Jane

<column product>
hotdog
hotdog
dietcoke

<column order_price>
1.00
1.00
0.50

<column order_quantity>
1
3
3

Раздел 2: Сжатие паркета

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

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

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

LZO: алгоритм сжатия на основе Лемпеля-Зива (LZ), который использует кодирование длин серий (RLE) и кодирование Хаффмана для достижения высокой степени сжатия.

BROTLI: относительно новый алгоритм сжатия, разработанный Google. Он предназначен для достижения более высокой степени сжатия, чем gzip, при той же скорости или быстрее.

LZ4: очень быстрый алгоритм сжатия, разработанный для скорости. Это особенно полезно в приложениях, где высокоскоростная передача данных является приоритетом, таких как связь в реальном времени или приложения для работы с большими данными.

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

Лично я предпочитаю использовать сжатие SNAPPY при работе с данными Parquet; однако стоит отметить, что оптимальный алгоритм сжатия может варьироваться в зависимости от вашего конкретного варианта использования. Для более глубокого понимания вы можете обратиться к официальной документации, которая обычно включает подробные тесты и сравнения каждого доступного алгоритма. Вот несколько надежных источников, которые могут оказаться полезными в вашем исследовании:

Раздел 3: Golang + паркет Apache

Есть две основные библиотеки, которые вы можете использовать для работы с файлами Parquet в Go:

Хотя обе библиотеки эффективно выполняют одну и ту же задачу, лично я предпочитаю использовать xitongsys/parquet-go. Ради согласованности я буду использовать эту библиотеку до конца этого обсуждения. Тем не менее, стоит подчеркнуть, что любая библиотека представляет собой хороший выбор для работы с данными Parquet. Если ваши потребности более уникальны, чем то, что предлагают эти библиотеки, подумайте о том, чтобы сделать запрос на вытягивание или создать свою собственную версию.

Давайте начнем с изучения того, как записывать в файл паркета. Стоит отметить, что в этом примере мы используем теги структуры для определения схемы, а также сжатие Snappy. Важно помнить, что эти параметры полностью настраиваются при создании объекта записи паркета. Не стесняйтесь экспериментировать с различными конфигурациями, чтобы найти то, что лучше всего соответствует вашим потребностям.

Чтение файлов паркета в Go относительно просто, однако важно отметить, что любые изменения, внесенные в данные паркета, пока они находятся в памяти, не будут автоматически сохранены в исходный файл. Чтобы внести постоянные изменения, вам нужно будет записать новый паркетный файл или перезаписать исходный.

Примечание. В производственной среде возникновение проблем не должно немедленно приводить к ошибке panic(err). Вместо этого рекомендуется внедрить систему повторных попыток или резервного копирования в качестве резервного механизма в случае возникновения каких-либо проблем. Кроме того, рекомендуется отделить процесс ведения журнала от основной рабочей нагрузки приложения, используя горутины и каналы.

Раздел 4: Заключение

Apache Parquet предоставляет высокоэффективный формат хранения, который может ускорить конвейер ETL «больших данных». При работе с функциями writeParquet() и readParquet() из фрагментов кода доступно множество вариантов; например, вы можете читать и записывать непосредственно в облачную корзину, преобразовывать данные из CSV в Parquet, настраивать RowGroupSize или CompressionType файла паркета и многое другое.

Вам не нужно полагаться на создание функции readParquet(), чтобы увидеть содержимое вашего файла; ниже приведены некоторые параметры, доступные для просмотра и проверки файлов паркета:

  • Используйте этот инструмент командной строки от автора parquet-go для быстрой проверки файлов паркета из терминала.
  • Используйте Apache Hive для более традиционного представления базы данных. Вы можете использовать Hive, Impala и Spark для преобразования, преобразования и запроса паркетных таблиц.
  • Используйте плагин или расширение в вашей IDE. Я использую Avro and Parquet Viewer в GoLand или плагин Big Data Tools для DataGrip. Я не использую VSCode, но нашел этот репозиторий на GitHub.

Пожалуйста, дайте мне знать, если вы хотели бы видеть больше подобного контента, я открыт для предложений!

Спасибо за прочтение!