一.什么是图计算
图计算,可以简单理解为以图这种数据结构为基础,整合相关算法来实现对应应用的计算模型。社交网络中人与人之间的关系,如果用计算机数据结构表示,最合适的就是图了。其中图的顶点表示社交中的人,边表示人与人之间的关系。所以要做社交网络分析,先要了解图计算,这是整个分析的基础。也正如此,Spark的图计算库叫GraphX。
二.图的基本概念
图是基础的数据结构,和链表、树不同,它是一种非线性数据结构。其基本结构很简单,如下图:
一个图由定点集V和定点间的关系集合E组成,可以用二元组定义为G=(V,E)。图中各数据元素之间的关系可以是任意的,且它描述的是多对多的关系。
例如,上图中定点的基础就表示为:
边的集合则表示为:
这是一个有向图。边有方向,(v1,v2)和(v2,v1)表示不同的两条边。若边无方向,则是无向图。
基于图的数据结构衍生出了很多基础算法,例如遍历、最小生成树、最短路径等。比如,著名的Prim算法和Kruskal算法,就是计算最小生成树。
业界也有很多开源的图计算库,常见的如Python的NetworkX、Spark的GraphX等。这些库基本都提供3类API接口,如下:
- 图生成。将文本、日志等数据转换为图的数据结构。
- 访问图数据。查询顶点数、边数;计算某个顶点的出度和入度等。
- 图算法。遍历节点和边、计算图的连通性、计算最大子图、图的合并等基本算法。
三.图计算的应用
基于图的结构有很多应用场景,比如淘宝的商品推荐、腾讯的好友推荐,再比如一些网络路由算法、SNA、Language Modeling等也都会用到图计算。
图的计算量一般都比较大,而且通常会有多次迭代。比如,若简单地计算顶点出入度,时间复杂度就是O(n * m)。想腾讯这种公司的数据级别,基本是不可完成的任务。如果能将算法并行化,利用机器数量弥补速度,这将是件美好的事情。
四.Spark GraphX简介
为了提高图计算的速度,很多企业、社区都提供了并行的图计算解决方案,常见的有Pregel、PowerGraph、Graphlib等。当然,Spark的GraphX是其中的新秀和佼佼者。它依托Spark的强大计算能力,提供了图计算需要的便捷API,同时兼具并行计算的性能,是做大规模图计算的一把利器。
五.GraphX实现
总所周知,Spark抽象了一个通用的数据结构RDD来代表运算中需要的各种数据类型。GraphX的核心数据结构则是GraphX,这是一种携带每个点属性和边属性的有向多重图。所谓多重图,就是一对源、目的节点之间允许存在多条边,以便表示不同的关系【如既是同学,又是同事】。下面是GraphX的定义:
/**
1. The Graph abstractly represents a graph with arbitrary objects
2. associated with vertices and edges. The graph provides basic
3. operations to access and manipulate the data associated with
4. vertices and edges as well as the underlying structure. Like Spark
5. RDDs, the graph is a functional data-structure in which mutating
6. operations return new graphs.
7. 8. @note [[GraphOps]] contains additional convenience operations and graph algorithms.
9. 10. @tparam VD the vertex attribute type
11. @tparam ED the edge attribute type
*/
abstract class Graph[VD: ClassTag, ED: ClassTag] protected () extends Serializable {