Любой, кто работает с «большими данными», знает об 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; однако стоит отметить, что оптимальный алгоритм сжатия может варьироваться в зависимости от вашего конкретного варианта использования. Для более глубокого понимания вы можете обратиться к официальной документации, которая обычно включает подробные тесты и сравнения каждого доступного алгоритма. Вот несколько надежных источников, которые могут оказаться полезными в вашем исследовании:
- http://mattmahoney.net/dc/text.html
- https://quixdb.github.io/squash-benchmark/
- https://stackoverflow.com/questions/37614410/comparison-between-lz4-vs-lz4-hc-vs-blosc-vs-snappy-vs-fastlz
- https://doordash.engineering/2019/01/02/speed-up-redis-with-compression/#:~:text=Compression%20speeds%20of%20LZ4%2C%20и быть%202x%20быстрее%20чем %20Snappy.
Раздел 3: Golang + паркет Apache
Есть две основные библиотеки, которые вы можете использовать для работы с файлами Parquet в Go:
- xitongsys/parquet-go (1к звезд на GitHub)
- segmentio/parquet-go (старт 319 на GitHub)
Хотя обе библиотеки эффективно выполняют одну и ту же задачу, лично я предпочитаю использовать 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.
Пожалуйста, дайте мне знать, если вы хотели бы видеть больше подобного контента, я открыт для предложений!
Спасибо за прочтение!