Еще больше и быстрее: извлечение данных из Neo4j с Apache Arrow

Автор Категория ,
Еще больше и быстрее: извлечение данных из Neo4j с Apache Arrow

Дополняя наши курсы по аналитике больших данных в бизнес-приложениях новыми полезными примерами, сегодня рассмотрим, как Apache Arrow помогает повысить производительность извлечения данных из Neo4j с помощью их колоночного представления и обработки в памяти, а не на диске. Чем neo4j-arrow лучше драйверов Java и Python, а также собственной Neo4j библиотеки Graph Data Science.

Что такое Apache Arrow и зачем это в Neo4j

Хотя у Neo4j есть библиотека Graph Data Science, о чем мы писали здесь, которая поддерживает несколько графических алгоритмов и рабочие процессы машинного обучения, иногда этого недостаточно. Например, нужно экспортировать данные из Neo4j и анализировать их с помощью комплексных платформ машинного обучения типа PyTorch или TensorFlow. Необходим способ экспортировать данные из Neo4j быстрым и масштабируемым способом, но использование драйвера Neo4j Python – не самый эффективный вариант. Альтернативой является проект Neo4j-Arrow, позволяющий извлечь данные из Neo4j через высокопроизводительные API-интерфейсы Arrow Flight с помощью запросов Cypher или из графов в памяти библиотеки Graph Data Science [1].

Напомним, Apache Arrow – это не зависящая от языка программная среда для разработки приложений анализа данных в колоночных форматах. Apache Arrow определяет колоночный формат памяти для плоских и иерархических данных, организованный для эффективных аналитических операций на современных ЦП и графических CPU. Формат памяти Arrow также поддерживает чтение с нулевым копированием для молниеносного доступа к данным без накладных расходов на сериализацию. Это уменьшает или устраняет факторы, ограничивающие возможности работы с большими наборами данных, такие как стоимость, непостоянство или физические ограничения динамической памяти с произвольным доступом.

Библиотеки Arrow реализуют колоночный формат и предоставляют стандартные блоки для различных вариантов использования, включая высокопроизводительную аналитику. Arrow подходит для эффективной доставки колоночных данных или в качестве основы для аналитических движков. Arrow можно использовать с Apache Parquet, Apache Spark, NumPy, PySpark, pandas и другими библиотеками обработки данных. Проект включает собственные программные библиотеки на C, C++, C#, Go, Java, JavaScript, Julia, MATLAB, Python, R, Ruby и Rust, что обеспечивает быстрый доступ к данным и обмен ими без дополнительных затрат на сериализацию между этими языками. Arrow разработан как дополнение к популярным колоночным форматам Apache Parquet и ORC. Однако, в отличие от них, Arrow хранит данные не на диске, а в памяти. Для обмена данными между Arrow и Parquet есть библиотеки, входящие в состав этих проектов [2]. Как использовать преимущества Apache Arrow для Neo4j, мы рассмотрим далее.

Под капотом neo4j-arrow

Прежде чем перейти к практическому примеру извлечения данных из Neo4j с помощью Apache Arrow, заглянем под капот плагина, который объединяет эти две Big Data технологии. Проект выходит за рамки традиционных способов интеграции с Neo4j, предоставляя возможность работы с проекцией графа Graph Data Science в памяти, с помощью высокопроизводительных API-интерфейсов Arrow Flight для потоковой передачи узлов, отношений и их свойств.

Python-плагин neo4j-arrow использует инфраструктуру RPC Arrow Flight для предоставления операций чтения/записи в Neo4j. Хотя можно реализовать протокол самостоятельно, используя реализацию клиента Arrow/Arrow Flight на любом языке, готовая оболочка с PyArrow предоставляется в python/neo4j_arrow.py. Плагин обеспечивает перенос данных из Neo4j в 20 раз быстрее, чем Java-драйвер этой графовой СУБД и в 450 раз быстрее ее Python-драйвера.

Плагин позволяет упростить миграцию графовых проекций Graph Data Science в реальном времени, перемещая миллионы узлов, взаимосвязей и векторов объектов между активными экземплярами Neo4j в разных регионах Google Cloud Platform и BigQuery менее за считанные минуты.

По умолчанию плагин neo4j-arrow должен работать из коробки с Neo4j 4.3 и библиотекой Graph Data Science 1.7. Для более ранних версий необходимо скомпилировать собственные JAR-файлы из исходного кода. Для этого нужен дистрибутив JDK 11 и доступ к общедоступному репозиторию Maven. Следует запустить $./gradlew plugin:shadowJar, чтобы получить JAR-файл плагина в ./plugin/build/libs/, который можно добавить в Neo4j. Для клиента neo4j_arrow.py PyArrow требуется Python 3 и PyArrow 6.0.0. Другие клиенты Arrow Flight должны использовать версию 6.0.0.

Вся конфигурация для neo4j-arrow выполняется через переменные окружения, а поддержка на основе свойств пока не реализована.

Общая последовательность действий по извлечению данных из Neo4j с помощью плагина Arrow выглядит так:

  • создать клиента Arrow с данными аутентификации для системы Neo4j, при необходимости используя TLS;
  • отправить в службу задание neo4j-arrow. Поддерживаются Cypher-задания на чтение (cypher.read), задания чтения Graph Data Science (gds.read) с возможностью указания узлов или отношений и задания записи GDS (gds.write.nodes и gds.write.relationships) для создания графов GDS из векторов/таблиц Arrow. Также возможны KHop-задания, поддержка массового импорта базы данных Neo4j (import.bulk), отчет о статусе работы (job.status), проверка версии сервера (info.version) и общесистемная проверка статуса задания (info.jobs).
  • взять билет (ticket), возвращенный сервером для задания, и запросить читаемый поток или отправить поток с помощью put-операции.

Важно, что все нюансы заданий, тикетов и прочие особенности разрешаются автоматически при использовании предоставленной оболочки Python [3].

Графовые алгоритмы. Бизнес-приложения

Код курса
GRAF
Ближайшая дата курса
25 июля, 2022
Длительность обучения
24 ак.часов
Стоимость обучения
60 000 руб.

Особенности использования

Основными регуляторами, доступными для настройки производительности чтения или записи, являются значения ARROW_BATCH_SIZE и ARROW_MAX_PARTITIONS. Учитывая, что номер раздела по умолчанию равен количеству ядер центрального процессора, на практике это означает настройку размера пакета. Задания на чтение данных обычно работают лучше с меньшими размерами пакетов, например, по умолчанию. А запись, наоборот, эффективнее на гораздо больших (в 150-200 раз, чем по умолчанию) значениях настроечных параметров.

На практике истинная производительность будет зависеть от типа создаваемых векторов. Скаляры обычно превосходят векторы на основе списка из-за общего размера буфера и команд процессора для чтения или записи значения.

Некоторые задания позволяют динамически переопределять размер раздела и пакета, добавляя дополнительные параметры в сообщение о задании. Пока это зависит от версии neo4j_arrow.py, поэтому для практического использования нужно смотреть код этой Python-оболочки, чтобы увидеть доступные возможности.

Плагин neo4j-arrow свободно доступен на Github и распространяется по лицензии Apache 2.0. Пока проект находится в стадии разработки, поэтому в нем присутствуют некоторые недостатки [3]:

  • невозможно записать свойства отношений в граф Graph Data Science (GDS) и считать из него свойства строки (не считая меток или типов отношений). GDS изначально не поддерживает строки и их считывание из БД. Это может быть реализовано, но может замедлить потоковую передачу.
  • Для Cypher-заданий поддерживаются только базовые типы Cypher (скаляры, строки и простые списки скаляров);
  • обработка ошибок и очистка для неудачных/незавершенных заданий требует доработки;
  • размеры пакетов не выбираются динамически на основе схемы и аппаратного обеспечения хоста, нужна ручная настройка;
  • невозможно выполнить запись в базу данных с помощью заданий Cypher – нужны более сложные задания транзакций;
  • задания записи GDS сообщают клиенту о завершении до завершения обработки на стороне сервера. Поэтому клиент может начать записывать отношения, пока узлы все еще обрабатываются, что приводит к ошибке «Граф не найден» (graph not found).

Тем не менее, несмотря на отмеченные недостатки, плагин полезен аналитикам данных и специалистам Data Science, позволяя эффективно извлекать данные из Neo4j, чтобы совместить графовую аналитику с мощными технологиями конвейеров машинного обучения. Примеры таких вариантов использования показаны в источнике [1]. Как использовать Apache Arrow для ускорения Spark-приложений, читайте в нашей новой статье.

Графовые алгоритмы в Apache Spark

Код курса
GRAS
Ближайшая дата курса
20 июня, 2022
Длительность обучения
16 ак.часов
Стоимость обучения
40 000 руб.

Узнайте больше подробностей про использование Neo4j и Cypher для графовой аналитики больших данных в бизнес-приложениях на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков больших данных в Москве:

Источники

  1. https://towardsdatascience.com/optimize-fetching-data-from-neo4j-with-apache-arrow-d9d282c8458d
  2. https://arrow.apache.org/
  3. https://github.com/neo4j-field/neo4j-arrow