Все сложно: 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