教程目录

  • 0x00 教程内容
  • 0x01 Spark GraphX 介绍
    • 1. GraphX 介绍
    • 2. GraphX 的使用场景
  • 0x02 GraphX 重要概念与实操
    • 1. 属性图
    • 2. 多种方式理解GraphX
    • 3. 属性图编程示例
  • 0xFF 总结

0x00 教程内容

  1. Spark GraphX 理论
  2. GraphX 重要概念与实操

0x01 Spark GraphX 介绍

1. GraphX 介绍

GraphX 是 Spark 四大核心组件之一,它也是使用 Spark 作为计算引擎的,GraphX 是用于图形和图形并行计算的组件,实现了大规模图计算的功能。GraphX 的出现使 Spark 生态系统变得更加完善和丰富,同时它能够与 Spark 生态系统的其它组件天然融合,再加上它强大的图数据处理能力,在工业届得到了广泛的运用。

在高层次上,GraphX 通过引入一个新的图形抽象来扩展 Spark RDD :即顶点带有特性的有向多重图。GraphX 提供了一些基本运算符以及优化了的 Pregel API。 此外,GraphX 提供了大量的图算法和构建器,以简化图形分析任务。


GraphX 有两个RDD, 一个是点RDD,一个是边RDD。
Vertex:表示顶点,每个顶点都会有一个唯一标识以及这个顶点的属性 。
Edge:表示有向边,由一个源顶点id,一个目标顶点id以及这条边的属性组成 。

这些关系,都可以转化为相应的表来描述。

2. GraphX 的使用场景

在社交网络中,比如:Twitter、Facebook、微博、微信等,人与人之间存在着很多的关系链。这些地方产生的数据更加适合使用图处理来进行计算。图的分布式或者并行处理其实是把图拆分成很多个子图,然后分别对这些子图进行计算,计算的时候可以分别迭代进行分阶段的计算,即对图进行并行计算。

0x02 GraphX 重要概念与实操

1. 属性图

属性图是一个有向多重图,它的每个顶点和每条都附有用户定义的对象。作为有向图,有向多重图可能有多个平行的边来共享相同的源顶点目标顶点。作为多重图,它支持并行边,这个特性简化了许多涉及多重关系的建模场景。每个顶点的主键是一个长度为64 bit的唯一标识符(VertexID)。GraphX没有为顶点添加任何顺序的约束。类似地,每一条边有对应的源顶点目标顶点的标识符。

因此,属性图的参数是通过顶点(VD)和边的类型(ED)来决定的。

在某些情况下,你可能希望在同一个图里面,顶点能够有不同的属性类型。这个想法可以通过继承实现。举个例子,我们可以对用户产品进行建模,将其作为一个二分图,然后进行如下的定义:

class VertexProperty()
case class UserProperty(val name: String) extends VertexProperty
case class ProductProperty(val name: String, val price: Double) extends VertexProperty
// 图可能会有这个类型
var graph: Graph[VertexProperty, String] = null

类似于 RDD,属性图是不可变的分布式的,并且具有容错性。对于图而言,它的值或者结构上的改变,是通过产生带有预期改变的新图来完成的。主要注意的是,原始图的主要部分(即不受影响的结构、属性和索引等)在新图中被重用,以减少固有功能的数据结构成本。通过使用大量的启发式顶点分区,图在不同的执行器里被划分。就像 RDD 一样,图的每个分区可以在发生故障时被不同的机器重建。

属性图在逻辑上对应于一对类型化集合(RDD),该集合编码了每个顶点和每条边属性。因而,图类包含了可以访问图的顶点边的成员,它的定义如下:

class Graph[VD, ED] {val vertices: VertexRDD[VD]val edges: EdgeRDD[ED]
}

VertexRDD[VD]类和EdgeRDD[ED]类分别继承和优化了RDD[(VertexID, VD)]类和RDD[Edge[ED]]类。两者都提供基于图计算和内部优化构建的额外功能。在此你可将其简单地理解为以RDD[(VertexID, VD)]RDD[Edge[ED]]形式定义的 RDD。

2. 多种方式理解GraphX

a. EdgeTriplet表示

val facts: RDD[String] = graph.triplets.map(triplet => triplet.srcAttr._1 + " is the " + triplet.attr + " of " + triplet.dstAttr._1)

b. SQL表示triplet表示

SELECT src.id, dst.id, src.attr, e.attr, dst.attr
FROM edges AS e LEFT JOIN vertices AS src, vertices AS dst
ON e.srcId = src.Id AND e.dstId = dst.Id

c. 图表示triplet表示

3. 属性图编程示例

现在假设我们要构建一个由许多来自 GraphX 项目组的协作者组成的属性图。顶点的属性可能包含用户名职业。我们应该用一个可以描述协作者间的关系的字符串来注释图的边。依然是使用上面的图:


启动Spark Shell:

spark-shell

编写案例代码:

import org.apache.spark.graphx.{Edge, Graph, VertexId}
import org.apache.spark.rdd.RDD// 如果不是在 `spark-shell` 中操作,则还需要额外引入 `SparkContext`。
// val sc: SparkContext// 创建一个RDD用于表示顶点
val users: RDD[(VertexId, (String, String))] =sc.parallelize(Array((3L, ("xiaoshao", "student")), (7L, ("laoshao", "Postdoctoral")),(5L, ("laonai", "professor")), (2L, ("laoyi", "professor"))))// 创建一个RDD用于表示边
val relationships: RDD[Edge[String]] =sc.parallelize(Array(Edge(3L, 7L, "partner"),Edge(5L, 3L, "mentor"),Edge(2L, 5L, "worker"), Edge(5L, 7L, "leader")))// 定义默认的用户,用于建立与缺失的用户之间的关系
val defaultUser = ("spark", "default")// 构造图对象,即初始化
val graph = Graph(users, relationships, defaultUser)

Edge类有srcIddstId,分别对应于源顶点目标顶点的标识符。另外,Edge类有一个名为attr的成员,用于存储边的属性,可以结合着表来理解。

执行过程如图:

我们可以进一步操作,使用graph.verticesgraph.edges函数来解构一个图,将其转化为各个顶点和边的视图,并且实现一些简单的统计操作:

// 看看博士后的有多少人
graph.vertices.filter { case (id, (name, pos)) => pos == "Postdoctoral" }.count

// 源顶点id大于目标顶点id的数量
graph.edges.filter(e => e.srcId > e.dstId).count

// 显示关系
val facts: RDD[String] = graph.triplets.map(triplet =>triplet.srcAttr._1 + " is the " + triplet.attr + " of " + triplet.dstAttr._1)facts.collect.foreach(println(_))


解释:graph.vertices函数的返回值类型是 VertexRDD[(String, String)],它继承了 RDD[(VertexID, (String, String))],所以我们可以用 Scala 的 case 表达式来解构这个元组。另外,graph.edges函数的返回值类型是EdgeRDD,它包含了Edge[String]对象。

0xFF 总结

  1. 更多学习请参考官网:https://spark.apache.org/docs/latest/graphx-programming-guide.html
  2. 推荐一本入门GraphX的入门书籍:《Spark GraphX实战》,挺适合初学者入门。

作者简介:邵奈一
全栈工程师、市场洞察者、专栏编辑
| 公众号 | 微信 | 微博 | CSDN | 简书 |

福利:
邵奈一的技术博客导航

邵奈一原创不易,如转载请标明出处,教育是一生的事业。


Spark GraphX 快速入门相关推荐

  1. spark SQL快速入门 1-9 慕课网

    1.hadoop安装 1.修改hadoop配置文件hadoop-env.shexport JAVA_HOME=/home/hadoop/app/jdk1.8.0_91core-site.xml< ...

  2. Spark Steaming快速入门

    Spark Steaming Spark Streaming 简介 什么是Spark Streaming Spark Streaming使用Spark Core的快速调度功能来执行流分析.它以小批量方 ...

  3. spark教程python案例_Spark实战(四)spark+python快速入门实战小例子(PySpark)

    由于目前很多spark程序资料都是用scala语言写的,但是现在需要用python来实现,于是在网上找了scala写的例子改为python实现 1.集群测试实例 代码如下: from pyspark. ...

  4. Spark SQL 快速入门系列(五)SparkSQL 访问 Hive

    文章目录 访问 Hive SparkSQL 整合 Hive 访问 Hive 表 idea实现SparkSQL连接hive 访问 Hive 导读 1,整合 SparkSQL 和 Hive, 使用 Hiv ...

  5. Spark Core快速入门系列(5) | RDD 中函数的传递

      大家好,我是不温卜火,是一名计算机学院大数据专业大二的学生,昵称来源于成语-不温不火,本意是希望自己性情温和.作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己 ...

  6. 【Spark】介绍 快速入门

    目录 介绍 Spark and Hadoop Spark or Hadoop 核心模块 Spark Core Spark SQL Spark Streaming Spark MLlib Spark G ...

  7. Apache Spark 2.2.0 中文文档 - 快速入门 | ApacheCN

    快速入门 使用 Spark Shell 进行交互式分析 基础 Dataset 上的更多操作 缓存 独立的应用 快速跳转 本教程提供了如何使用 Spark 的快速入门介绍.首先通过运行 Spark 交互 ...

  8. [学习笔记]黑马程序员Spark全套视频教程,4天spark3.2快速入门到精通,基于Python语言的spark教程

    文章目录 视频资料: 思维导图 一.Spark基础入门(环境搭建.入门概念) 第二章:Spark环境搭建-Local 2.1 课程服务器环境 2.2 Local模式基本原理 2.3 安装包下载 2.4 ...

  9. spark之1:快速入门

    spark之1:快速入门 @(SPARK)[spark, 大数据] spark可以通过交互式命令行及编程两种方式来进行调用: 前者支持scala与python 后者支持scala.python与jav ...

最新文章

  1. cocos2d-x 3.10 PageView BUG
  2. util.Date与sql.Date的相互转换以及区别
  3. asp.net发布到IIS中出现错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”...
  4. 全球及中国智能隐形眼镜行业供需现状与营销策略建议报告2022-2028年
  5. 【ruoyi若依】layer 重置大小/resize
  6. xstream xml模板_XStream – XStreamely使用Java中的XML数据的简便方法
  7. layui upload 后台获取不到值
  8. PWN-PRACTICE-CTFSHOW-7
  9. 机器学习速成课程 | 练习 | Google Development——编程练习:验证
  10. Installshield2010实现web部署和数据库安装示例
  11. matlab共轭梯度法解线性方程组,计算方法——共轭梯度法求解线性方程组.pdf
  12. 用户注册时图片验证码和短信验证码的逻辑
  13. 动态规划Dynamic programming笔记自用
  14. 零基础如何系统学习Java Web?
  15. 用上柔宇「办公神器套装」,我一天就写了三天的稿子
  16. redis appendonly.aof文件损坏修复方法
  17. 快速排序的三种方式以及快排的优化
  18. 文本相似度的几种计算方式
  19. python主函数调用格式_Python入门基础中怎么定义函数,函数调用,函数传递参数...
  20. dev-c++开发的全鼠标操作控制台战棋

热门文章

  1. 解决安装Visual Studio .NET 2003 时FrontPage 2000 WEB 扩展客户端 安装失败
  2. stm32f4xx-ADC
  3. 如何使用vue-cli搭建SPA项目
  4. 调用Excel 的Excel.Application失败的问题分析
  5. 。ThinkPad T60评测 彻底替代T43
  6. hpdl380g9没有f10_HP DL380 G9 配置RAID
  7. 初识Kali Linux
  8. macromedia_Macromedia宣布推出新的Flash视频套件
  9. MT6735芯片平台方案开发资料介绍(主板/PCBA,驱动/底层开发,软件/系统)
  10. 地球坐标系与投影方式的理解(关于北京54,西安80,WGS84;高斯,兰勃特,墨卡托投影)