Учебное пособие по Spark GraphX ​​- аналитика графиков в Apache Spark



Этот блог с учебным пособием по GraphX ​​познакомит вас с Apache Spark GraphX, его функциями и компонентами, включая проект анализа полетных данных.

GraphX API Apache Spark для графов и параллельных вычислений с графами. GraphX ​​объединяет процессы ETL (извлечение, преобразование и загрузка), исследовательский анализ и итерационные вычисления графов в одной системе. Использование графиков можно увидеть в друзьях Facebook, контактах LinkedIn, маршрутизаторах Интернета, отношениях между галактиками и звездами в астрофизике и на Картах Google. Несмотря на то, что концепция вычисления графов кажется очень простой, применение графов буквально безгранично, с вариантами использования в обнаружении катастроф, банковском деле, фондовом рынке, банковских и географических системах и это лишь некоторые из них.Изучение использования этого API - важная часть .В этом блоге мы познакомимся с концепциями Spark GraphX, его функциями и компонентами на примерах и рассмотрим полный вариант использования аналитики полетных данных с использованием GraphX.

В этом блоге Spark GraphX ​​мы рассмотрим следующие темы:





  1. Что такое графики?
  2. Примеры использования графических вычислений
  3. Что такое Spark GraphX?
  4. Возможности Spark GraphX
  5. Понимание GraphX ​​с примерами
  6. Пример использования - Анализ полетных данных с использованием GraphX

Что такое графики?

График - это математическая структура, представляющая собой набор объектов, в котором некоторые пары объектов связаны в некотором смысле. Эти отношения можно представить с помощью ребер и вершин, образующих граф. Вершины представляют объекты, а края показывают различные отношения между этими объектами.

Концепции графов - Учебное пособие по Spark GraphX ​​- EdurekaРисунок: Учебное пособие по Spark GraphX ​​- вершины, ребра и тройки в графах



В информатике граф - это абстрактный тип данных, который предназначен для реализации концепций неориентированного графа и ориентированного графа из математики, в частности из области теории графов. Структура данных графа может также связывать с каждым ребром некоторые значение края , например, символическая метка или числовой атрибут (стоимость, емкость, длина,так далее.).

Примеры использования графических вычислений

Следующие ниже варианты использования дают представление о вычислениях графов и дальнейшие возможности для реализации других решений с использованием графов.

  1. Система обнаружения бедствий

    Графики можно использовать для обнаружения стихийных бедствий, таких как ураганы, землетрясения, цунами, лесные пожары и вулканы, чтобы предупреждать людей.



  2. Рейтинг страницы Page Rank может использоваться для поиска влиятельных лиц в любой сети, такой как сеть бумажного цитирования или сеть социальных сетей.
  3. Обнаружение финансового мошенничества

    Графический анализ может использоваться для отслеживания финансовых транзакций и выявления лиц, причастных к финансовому мошенничеству и отмыванию денег.

  4. Бизнес-анализ

    Графики, когда они используются вместе с машинным обучением, помогают понять тенденции покупок клиентов. Например. Uber, McDonald’s и т. Д.

  5. Географические информационные системы

    Графики интенсивно используются для разработки функций географических информационных систем, таких как определение границ водосборов и прогноз погоды.

  6. Google Pregel

    Pregel - это масштабируемая и отказоустойчивая платформа Google с API, который достаточно гибок, чтобы отображать произвольный график.алгоритмы.

Что такое Spark GraphX?

GraphX - Spark API для графов и параллельных вычислений с графами. Он включает в себя растущую коллекцию алгоритмов и построителей графов для упрощения задач анализа графов.


GraphX ​​расширяет Spark RDD с помощью гибкого распределенного графа свойств.
Граф свойств - это ориентированный мультиграф, который может иметь несколько параллельных ребер. С каждым ребром и вершиной связаны определенные пользователем свойства. Параллельные края позволяют несколькоотношения между одними и теми же вершинами.

Возможности Spark GraphX

Ниже перечислены особенности Spark GraphX:

  1. Гибкость :
    Spark GraphX ​​работает как с графиками, так и с вычислениями. GraphX ​​объединяет ETL (извлечение, преобразование и загрузка), исследовательский анализ и итерационные вычисления графов в единой системе. Мы можем просматривать одни и те же данные в виде графиков и коллекций, эффективно преобразовывать и объединять графы с помощью RDD и писать собственные алгоритмы итерационных графов с использованием Pregel API.
  2. Скорость :
    Spark GraphX ​​обеспечивает сопоставимую производительность с самыми быстрыми специализированными системами обработки графиков. Он сопоставим с самыми быстрыми графическими системами, сохраняя при этом гибкость, отказоустойчивость и простоту использования Spark.
  3. Библиотека алгоритмов роста :
    Мы можем выбирать из растущей библиотеки алгоритмов графов, которые может предложить Spark GraphX. Некоторые из популярных алгоритмов: ранжирование страниц, связанные компоненты, распространение меток, SVD ++, сильно связанные компоненты иколичество треугольников.

Понимание GraphX ​​с примерами

Теперь мы разберемся с концепциями Spark GraphX ​​на примере. Давайте рассмотрим простой график, как показано на изображении ниже.

Рисунок: Учебное пособие по Spark GraphX ​​- пример графика

Глядя на граф, мы можем извлечь информацию о людях (вершинах) и отношениях между ними (ребра). График здесь представляет пользователей Twitter и тех, на кого они подписаны в Twitter. Например, Боб следует за Дэвидом и Алисой в Twitter.

Давайте реализуем то же самое с помощью Apache Spark. Сначала мы импортируем необходимые классы для GraphX.

// Импорт необходимых классов import org.apache.spark._ import org.apache.spark.rdd.RDD import org.apache.spark.util.IntParam import org.apache.spark.graphx._ import org.apache.spark .graphx.util.GraphGenerators

Отображение вершин :Далее, мы теперь будем отображать все имена и возрасты пользователей (вершины).

val vertexRDD: RDD [(Long, (String, Int))] = sc.parallelize (vertexArray) val edgeRDD: RDD [Edge [Int]] = sc.parallelize (edgeArray) val graph: Graph [(String, Int), Int] = Graph (vertexRDD, edgeRDD) graph.vertices.filter {case (id, (name, age)) => age> 30} .collect.foreach {case (id, (name, age)) => println ( s '$ name is $ age')}

Вывод для приведенного выше кода выглядит следующим образом:

Дэвидявляется42 Franявляется50 Эдявляется55 Чарлиявляется65

Отображение краев : Давайте посмотрим, кто кому нравится в Twitter.

для (триплет<- graph.triplets.collect) { println(s'${triplet.srcAttr._1} likes ${triplet.dstAttr._1}') } 

Вывод для приведенного выше кода выглядит следующим образом:

БобнравитсяАлиса БобнравитсяДэвид ЧарлинравитсяБоб ЧарлинравитсяFran ДэвиднравитсяАлиса ЭднравитсяБоб ЭднравитсяЧарли ЭднравитсяFran

Теперь, когда мы поняли основы GraphX, давайте немного углубимся и выполним некоторые сложные вычисления на том же самом.

Количество подписчиков : У каждого пользователя в нашем графике разное количество подписчиков. Давайте посмотрим на всех подписчиков для каждого пользователя.

// Определение класса для более четкого моделирования свойства пользователя case class User (name: String, age: Int, inDeg: Int, outDeg: Int) // Создание пользователя Graph val initialUserGraph: Graph [User, Int] = graph. mapVertices {case (id, (name, age)) => User (name, age, 0, 0)} // Заполнение информации о степени val userGraph = initialUserGraph.outerJoinVertices (initialUserGraph.inDegrees) {case (id, u, inDegOpt) => Пользователь (u.name, u.age, inDegOpt.getOrElse (0), u.outDeg)} .outerJoinVertices (initialUserGraph.outDegrees) {case (id, u, outDegOpt) => Пользователь (u.name, u.age, u.inDeg, outDegOpt.getOrElse (0))} для ((идентификатор, свойство)<- userGraph.vertices.collect) { println(s'User $id is called ${property.name} and is liked by ${property.inDeg} people.') } 

Вывод для приведенного выше кода выглядит следующим образом:

Пользователь одинназываетсяАлисаи нравится2люди. Пользователь 2называетсяБоби нравится2люди. Пользователь 3называетсяЧарлии нравитсяодинлюди. Пользователь 4называетсяДэвиди нравитсяодинлюди. Пользователь 5называетсяЭди нравится0люди. Пользователь 6называетсяFranи нравится2люди.

Самые старые подписчики : Мы также можем отсортировать подписчиков по их характеристикам. Найдем самых старых подписчиков каждого пользователя по возрасту.

// Находим самого старого последователя для каждого пользователя val oldFollower: VertexRDD [(String, Int)] = userGraph.mapReduceTriplets [(String, Int)] (// Для каждого ребра отправляем сообщение в вершину назначения с атрибутом источника vertex edge => Iterator ((edge.dstId, (edge.srcAttr.name, edge.srcAttr.age))), // Чтобы объединить сообщения, возьмите сообщение для более старого последователя (a, b) => if (a. _2> b._2) а иначе б)

Вывод для приведенного выше кода выглядит следующим образом:

Дэвидсамый старый последовательАлиса. Чарлисамый старый последовательБоб. Эдсамый старый последовательЧарли. Бобсамый старый последовательДэвид. Эднет подписчиков. Чарлисамый старый последовательFran. 

Пример использования: анализ полетных данных с помощью Spark GraphX

Теперь, когда мы поняли основные концепции Spark GraphX, давайте решим реальную проблему с помощью GraphX. Это придаст нам уверенности в работе над любыми проектами Spark в будущем.

Постановка задачи : Для анализа данных полета в реальном времени с помощью Spark GraphX, предоставления результатов вычислений в режиме, близком к реальному времени, и визуализации результатов с помощью Google Data Studio.

Сценарий использования - необходимые вычисления :

  1. Вычислить общее количество маршрутов полета
  2. Вычисляйте и сортируйте самые длинные маршруты полетов
  3. Отобразить аэропорт с вершиной наивысшей степени
  4. Составьте список самых важных аэропортов согласно PageRank
  5. Составьте список маршрутов с самой низкой стоимостью перелета

Мы будем использовать Spark GraphX ​​для вышеуказанных вычислений и визуализировать результаты с помощью Google Data Studio.

Пример использования - набор данных :

Рисунок: Пример использования - набор данных о рейсах в США

Пример использования - блок-схема :

Следующая иллюстрация четко объясняет все этапы нашего анализа полетных данных.

Рисунок: Пример использования - блок-схема анализа полетных данных с использованием Spark GraphX

как использовать анаконду для Python

Пример использования - реализация Spark :

Забегая вперед, давайте теперь реализуем наш проект с помощью Eclipse IDE для Spark.

Найдите псевдокод ниже:

// Импорт необходимых классов import org.apache.spark._ ... import java.io.File object airport {def main (args: Array [String]) {// Создание Case Class Flight case class Flight (dofM: String, dofW: String, ..., dist: Int) // Определение функции Parse String для анализа ввода в класс Flight def parseFlight (str: String): Flight = {val line = str.split (',') Flight (строка (0), строка (1), ..., строка (16) .toInt)} val conf = new SparkConf (). setAppName ('airport'). setMaster ('local [2]') val sc = new SparkContext (conf) // Загружаем данные в RDD val textRDD = sc.textFile ('/ home / edureka / usecases / airport / airportdataset.csv') // Разбираем RDD строк CSV в RDD классов полета val flightRDD = Сопоставить ParseFlight с текстовым RDD // Создать RDD аэропортов с ID и именем val airport = Сопоставить Flight OriginID и Origin airport.take (1) // Определение вершины по умолчанию с именем nowhere и сопоставление идентификатора аэропорта для printlns val nowhere = 'nowhere' val airportMap = Использование функции карты .collect.toList.toMap // Создание маршрутов RDD с sourceID, destinationID и distance val routes = flightRDD. Использовать функцию карты .distinct routes.take (2) // Создание RDD ребер с sourceID, destinationID и расстоянием val edge = routes.map {(Map OriginID и DestinationID) => Edge (org_id.toLong, dest_id.toLong, distance)} Edge.take (1) // Определить граф и отобразить несколько вершин и ребер val graph = Graph (Аэропорты, края и нигде) graph.vertices.take (2) graph.edges.take (2) // Запрос 1 - Найти общее количество аэропортов val numairports = Число вершин // Запрос 2 - Рассчитать общее количество маршрутов? val numroutes = Number Of Edges // Запрос 3 - Рассчитайте те маршруты с расстояниями более 1000 миль graph.edges.filter {Получите расстояние до края) => distance> 1000} .take (3) // Аналогичным образом напишите код Scala для ниже запросы // Запрос 4 - Сортировка и печать самых длинных маршрутов // Запрос 5 - Отображение вершин наивысшей степени для входящих и исходящих рейсов аэропортов // Запрос 6 - Получить название аэропорта с идентификаторами 10397 и 12478 // Запрос 7 - Найти аэропорт с наибольшим количеством входящих рейсов // Запрос 8 - Найдите аэропорт с наибольшим количеством исходящих рейсов // Запрос 9 - Найдите наиболее важные аэропорты в соответствии с PageRank // Запрос 10 - Сортируйте аэропорты по рейтингу // Запрос 11 - Показать наибольшее количество важные аэропорты // Запрос 12 - Найдите маршруты с наименьшей стоимостью полета // Запрос 13 - Найдите аэропорты с наименьшей стоимостью полета // Запрос 14 - Показать коды аэропортов вместе с отсортированными наименьшими расходами на перелет

Пример использования - визуализация результатов :

Мы будем использовать Google Data Studio для визуализации нашего анализа. Google Data Studio - это продукт, входящий в пакет Google Analytics 360 Suite. Мы будем использовать сервис Geo Map для отображения аэропортов на их соответствующих местоположениях на карте США и отображения количества метрик.

  1. Отображение общего количества рейсов в аэропорту
  2. Отображение метрической суммы маршрутов назначения из каждого аэропорта
  3. Отображение общей задержки всех рейсов в аэропорту

На этом мы завершаем блог Spark GraphX. Надеюсь, вам понравилось читать и вы нашли его информативным. Не пропустите следующий блог из нашей серии Apache Spark на чтобы стать готовым к рынку в Apache Spark.

Мы рекомендуем следующие Обучение Apache Spark | Видео анализа полетных данных от Эдурека для начала:

Обучение Apache Spark | Анализ полетных данных Spark GraphX ​​| Эдурека

Есть вопрос к нам? Пожалуйста, укажите это в разделе комментариев, и мы свяжемся с вами в ближайшее время.

Если вы хотите изучить Spark и построить карьеру в области Spark, а также накопить опыт для крупномасштабной обработки данных с использованием RDD, Spark Streaming, SparkSQL, MLlib, GraphX ​​и Scala с примерами использования в реальной жизни, ознакомьтесь с нашими интерактивными, живыми -онлайн Вот, который поставляется с круглосуточной поддержкой, которая поможет вам на протяжении всего периода обучения.