Все сложно: Morpheus, Cypher и Apache Spark GraphX

Все сложно: Morpheus, Cypher и Apache Spark GraphX

    В рамках нашего нового курса по графовой аналитике больших данных в бизнес-приложениях, сегодня рассмотрим, как язык запросов Cypher должен был появиться в Apache Spark 3.0, зачем это нужно и почему до сих пор не реализовано. Краткая история проекта Morpheus, его связь с Neo4j, а также модулями Spark GraphX и GraphFrames.

    Что такое Morpheus и при чем здесь Apache Spark с Cypher

    Изначально язык запросов Cypher графовой NoSQL-СУБД Neo4j, не поддерживался в Apache Spark. Однако, в 2019 году, перед выпуском 3-й версии Спарк сообщество разработчиков проголосовало за включение Cypher для обработки графов в этот релиз вычислительного фреймворка. Это предполагало добавление Morpheus, модель графа свойств и графовые алгоритмы в набор инструментов анализа данных Spark.

    Morpheus – это историческое название решения для обработки графов в Спарк от Neo4j с помощью проекта Cypher. Изначально Morpheus работал как стороннее дополнение к экосистеме Apache Spark, а начиная с релиза 3.0 его планировали добавить к фреймворку. Некоторые идеи Morpheus получили воплощение в модулях Спарк GraphX и GraphFrames как реализация парадигмы Pregel, о чем мы писали здесь и здесь.

    Предполагалось, что Morpheus будет расширять Apache Spark с помощью языка запросов Cypher, который активно используется в графовой NoSQL-СУБД Neo4j для разработки и анализа графа свойств, где данные представлены помеченными вершинами ориентированного мультиграфа и отношениями между ними. По сути, Cypher выполняет роль SQL для графового анализа данных. Cypher для Apache Spark позволяет выполнять запросы Cypher к графам свойств в кластере Спарк аналогично как SQL позволяет запрашивать табличные данные.

    Еще в 2017 году разработчики Neo4j представили первый релиз Cypher для Apache Spark, который позволяет выполнять запросы Cypher в Spark и предоставляет программный API для работы с графами по типу Спарк-API. Далее эта идея продолжила развиваться в проекте Morpheus на базе Cypher, который преобразует обработанный граф свойств в датафреймы Spark, позволяя создавать конвейеры аналитики больших данных с графовыми алгоритмами.

    Morpheus основан на Spark SQL DataFrame API, предлагая интеграцию со стандартной обработкой Spark SQL и с GraphX. Начиная с версии 0.3.0, проект Morpheus перешел на Scala 2.12 и Spark 2.4. Но, поскольку только Spark 2.4.2 использует Scala 2.12 для своих предварительно созданных вспомогательных двоичных файлов, для использования Morpheus с более поздней версией Spark его необходимо собрать вручную.

    Однако, несмотря на практическую необходимость анализа данных с помощью графовых алгоритмов, сегодняшний статус проекта Morpheus вызывает вопросы. В частности, в официальной документации последний версий Apache Spark 3.0+ названия Morpheus и Cypher даже не упоминаются. Все описание графовых вычислений в Спарк сведено к GraphX Programming Guide, где подробно рассмотрена концепция графа свойств, Pregel API, а также графовые операторы и алгоритмы. А осенью 2021 года разработчики Cypher и Neo4j выпустили новую версию коннектора к Apache Spark, основными новинками которой стала доступность потоковой передачи Spark, как источника, так и приемника. Подробнее об этом мы недавно рассказывали в этой статье.

    Тем не менее, Morpheus и Cypher для Apache Spark не совсем забыты. На какой стадии сегодня находятся эти проекты и будут ли они полностью интегрированы в Спарк , мы рассмотрим далее.

    Проблемы графовых вычислений в GraphX и GraphFrames

    Напомним, сперва именно модуль GraphX ​​был одним из основных компонентов Спарк для графового анализа. Но он основан на структуре данных RDD, имеет достаточно низкоуровневый API и не использует оптимизатор запросов Catalyst. Кроме того, GraphX ​​доступен только пользователям Scala. Поэтому вместо GraphX сегодня все чаще используется модуль GraphFrames – пакет Спарк , который реализует графовые алгоритмы через структуру данных DataFrame, а также включает простое сопоставление с образцом графа с образцами фиксированной длины (motifs).

    Однако, GraphFrames имеет семантически слабую модель данных графа на основе нетипизированных ребер и вершин, а его возможность сопоставления с motifs-образцами очень ограничена по сравнению с языком Cypher. Кроме того, модель графа свойств отлично зарекомендовала себя во многих задачах анализа, а потому пользователи транзакционных графовых СУБД хотят работать с неизменяемыми графами в Спарк.

    Идея внедрения Morpheus в Спарк и состояла в том, чтобы определить тип графа свойств, совместимый с Cypher, на основе датафреймов, и заменить запросы GraphFrames на Cypher, а также переопределить алгоритмы GraphX​​/GraphFrames для типа PropertyGraph.

    Предполагалось, чтоб в 3-ей версии фреймворка для этого будет применяться базовое подмножество Cypher для Apache Spark (CAPS), повторно используя существующие проверенные конструкции и код. Этот графовый процессор запросов, как и CAPS, будет накладываться на механизм запросов Spark SQL с оптимизатором Catalyst и управлять им, используя планировщик графовых запросов CAPS.

    Однако, на текущий момент статус этого предложения по улучшению фреймворка Спарк до сих пор является открытым, с высоким приоритетом и отсутствием реализации. Впрочем, возможно в новых версиях этот SPIP будет реализован.

    Cypher Spark
    Статус внедрения Cypher в Apache Spark

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

    1. https://neo4j.com/blog/cypher-for-apache-spark/
    2. https://blog.knoldus.com/morpheus-cypher-for-spark/
    3. https://neo4j.com/blog/spark-developers-include-cypher-spark-3-0/
    4. https://github.com/opencypher/morpheus
    5. https://issues.apache.org/jira/browse/SPARK-25994