Spark + GraphX + Pregel
Spark+GraphX图
Q:什么是图?图的应用场景
A:图是由顶点集合(vertex)及顶点间的关系集合(边edge)组成的一种网状数据结构,表示为二元组:Gragh=(V,E),V\E分别是顶点和边的集合。图很好的表达了事物间的练习,常用于对事物之间的关系建模。常见应用场景有:在地图应用中寻找最短路径、社交网络关系、网页间超链接关系。
——————————————————————————————————————————
Q:有向图与无向图是什么?
A:图的顶点间的连系即边是有向的,有向<A,B>,<C,A>,源顶点到目标顶点的顺序是固定的,形成了顶点的出度和入度。
——————————————————————————————————————————
Q:有环图和无环图是什么?
A:有环图即包含一系列顶点链接的环路,即存在某一点出发还能回到自身。无环图即不存在一点从自身出发还可以回到自身。(有向图)
——————————————————————————————————————————
Q:什么是度
A:度即一个顶点所有便的数量,出度是有向图中从当前顶点指向其他顶点的边的数量,入度是有向图中从其他顶点指向当前顶点的边的数量。
——————————————————————————————————————————
Q:邻接矩阵是什么?
A:表示各顶点之间连接关系的矩阵,相连则为1,自连为2,不相连为0
——————————————————————————————————————————
一、GraphX的数据结构
提供分布式的图计算的API、
基于弹性分布式属性图(V+E)(被封装为RDD【】),统一了表视图与图视图
- Q:什么是弹性分布式属性图(Resilient Distributed Property Graph)
- A:顶点和边都带属性的有向多重图
———————————————————————————————————————————
1、数据结构
注:VD 和 ED 是类的泛型,不要混淆为RDD的存储类型
Graph[VD,ED]
class Graph[VD, ED] {
//基本结构
val vertices: VertexRDD[VD]
val edges: EdgeRDD[ED]
val triplets: RDD[EdgeTriplet[VD, ED]]
//额外信息
val numEdges: Long
val numVertices: Long
val inDegrees: VertexRDD[Int]
val outDegrees: VertexRDD[Int]
val degrees: VertexRDD[Int]}
VertexRDD[VD]
RDD[(VertexId,VD)]
//VertexId:Long的别名
//VD就是顶点数据结构类的泛型
EdgeRDD[ED]
RDD[Edge[ED]]
//Edge 样例类 (srcVid,dstVid,attr:ED)
//ED就是边的数据结构类的泛型
EdgeTriplet[VD,ED]
继承自Edge
是Edge + srcVertex+desVertex的三元组的RDD ,自动推断的
srcid,srcattr,dstid,dstattr,attr
Edge:
样例类case class(src:Long,des:Long,Edata:ED)
VertexId :Long的别名
import org.apache.spark.graphx.GraphLoader
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-graphx_2.11</artifactId>
<version>2.2.0</version>
</dependency>
二、图的操作
1、图的创建
- 图的创建遵循图的数据结构
//通过构造函数建立
import org.apache.spark.graphx._
val vertices:RDD[(VertexId,Int)]=sc.makeRDD(Seq((1L,1),(2L,2),(3L,3)))
val edges=sc.makeRDD(Seq(Edge(1L,2L,1),Edge(2L,3L,2)))
val graph=Graph(vertices,edges) //Graph[Int,Int] ?
//通过边文件建立
port org.apache.spark.graphx.GraphLoader
//加载边列表文件创建图,文件每行描述一条边,格式:srcId dstId。顶点与边的属性均为1
val graph = GraphLoader.edgeListFile(sc,"file:///opt/spark/data/graphx/followers.txt")
//得到的是一个边和点的属性都为Int:1的一个图
注:所有描述图的RDD内的类型都是泛型的类型,不是指图的结构类型。
2、图的修改
2.1 属性算子:Map
* 仅用于修改图中的顶点或边的属性数据,不能改变ID
* map返回值可以与旧值不一致
class Graph[VD, ED] {
//返回值是VD,说明会以返回值替换原Vert中的VD数据而不改变ID
def mapVertices[VD2](map: (VertexId, VD) =>VD2): Graph[VD2, ED]
//替换边的属性值
def mapEdges[ED2](map: Edge[ED] => ED2): Graph[VD, ED2]
//仅能改变边的属性值
def mapTriplets[ED2](map: EdgeTriplet[VD, ED] => ED2: Graph[VD, ED2] //Triplets不能修改顶点的泛型
}
//图的map方法返回的是一个有新的泛型类的Graph
demo实例
val t1_graph = tweeter_graph.mapVertices { case(vertextId, (name, age)) => (vertextId, name) }
val t2_graph = tweeter_graph.mapVertices { (vertextId, attr) => (vertextId, attr._1) }
val t3_graph = tweeter_graph.mapEdges(e => Edge(e.srcId, e.dstId, e.attr*7.0))
2.2 结构算子
class Graph[VD, ED] {
def reverse: Graph[VD, ED] //改变边的方向,调换srcid和dstid
def subgraph(epred: EdgeTriplet[VD,ED] => Boolean,
vpred: (VertexId, VD) => Boolean): Graph[VD, ED]
} //epred 边的条件可省略,孤立点会被过滤
2.3 Join算子
- 柯里化函数
- map返回值类型与原VD一直
//按id相等与否join
class Graph[VD, ED] {
//等值id的join,用结合了新节点的VD来替换旧的VD
//是个柯里化函数
//返回值必须与主图的VD一致
def joinVertices[U](table: RDD[(VertexId, U)])(map: (VertexId, VD, U) => VD): Graph[VD, ED]
//不等的id的属性会被补null
def outerJoinVertices[U, VD2](table: RDD[(VertexId, U)])(map: (VertexId, VD, Option[U]) => VD2)
: Graph[VD2, ED]
}
demo实例
val tweeters_comps:RDD[(VertexId,String)]= sc.parallelize(Array((1L, "kgc.cn"), (2L, "berkeley.edu"), (3L, "apache.org")))
val t_graph = tweeter_graph.joinVertices(tweeters_comps)((id, v, cmpy) => (v._1 + " @ " + cmpy, v._2))
t_graph.vertices.collect
val s_graph = tweeter_graph.outerJoinVertices(tweeters_comps)((id, v, cmpy) => (v._1 + " @ " + cmpy, v._2))
s_graph.vertices.collect
三、图的应用算法
1、PageRank(PR)算法
用于评估网页链接的质量和数量,以确定该网页的重要性和权威性的相对分数,范围为0到10 从本质上讲,PageRank是找出图中顶点(网页链接)的重要性 1GraphX提供了PageRank API用于计算图的PageRank
class Graph[VD, ED] {
def pageRank(tol: Double, resetProb: Double = 0.15): Graph[Double, Double]
}
val ranks = graph.pageRank(0.0001)
ranks.vertices.sortBy(_._2, false).collect
//res43: Array[(org.apache.spark.graphx.VertexId, Double)] = Array((1,1.7924127957615184), (6,0.9969646507526427), (2,0.9969646507526427), (4,0.9688717814927127), (3,0.6996243163176441), (5,0.5451618049228395))
2、Pregel算法
Pregel是Google提出的用于大规模分布式图计算框架
- 图遍历(BFS)
- 单源最短路径(SSSP)
- PageRank计算
Pregel的计算由一系列迭代组成,称为supersteps
Pregel迭代过程
- 每个顶点从上一个superstep接收入站消息
- 计算顶点新的属性值
- 在下一个superstep中向相邻的顶点发送消息
- 当没有剩余消息时,迭代结束
数据结构:
- initialMsg:在“superstep 0”之前发送至顶点的初始消息
- maxIterations:将要执行的最大迭代次数
- activeDirection:发送消息方向(默认是出边方向:EdgeDirection.Out)
- vprog:用户定义函数,用于顶点接收消息
- sendMsg:用户定义的函数,用于确定下一个迭代发送的消息及发往何处
- mergeMsg:用户定义的函数,在vprog前,合并到达顶点的多个消息
class Graph[VD, ED] {
def pregel[A](initialMsg: A, maxIterations: Int, activeDirection: EdgeDirection)(
//根据jmessage决定如何更新自己的VD【value,originValue】
vprog: (VertexID, VD, A) => VD,
/**
*根据每个节点关联的三元组情况,决定要不要发送信息,以及发送什么信息到哪个节点
*返回的是信息发送目标节点ID和信息message的二元组的迭代器
*/
sendMsg: EdgeTriplet[VD, ED] => Iterator[(VertexID,A)],
//迭代归并多个来源的信息,多个变一个
mergeMsg: (A, A) => A
): Graph[VD, ED] //最终返回的是一个 结构不变、值改变 的新图
}
Spark + GraphX + Pregel的更多相关文章
- 大数据技术之_19_Spark学习_05_Spark GraphX 应用解析 + Spark GraphX 概述、解析 + 计算模式 + Pregel API + 图算法参考代码 + PageRank 实例
第1章 Spark GraphX 概述1.1 什么是 Spark GraphX1.2 弹性分布式属性图1.3 运行图计算程序第2章 Spark GraphX 解析2.1 存储模式2.1.1 图存储模式 ...
- 明风:分布式图计算的平台Spark GraphX 在淘宝的实践
快刀初试:Spark GraphX在淘宝的实践 作者:明风 (本文由团队中梧苇和我一起撰写,并由团队中的林岳,岩岫,世仪等多人Review,发表于程序员的8月刊,由于篇幅原因,略作删减,本文为完整版) ...
- Spark Graphx编程指南
问题导读1.GraphX提供了几种方式从RDD或者磁盘上的顶点和边集合构造图?2.PageRank算法在图中发挥什么作用?3.三角形计数算法的作用是什么?Spark中文手册-编程指南Spark之一个快 ...
- Spark Graphx
Graphx 概述 Spark GraphX是一个分布式图处理框架,它是基于Spark平台提供对图计算和图挖掘简洁易用的而丰富的接口,极大的方便了对分布式图处理的需求. ...
- Spark GraphX图处理编程实例
所构建的图如下: Scala程序代码如下: import org.apache.spark._ import org.apache.spark.graphx._ // To make some of ...
- 基于Spark GraphX计算二度关系
关系计算问题描述 二度关系是指用户与用户通过关注者为桥梁发现到的关注者之间的关系.目前微博通过二度关系实现了潜在用户的推荐.用户的一度关系包含了关注.好友两种类型,二度关系则得到关注的关注.关注的好友 ...
- Spark GraphX宝刀出鞘,图文并茂研习图计算秘笈与熟练的掌握Scala语言【大数据Spark实战高手之路】
Spark GraphX宝刀出鞘,图文并茂研习图计算秘笈 大数据的概念与应用,正随着智能手机.平板电脑的快速流行而日渐普及,大数据中图的并行化处理一直是一个非常热门的话题.图计算正在被广泛地应用于社交 ...
- Spark GraphX图计算简单案例【代码实现,源码分析】
一.简介 参考:https://www.cnblogs.com/yszd/p/10186556.html 二.代码实现 package big.data.analyse.graphx import o ...
- 2. Spark GraphX解析
2.1 存储模式 2.1.1 图存储模式 巨型图的存储总体上有边分割和点分割两种存储方式 1)边分割(Edge-Cut):每个顶点都存储一次,但有的边会被打断分到两台机器上.这样做的好处是节省存储空间 ...
随机推荐
- BPF CO-RE 示例代码解析
BPF CO-RE 示例代码解析 在BPF的可移植性和CO-RE一文的末尾提到了一个名为runqslower的工具,该工具用于展示在CPU run队列中停留的时间大于某一值的任务.现在以该工具来展示如 ...
- Java排序算法(三)直接插入排序
一.测试类SortTest import java.util.Arrays; public class SortTest { private static final int L = 20; publ ...
- 二进制方法-部署k8s集群部署1.18版本
二进制方法-部署k8s集群部署1.18版本 1. 前置知识点 1.1 生产环境可部署kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式 kuberadm Kubea ...
- 洛谷P5496 回文自动机【PAM】模板
回文自动机模板 1.一个串的本质不同的回文串数量是\(O(n)\)级别的 2.回文自动机的状态数不超过串长,且状态数等于本质不同的回文串数量,除了奇偶两个根节点 3.如何统计所有回文串的数量,类似后缀 ...
- Codeforces Round #695 (Div. 2) C. Three Bags (贪心,思维)
题意:有三个背包,每个背包里都用一些数字,你可以选择某一个背包的数字\(a\),从另外一个背包拿出\(b\)(拿出之后就没有了),然后将\(a\)替换为\(a-b\),你可以进行任意次这样的操作,使得 ...
- KMP——POJ-3461 Oulipo && POJ-2752 Seek the Name, Seek the Fame && POJ-2406 Power Strings && POJ—1961 Period
首先先讲一下KMP算法作用: KMP就是来求在给出的一串字符(我们把它放在str字符数组里面)中求另外一个比str数组短的字符数组(我们叫它为ptr)在str中的出现位置或者是次数 这个出现的次数是可 ...
- UVA442 矩阵链乘 Matrix Chain Multiplication
题意: 这道题也是在不改变原序列每个元素位置的前提下,看每个元素与他身边的两个元素那个先结合能得到最大的能量 题解: 很明显这是一道区间dp的题目,这道题要断环成链,这道题需要考虑在这个区间上某个元素 ...
- fzu2218 Simple String Problem
Accept: 2 Submit: 16 Time Limit: 2000 mSec Memory Limit : 32768 KB Problem Description Recent ...
- hdu2546 饭卡
Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负) ...
- Codeforces Educational Rounds 85 A~C
A:Level Statistics 题意:统计n个游戏数据,p代表游玩次数,c代表通关次数,每次游玩都不一定通关,求这些数据是否合法 题解:1.游玩次数不能小于通关次数 2.游玩次数和通关次数必 ...