Spark GraphX 分布式图处理框架图算法详解

目录
  • 正文
  • Graphx图结构
  • 1. 最短路径
    • 示例数据
    • 可视化数据
    • 计算最短路径
  • 2. 网页排名
    • 数据可视化
    • pagerank算法测试
    • 算法结果
  • 3. 连通域(连通组件)
    • 加载图测试连通域
    • 生成图测试
    • 图实例的形态展示
    • 强连接域的计算
  • 4. 三角计数
    • 代码测试
    • 测试结果
  • 5. 标签传播算法(LPA)
    • 基本思想

正文

Spark GraphX是一个分布式图处理框架,基于 Pregel 接口实现了常用的图算法。

包括 PageRank、SVDPlusPlus、TriangleCount、 ConnectedComponents、LPA 等算法,以下通过具象化的图实例理解相应的算法用途。

Graphx图结构

Graphx中的Graph有两个RDD,一个是边RDD,一个是点RDD

此外,三元组其实就是(点、边,点)一个有效组合,由triplets()接口获取,triplets()返回的结果是EdgeTriplet[VD,ED]

1. 最短路径

最常见的路径搜索算法(例如DFS & BFS、最短路径、 最小生成树、随机游走等),最短路径是最容易理解的图算法,因为大家在生活中能够广泛接触到,如驾驶导航,外卖送餐路线等等。

路径搜索算法建立在图搜索算法的基础上,用来探索节点之间的路径。这些路径从一个节点开始,遍历关系,直到到达目的地,Graphx采用了最短路径算法Dijkstra的原理。

示例数据

// 输入一些边数据
val edgeSeq: Seq[(Int, Int)] = Seq((1, 2), (1, 5), (2, 3), (2, 5), (3, 4), (4, 5), (4, 6),(6, 9),(9, 11)).flatMap(e => Seq(e, e.swap))
val edges = op.sc.parallelize(edgeSeq).map { case (v1, v2) => (v1.toLong, v2.toLong) }

可视化数据

这是上述数据的图形表示(双向边,无权)

计算最短路径

val graph_sp = Graph.fromEdgeTuples(edges, 1)
val landmarks = Seq(1, 11).map(_.toLong)
val results = ShortestPaths.run(graph_sp, landmarks).vertices.collect.map {
  case (v, spMap) => (v, spMap.mapValues(i => i))
}

全部结果打印:

println(results.mkString)
(1,Map(1 -> 0, 11 -> 5))
(2,Map(1 -> 1, 11 -> 5))
(3,Map(1 -> 2, 11 -> 4))
(4,Map(1 -> 2, 11 -> 3))
(5,Map(1 -> 1, 11 -> 4))
(6,Map(11 -> 2, 1 -> 3))
(9,Map(11 -> 1, 1 -> 4))
(11,Map(11 -> 0, 1 -> 5))

上述计算了图中所有点到点1和点11的最短距离,(起点id,Map(目标1 -> 最短路径长度,目标2 -> 最短路径长度))。例如5,Map(1 -> 1, 11 -> 4)说明从5到1最短距离是1,5到11的最短距离是4。

2. 网页排名

PageRank度量一个图中每个顶点的重要程度,假定从u到v的一条边代表v的重要性标签。例如,一个微博用户被许多其它人粉,该用户排名很高。GraphX带有静态和动态PageRank的实现方法,这些方法在PageRank object中。静态的PageRank运行固定次数的迭代,而动态的PageRank一直运行,直到收敛。

GraphX有一个我们可以运行PageRank的社交网络数据集的简单数据。用户集在graphx/data/users.txt中,用户之间的关系在graphx/data/followers.txt中(Spark的源码或编译后文件里都包含)。

数据可视化

pagerank算法测试

先说PageRank动态实现,以下调用就是动态的,实际是调用runUntilConvergence()不能指定迭代次数。参数0.0001是个容忍度,是在对图进行迭代过程中退出迭代的条件,而静态的PageRank不可传递该参数,但可以指定迭代次数【固定次数,所以静态】。

val graph: Graph[Int, Int] = GraphLoader
      .edgeListFile(op.sc, "followers.txt", canonicalOrientation = true, numEdgePartitions = 1)
val ranks = graph.pageRank(0.0001).vertices.sortBy(_._2, ascending = false)
ranks.take(5).foreach(println(_))

算法结果

(7,1.8138212152810693)
(2,1.0692956678358136)
(4,0.8759124087591241)
(6,0.8759124087591241)
(1,0.6825291496824343)
# join name
(odersky,1.8138212152810693)
(ladygaga,1.0692956678358136)
(justinbieber,0.8759124087591241)
(matei_zaharia,0.8759124087591241)
(BarackObama,0.6825291496824343)

二元组左侧是顶点信息,右侧是重要程度,也就是分数越高排名越靠前。

这个结果有一些顺序跟直观感受不符,点7最重要毋庸置疑,点1的重要性应该是大于点4的,但是结果不是这样,那么数据集大一些会更好吗??

personalizedPageRank()方法还可以进行个性化推荐,比如社交网络中,给某用户再推荐一个人,或者对于用户商品的推荐中,用户商品两个实体可以形成一个图,我们就可以根据具体的某个用户来给他推荐一些商品。

3. 连通域(连通组件)

连通分量算法用其编号最小的顶点的 ID 标记图中的每个连通分量。例如,在社交网络中,连接的组件可以近似集群。

加载图测试连通域

这里的graph仍然是加载followers.txt数据,spark自带的有。

val cc: Graph[VertexId, Int] = graph.connectedComponents()
println("连通结果展示++++++++:")
cc.vertices.map(_.swap)
  .groupByKey()
  .map(_._2)
  .foreach(println)

结果展示(跟图形观察的结果是一致):

连通结果展示++++++++:
CompactBuffer(4, 1, 2)
CompactBuffer(6, 3, 7)

可以看到是2个域。结果图数据本身不是这样组织的,为了便于理解进行了聚合。原始数据collect回来是这样:

Array((4,1), (1,1), (6,3), (3,3), (7,3), (2,1))

元组左侧是顶点,右侧表示归属,这个结果符合预期。

生成图测试

val g = Graph(sc.makeRDD((1L to 7L).map((_,""))),
      sc.makeRDD(Array(Edge(2L,5L,""), Edge(5L,3L,""), Edge(3L,2L,""),
        Edge(4L,5L,""), Edge(6L,7L,""))))
    g.connectedComponents
      .vertices
      .map(_.swap)
      .groupByKey()
      .map(_._2)
      .foreach(println)

图实例的形态展示

这样的代码便于自行组织一套图数据,按自己意思进行修改,运行上述代码得到结果是:

CompactBuffer(1)
CompactBuffer(2, 3, 4, 5)
CompactBuffer(6, 7)

强连接网络就是:在这个网络中无论你从哪个顶点开始,其他所有顶点都是可达的。

强连接域的计算

g.stronglyConnectedComponents(3)
      .vertices.map(_.swap)
      .groupByKey()
      .map(_._2)
      .filter(_.size > 1)
      .foreach(println)

过滤掉那些单点的域,那么强连接的计算结果是CompactBuffer(2, 3, 5)

4. 三角计数

当一个顶点有两个相邻的顶点并且它们之间有一条边时,它就是三角形的一部分。需要注意的是,在计算社交网络数据集的三角形计数时,TriangleCount需要边的方向是规范的方向(srcId < dstId),并且图通过Graph.partitionBy分片过。

三角计数统计应用场景:大规模的社区发现,通过该算法可以做群体检测。只要是跟大规模小团体检测方面该算法都可以很好的支持,算法是找出拥有三角形环关系的最多的顶点。

Triangle Count的算法思想如下:

  • 计算每个结点的邻结点;
  • 对通过每条边的两个顶点相联的顶点的相邻点集合计算交集,并找出交集中id大于前两个结点id的结点;
  • 对每个结点统计Triangle总数,注意只统计符合计算方向的Triangle Count。

代码测试

val graph2 = graph.partitionBy(PartitionStrategy.RandomVertexCut)
// Find the triangle count for each vertex
val triCounts = graph2.triangleCount().vertices
println(triCounts.collect().mkString("\n"))

开头先对图graph进行了分片得到graph2。

测试结果

这个意思是6,3,7顶点分别拥有1个三角环,而其他顶点没有,实际上正是6,3,7组成了三角。

(4,0)
(1,0)
(6,1)
(3,1)
(7,1)
(2,0)

5. 标签传播算法(LPA)

Label Propagation,是一种基于图的半监督学习算法(Semi-supervised learning),应用场景为:社区发现(Community detection)。社区发现的过程就是一种聚类的过程。主要是用于团体检测,LPA能够以接近线性复杂度去检测一个大规模图中的团体结构,主要思想是给所有顶点中的密集连接组打上一个唯一标签,这些拥有相同标签的组就是所谓的团体。

它不保证收敛,且迭代次数足够多之后,所有联通节点最终收敛为一个社区。

该算法也可以用于半监督学习(大部分没有标签,小部分有标签),给那些没有标签的通过标签传播算法进行打标签。也可以应用于风控,对于通过已有风险评估的人,通过社交网络去评估跟其有关系的人的风险。

基本思想

标签传播算法的应用场景是不重叠社区发现,其基本思想是:将一个节点的邻居节点的标签中数量最多的标签作为该节点自身的标签。给每个节点添加标签(label)以代表它所属的社区,并通过标签的“传播”形成同一标签的“社区”结构。简而言之,你的邻居属于哪个label最多,你就属于哪个label。该算法的有点是收敛周期短,除了迭代次数无需任何先验参数(不需事先指定社区个数和大小),算法执行过程中不需要计算任何社区指标。

以上就是Spark GraphX 分布式图处理框架图算法详解的详细内容,更多关于Spark GraphX 图算法的资料请关注我们其它相关文章!

(0)

相关推荐

  • Docker-Compose搭建Spark集群的实现方法

    目录 一.前言 二.docker-compose.yml 三.启动集群 四.结合hdfs使用 一.前言 在前文中,我们使用Docker-Compose完成了hdfs集群的构建.本文将继续使用Docker-Compose,实现Spark集群的搭建. 二.docker-compose.yml 对于Spark集群,我们采用一个mater节点和两个worker节点进行构建.其中,所有的work节点均分配1一个core和 1GB的内存. Docker镜像选择了bitnami/spark的开源镜像,选择的s

  • 一文学会Hadoop与Spark等大数据框架知识

    目录 一个实际的需求场景:日志分析 Hadoop Hadoop的生态坏境 Spark Spark整体架构 Spark核心概念 Spark的核心组件 海量数据的存储问题很早就已经出现了,一些行业或者部门因为历史的积累,数据量也达到了一定的级别.很早以前,当一台电脑无法存储这么庞大的数据时,采用的解决方案是使用NFS(网络文件系统)将数据分开存储.但是这种方法无法充分利用多台计算机同时进行分析数据. 一个实际的需求场景:日志分析 日志分析是对日志中的每一个用户的流量进行汇总求和.对于一个日志文件,如

  • SparkGraphx计算指定节点的N度关系节点源码

    直接上代码: package horizon.graphx.util import java.security.InvalidParameterException import horizon.graphx.util.CollectionUtil.CollectionHelper import org.apache.spark.graphx._ import org.apache.spark.rdd.RDD import org.apache.spark.storage.StorageLevel

  • Spark GraphX 分布式图处理框架图算法详解

    目录 正文 Graphx图结构 1. 最短路径 示例数据 可视化数据 计算最短路径 2. 网页排名 数据可视化 pagerank算法测试 算法结果 3. 连通域(连通组件) 加载图测试连通域 生成图测试 图实例的形态展示 强连接域的计算 4. 三角计数 代码测试 测试结果 5. 标签传播算法(LPA) 基本思想 正文 Spark GraphX是一个分布式图处理框架,基于 Pregel 接口实现了常用的图算法. 包括 PageRank.SVDPlusPlus.TriangleCount. Conn

  • Hadoop 分布式存储系统 HDFS的实例详解

    HDFS是Hadoop Distribute File System 的简称,也就是Hadoop的一个分布式文件系统. 一.HDFS的优缺点 1.HDFS优点: a.高容错性 .数据保存多个副本 .数据丢的失后自动恢复 b.适合批处理 .移动计算而非移动数据 .数据位置暴露给计算框架 c.适合大数据处理 .GB.TB.甚至PB级的数据处理 .百万规模以上的文件数据 .10000+的节点 d.可构建在廉价的机器上 .通过多副本存储,提高可靠性 .提供了容错和恢复机制 2.HDFS缺点 a.低延迟数

  • Bootstrap carousel轮转图的使用实例详解

    图片轮播效果在Web中常常能看到,很多人也称之为幻灯片.其主要显示的效果就是多幅图片轮回播放,从右向左播放,鼠标悬停在图片时会暂停播放,如果鼠标悬停或单击右下角圆点时,会显示对应的图片. 这种图片轮播效果,在Bootstrap框架中是通过Carousel插件来实现 演示效果截图: 代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <!-- <link rel=&q

  • Hadoop-3.1.2完全分布式环境搭建过程图文详解(Windows 10)

    一.前言 Hadoop原理架构本人就不在此赘述了,可以自行百度,本文仅介绍Hadoop-3.1.2完全分布式环境搭建(本人使用三个虚拟机搭建). 首先,步骤: ① 准备安装包和工具: hadoop-3.1.2.tar.gz ◦ jdk-8u221-linux-x64.tar.gz(Linux环境下的JDK) ◦ CertOS-7-x86_64-DVD-1810.iso(CentOS镜像) ◦工具:WinSCP(用于上传文件到虚拟机),SecureCRTP ortable(用于操作虚拟机,可复制粘

  • spring整合Quartz框架过程详解

    这篇文章主要介绍了spring整合Quartz框架过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.Quartz框架简介 Quartz是一个完全由Java编写的开源任务调度的框架,通过触发器设置作业定时运行规则,控制作业的运行时间.其中quartz集群通过故障切换和负载平衡的功能,能给调度器带来高可用性和伸缩性.主要用来执行定时任务,如:定时发送信息.定时生成报表等等. Quartz框架的主要特点: · 强大的调度功能,例如丰富多样的

  • Java进程内缓存框架EhCache详解

    目录 一:目录 二: 简介 2.1.基本介绍 2.2.主要的特性 2.3. 集成 2.4. ehcache 和 redis 比较 三:事例 3.1.在pom.xml中引入依赖 3.2.在src/main/resources/创建一个配置文件 ehcache.xml 3.3.测试类 3.4.缓存配置 一:xml配置方式: 二:编程方式配置 3.5.Ehcache API 四:Spring整合 4.1.pom.xml 引入spring和ehcache 4.2.在src/main/resources添

  • Android 搜索框架使用详解

    目录 搜索框架简介 使用搜索框架实现搜索功能 可搜索配置 搜索页面 使用SearchView 使用搜索弹窗 搜索弹窗对Activity生命周期的影响 附加额外的参数 语音搜索 搜索记录 创建SearchRecentSuggestionsProvider 修改可搜索配置 在搜索页面中保存查询 清除搜索历史 示例 搜索框架简介 App中搜索功能是必不可少的,搜索功能可以帮助用户快速获取想要的信息.对此,Android提供了一个搜索框架,本文介绍如何通过搜索框架实现搜索功能. Android 搜索框架

  • Android车载多媒体开发MediaSession框架示例详解

    目录 一.多媒体应用架构 1.1 音视频传统应用架构 1.2 MediaSession 框架 媒体会话 媒体控制器 二.MediaSession 2.1 概述 2.2 MediaBrowser 2.2.1 MediaBrowser.ConnectionCallback 2.2.2 MediaBrowser.ItemCallback 2.2.3 MediaBrowser.MediaItem 2.2.4 MediaBrowser.SubscriptionCallback 2.3 MediaContr

  • Java集合框架LinkedList详解及实例

    Java集合框架LinkedList详解 LinkedList定义 package java.util; public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{ transient int size = 0; transient Node<E> first;

  • Android的搜索框架实例详解

    基础知识 Android的搜索框架将代您管理的搜索对话框,您不需要自己去开发一个搜索框,不需要担心要把搜索框放什么位置,也不需要担心搜索框影响您当前的界面.所有的这些工作都由SearchManager类来为您处理(以下简称"搜索管理器"),它管理的Android搜索对话框的整个生命周期,并执行您的应用程序将发送的搜索请求,返回相应的搜索关键字. 当用户执行一个搜索,搜索管理器将使用一个专门的Intent把搜索查询的关键字传给您在配置文件中配置的处理搜索结果的Activity.从本质上讲

随机推荐