Spark GraphX

14 Apr 2021

Spark GraphX概述

GraphX 是 Spark 一个组件,专门用来表示图以及进行图的并行计算。GraphX 通过 重新定义了图的抽象概念来拓展了 RDD: 定向多图,其属性附加到每个顶点和边。
为了支持图计算, GraphX 公开了一系列基本运算符(比如:mapVertices、 mapEdges、subgraph)以及优化后的 Pregel API 变种。此外,还包含越来越多的 图算法和构建器,以简化图形分析任务。
GraphX在图顶点信息和边信息存储上做了优化,使得图计算框架性能相对于原生 RDD实现得以较大提升,接近或到达 GraphLab 等专业图计算平台的性能。GraphX 最大的贡献是,在Spark之上提供一栈式数据解决方案,可以方便且高效地完成图计 算的一整套流水作业。

图的相关术语

图是一种较线性表和树更为复杂的数据结构,图表达的是多对多的关系。
如上图所示,G1 是一个简单的图,其中 V1、V2、V3、V4 被称作顶点(Vertex), 任意两个顶点之间的通路被称为边(Edge),它可以由(V1、V2)有序对来表示, 这时称 G1 为有向图,意味着边是有方向的,若以无序对来表示图中一条边,则该图 为无向图,如 G2。

在 G1 中,与顶点相关联的边的数量被称为顶点的度(Degree)。其中,以顶点为 起点的边的数量被称为该顶点的出度(OutDegree),以顶点为终点的边的数量被 称为该顶点的入度(InDegree)。

以 G1 中的 V1 举例,V1 的度为 3,其中出度为 2,入度为 1。在无向图 G2 中,如 果任意两个顶点之间是连通的,则称 G2 为连通图(Connected Graph)。在有向图 中 G1 中,如果任意两个顶点 Vm、Vn 且 m ≠ n,从 Vm 到 Vn 以及从 Vn 到 Vm 之 间都存在通路,则称 G1 为强连通图(Strongly Connected Graph)。任意两个顶 点之间若存在通路,则称为路径(Path),用一个顶点序列表示,若第一个顶点和 最后一个顶点相同,则称为回路或者环(Cycle)。

图数据库与图计算

Neo4j 是一个比较老牌的开源图数据库,目前在业界的使用也较为广泛,它提供了一种简单易学的查询语言 Cypher。
Neo4j 是图数据库,偏向于存储和查询。能存储关联关系比较复杂,实体之间的连接 丰富。比如社交网络、知识图谱、金融风控等领域的数据。擅长从某个点或某些点出 发,根据特定条件在复杂的关联关系中找到目标点或边。如在社交网络中找到某个点 三步以内能认识的人,这些人可以认为是潜在朋友。数据量限定在一定范围内,能短 时完成的查询就是所谓的OLTP操作。

Neo4j 查询与插入速度较快,没有分布式版本,容量有限,而且一旦图变得非常大, 如数十亿顶点,数百亿边,查询速度将变得缓慢。

比较复杂的分析和算法,如基于图的聚类,PageRank 算法等,这类计算任务对于图 数据库来说就很难胜任了,主要由一些图挖掘技术来负责。

Pregel 是 Google 于 2010 年在 SIGMOD 会议上发表的《Pregel: A System for Large-Scale Graph Processing》论文中提到的海量并行图挖掘的抽象框架,Pregel 与 Dremel 一样,是 Google 新三驾马车之一,它基于 BSP 模型(Bulk Synchronous Parallel,整体同步并行计算模型),将计算分为若干个超步(super step),在超步内,通过消息来传播顶点之间的状态。Pregel 可以看成是同步计 算,即等所有顶点完成处理后再进行下一轮的超步,Spark 基于 Pregel 论文实现的 海量并行图挖掘框架 GraphX。

图计算模式

目前基于图的并行计算框架已经有很多,比如来自Google的Pregel、来自Apache开 源的图计算框架Giraph / HAMA以及最为著名的GraphLab,其中Pregel、HAMA和 Giraph都是非常类似的,都是基于BSP模式。

BSP即整体同步并行,它将计算分成一系列超步的迭代。从纵向上看,它是一个串行 模式,而从横向上看,它是一个并行的模式,每两个超步之间设置一个栅栏 (barrier),即整体同步点,确定所有并行的计算都完成后再启动下一轮超步。

每一个超步包含三部分内容:

Spark GraphX 基础

GraphX 与 Spark 其他组件相比相对独立,拥有自己的核心数据结构与算子。

GraphX 架构

GraphX的整体架构可以分为三个部分:

存储模式

巨型图的存储总体上有边分割和点分割两种存储方式。2013年,GraphLab2.0将其 存储方式由边分割变为点分割,在性能上取得重大提升,目前基本上被业界广泛接受 并使用。

核心数据结构

GraphX API 的开发语言目前仅支持 Scala。GraphX 的核心数据结构 Graph 由 RDD 封装而成。

Spark GraphX计算

引入依赖:

<dependency>  
    <groupId>org.apache.spark</groupId>  
    <artifactId>spark-graphx_2.12</artifactId>  
    <version>${spark.version}</version>  
</dependency>