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

Apache Arrow

Apache Arrow — это кроссплатформенный формат данных с открытым исходным кодом для организации колоночного (столбцового) хранения и обработки больших объёмов структурированных данных. Он предназначен для обеспечения высокой производительности при аналитической обработке, обмене данными между различными вычислительными системами и языками программирования без затрат на сериализацию и десериализацию. Arrow определяет стандартизированную спецификацию представления данных в оперативной памяти (in-memory), а также набор библиотек для работы с этим форматом на большинстве популярных языков программирования.

История

Разработка Apache Arrow была начата компанией Dremio в 2016 году. Проект быстро привлёк внимание сообщества разработчиков, работающих с большими данными, и в феврале 2016 года был передан в инкубатор Apache Software Foundation. Основной целью создания Arrow было устранение узкого места, связанного с необходимостью преобразования данных между различными форматами и системами при выполнении аналитических запросов. До появления Arrow каждый движок обработки данных (например, Apache Spark, Apache Drill, Pandas) использовал собственное внутреннее представление данных, что приводило к значительным накладным расходам при обмене информацией.

В октябре 2016 года Apache Arrow вышел из инкубатора и стал полноценным проектом верхнего уровня (Top-Level Project) фонда Apache. С момента релиза Arrow активно развивается, добавляя поддержку новых типов данных, улучшая производительность и расширяя экосистему. Ключевыми участниками проекта являются инженеры из компаний Dremio, InfluxData, Voltron Data, а также независимые разработчики.

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

Колоночное представление данных

Основой Apache Arrow является колоночный формат хранения данных. В отличие от строкового (row-oriented) формата, где все поля одной записи хранятся последовательно, в колоночном формате данные каждого столбца (поля) хранятся отдельным непрерывным массивом. Это обеспечивает несколько преимуществ:

  • Векторизация вычислений: процессор может эффективно обрабатывать данные, используя SIMD-инструкции (Single Instruction, Multiple Data), что даёт значительный прирост производительности при фильтрации, агрегации и других операциях.
  • Сжатие: данные одного типа, расположенные рядом, часто имеют высокую степень сжимаемости, что позволяет экономить оперативную память.
  • Эффективный доступ: при выполнении запроса, затрагивающего только несколько столбцов, считываются только соответствующие массивы, а не целые строки.

Формат памяти (Arrow Columnar Format)

Спецификация Arrow определяет строгий бинарный формат представления данных в памяти. Он включает в себя:

  • Массивы (Arrays): последовательность значений одного типа, хранящаяся в виде буфера (buffer). Для каждого массива может быть определён буфер битовой маски (bitmap), указывающий, является ли каждое значение нулевым (null).
  • Схема (Schema): метаданные, описывающие структуру данных: имена столбцов, их типы (целые числа, числа с плавающей точкой, строки, даты, временные метки, списки, структуры и т.д.), а также возможные метаданные.
  • Таблицы (Table): набор массивов, объединённых общей схемой. Таблица представляет собой неизменяемый (immutable) набор данных.
  • Пакет записей (RecordBatch): аналогичен таблице, но представляет собой изменяемый (mutable) набор данных, который может быть передан между процессами или сохранён.

Межпроцессное взаимодействие (IPC)

Arrow предоставляет механизм для эффективного обмена данными между процессами, работающими на одной машине, или между разными машинами по сети. Формат IPC (Inter-Process Communication) основан на плоских буферах (FlatBuffers) — библиотеке для эффективной сериализации. Данные передаются в виде последовательности сообщений, где каждое сообщение содержит метаданные (схему) и фактические данные в колоночном формате. Это позволяет избежать копирования данных при передаче между процессами на одной машине (zero-copy).

Формат файлов (Arrow IPC File Format)

Для долговременного хранения данных Arrow определяет собственный формат файлов, основанный на том же IPC-протоколе. Файл Arrow состоит из заголовка, содержащего схему, за которым следуют пакеты записей, и завершается трейлером, содержащим метаданные о расположении данных. Этот формат поддерживает произвольный доступ к отдельным пакетам записей.

Экосистема и интеграция

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

  • Библиотеки для языков программирования: Arrow предоставляет официальные библиотеки для C++, C#, Go, Java, JavaScript, MATLAB, Python, R, Ruby и Rust. Эти библиотеки реализуют спецификацию формата и предоставляют API для создания, чтения, записи и обработки данных.
  • Интеграция с системами обработки данных:
  • Apache Spark: использует Arrow для ускорения обмена данными между JVM и Python (PySpark), что значительно повышает производительность при работе с большими датасетами.
  • Pandas: библиотека pandas для Python поддерживает Arrow в качестве формата для хранения данных (тип ArrowDtype), что позволяет использовать преимущества колоночного формата и векторизации.
  • Apache Drill: использует Arrow для представления данных в памяти и выполнения запросов.
  • InfluxDB: версия 3.0 использует Arrow в качестве формата хранения данных.
  • DuckDB: встраиваемая аналитическая СУБД использует Arrow для взаимодействия с внешними системами и для внутреннего представления данных.
  • ClickHouse: поддерживает импорт и экспорт данных в формате Arrow.
  • Инструменты для работы с данными:
  • Arrow Flight: высокопроизводительный протокол обмена данными на основе gRPC, использующий Arrow для передачи данных. Позволяет передавать большие объёмы данных с высокой скоростью.
  • Arrow Flight SQL: расширение протокола Flight для выполнения SQL-запросов.
  • ADBC (Arrow Database Connectivity): API для доступа к базам данных, использующий Arrow для передачи данных, что обеспечивает более высокую производительность по сравнению с традиционными ODBC/JDBC.

Применение

Apache Arrow находит применение в широком спектре задач, связанных с обработкой данных:

  • Аналитика в реальном времени: благодаря высокой производительности и низкой задержке, Arrow используется в системах потоковой обработки и аналитики, где требуется быстрая обработка больших объёмов данных.
  • Научные вычисления: библиотеки для научных расчётов, такие как Pandas и R, используют Arrow для ускорения операций с данными.
  • Машинное обучение: фреймворки машинного обучения, такие как TensorFlow и PyTorch, могут использовать Arrow для загрузки и предобработки данных.
  • Обмен данными между микросервисами: Arrow позволяет эффективно передавать структурированные данные между микросервисами, работающими на разных языках программирования, без затрат на сериализацию.
  • Хранение данных в облачных хранилищах: формат файлов Arrow может использоваться для хранения аналитических данных в облачных объектных хранилищах (S3, GCS, Azure Blob Storage).

Критика и ограничения

Несмотря на широкое распространение, Apache Arrow имеет некоторые ограничения:

  • Потребление памяти: колоночный формат, как правило, требует больше оперативной памяти, чем строковые форматы, особенно при работе с небольшими наборами данных.
  • Сложность реализации: полная реализация спецификации Arrow, включая поддержку всех типов данных и оптимизаций, является нетривиальной задачей.
  • Отсутствие поддержки транзакций: Arrow не является системой управления базами данных и не поддерживает транзакции, ACID-свойства или индексы.
  • Зависимость от платформы: некоторые оптимизации, такие как использование SIMD-инструкций, зависят от архитектуры процессора.

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

  • Apache Arrow является одним из самых активных проектов фонда Apache по количеству коммитов и участников.
  • Формат Arrow используется в проектах, обрабатывающих петабайты данных в день.
  • Библиотека Arrow для C++ является одной из самых производительных реализаций колоночного формата.

Источники

  • Apache Arrow Official Documentation
  • Apache Arrow GitHub Repository
  • «Apache Arrow: A Cross-Language Development Platform for In-Memory Data» (Dremio Blog)
  • «In-Memory Analytics with Apache Arrow» (O'Reilly Media)
  • Документация Apache Spark, Pandas, DuckDB, ClickHouse

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

На главную BFOmetr →