GraphX 图并行计算 (一)

GraphX 是 Spark 的一个模块, 主要负责大规模图数据的并行计算.

图计算是什么

那么, 图计算是什么, 有什么用呢?
图计算, 就是从图结构的数据中, 提取有用的信息. 比如这些:

  1. PageRank.
    google创始人命名的算法, 互联网中的海量网页是一个图, 每个顶点都是一个网页, 图的边是网页间的链接引用关系, PageRank 用来辅助分析网页在全局图里的重要性, 用在搜索引擎的网页排序.
  2. 社群发现.
    社交关系是一个图, 顶点是一个人, 图的边是人与人之间的互动行为和关系, 社群发现算法可以从中发现社群, 进而可以把这些数据应用在推荐系统和营销等业务上.
  3. 路径规划.
    交通网是一个图, 顶点是一个站点, 边是可达的交通路径, 从中我们可以计算得出两个站点的最佳路径, 应用在路径的最优化. 常见于行程计划、快递等地图类应用.
  4. 连通图.
    比如互联网中用户的ID标识也是一个图, 一个用户可能有多个标识ID, 比如uid/手机号/sessionid/手机设备id/广告id等等, 这些ID的关系是一个连通图. 通过埋点收集的数据需要通过ID关联进行合并数据, 常见于用户画像建设/用户识别/广告等等.
  5. 知识图谱
    如我们常用的 wiki 百科/天眼查等等, 都属于知识图谱, 这些实体及实体间的联系构成了一个图.
  6. 当然图计算的用途不仅如此, 还有图机器学习等等.

图并行计算, 则是要解决大规模数据场景下的并行计算, 因为现实中图的数据往往是比较大的, 无法用单机完成计算.

图计算需要什么: 数据

图计算这么有用, 那么进行大规模数据的图并行计算要面对哪些问题呢?

  • 图的数据结构:
    我们用什么数据结构来组织和承载数据, 比如邻接数组/邻接表/十字链表/边集数组等等.

  • 存储方式:
    如何读取和持久化大图的数据, 文件如何编码, 如何分布式存储.

  • 图的分割方法:
    如何对一个大图进行分割来并行处理. 比如 EdgeCut 和 VertexCut.

EdgeCut, 顾名思义就是基于边来切割大图, VertexCut 则是基于顶点来切割.
目前主流是 VertexCut, 主要原因是:

  1. 磁盘价格便宜, 而网络通信的成本较高. 当对图进行基于边的计算时,对于两个顶点被分到不同机器上的边来说,需要跨机器通信,内网开销大.
  2. 绝大多数图都属于 幂律分布(长尾分布),不同顶点的邻居数量可能相差非常悬殊, 某些顶点可能有大量的边. 比如微博可能大部分人的粉丝数都很少, 但是少部分的大V用户则有庞大的粉丝数. 所以边分割的话会使 这些顶点 大多数被分到不同的机器上,这样会有很大的通信开销.
  3. 现实中的图, 边的数量通常比结点要多得多.
  • 数据分区方法:

切分大图时, 如何保证分的均匀, 如何避免数据倾斜, 避免某些机器因为数据过大成为木桶的短板而拖慢整体的性能.

图计算需要什么: 算法

除了数据问题, 还有一个要解决的就是: 计算(算法), 我们如何在分布式环境完成计算.

常见的图并行计算框架和实现有: Google Pregel / Graphlab / PowerGraph / GraphX / Giraph/ Gemini ...

下一篇将对 GraphX 相关的并行计算框架进行介绍.