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

графовая аналитика больших данных курсы примеры обучение, курсы обучение Neo4j, обучение дата-аналитик, аналитик больших данных курсы, аналитика данных на графах, графовые алгоритмы на больших данных курсы примеры, обучение, Школа Больших Данных Учебный Центр Коммерсант

Дополняя наши курсы по аналитике больших данных в бизнес-приложениях новыми полезными примерами, сегодня рассмотрим, как 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
Ближайшая дата курса
в любое время
Продолжительность
24 ак.часов
Стоимость обучения
54 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
Ближайшая дата курса
в любое время
Продолжительность
16 ак.часов
Стоимость обучения
48 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