Дополняя наши курсы по аналитике больших данных в бизнес-приложениях новыми полезными примерами, сегодня рассмотрим, как 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’ов и аналитиков больших данных в Москве:
Источники