关键要点
- 图数据分析与传统数据分析间的差异是什么?
- 如何使用 Apache Spark GraphX 软件库和 GraphFrames 这样的 API 进行图数据处理。
- 使用图数据分析的热门用例。
- 高效 GraphX 程序开发中的性能及优化技术。
- 在图数据分析领域中即将出现的趋势。
《 Spark GraphX in Action 》一书已由 Manning 出版社出版,该书作者是 Michael Malak 和 Robin East,书中以教程方式给出了对 Spark GraphX 的全方位覆盖。Spark GraphX 是 Apache Spark 架构中的图处理程序库。
读者可参考这本书去安装和配置 Spark GraphX,进一步地使用 GraphX 去处理图数据。
读者将学会如何使用 GraphFrames API 在 Spark 图中进行 SQL 查询,以及在图数据上应用机器学习算法。
书中第五章涉及 PageRank 、三角形计数、最短路径、连通分量等内置算法。本书作者还探讨了加权最短路径、路由算法(使用做小生成树)等其它的有用算法。
InfoQ 访谈了该书的作者,访谈话题涉及该书的内容、Spark GraphX 程序库、Spark 的整体架构、图数据处理和分析领域的未来发展等问题。
InfoQ:你们是如何定义图数据的?
Michael Malak:就事论事,图结构看上去并非像股价图那样,而是边和点的集合。但这只是一种模糊的数学抽象。更具体地说,在书的第一章中我们将真实世界中的图划分为五类:网络、树、类 RDBMS 结构、稀疏矩阵以及其它杂七杂八的结构。
Robin East:传统的数据分析方法侧重于事物本身,即实体,例如银行交易、资产注册等等。而图数据不仅关注事务,还关注事物之间的联系。例如,如果有一个呼叫记录告诉我张三曾打电话给李四,这样就可以将张三和李四关联起来。这种关联关系提供了与两者相关的有价值信息,而这样的信息是不可能仅从两者单纯的个体数据中获取的。
InfoQ:什么是图数据分析,它与传统数据的处理有什么不同?
Malak:正如我们在书的第一章中所描述的,RDBMS 不足以有效地处理图路径遍历运算,因为该运算需要进行大量的自连接运算。用于稀疏矩阵处理是另一个图分析展示出良好性能的领域,在书中机器学习相关的第七章中对此有所描述。
East:图分析事实上是一系列的实践,这些实践侧重于对数据条目间关联信息内容的描绘。在不同实体间连接模式可见的情况下,对不同数据间关联建模提供了十分强大的能力。再次使用电话呼叫记录作为例子,当我们对由不同人所做的不同呼叫而组成的“网络”进行分析时,就可以去构建具有不同交互类型的图形。在一些情况下,我们可以使用数据的结构信息对不同的行为进行分隔(例如区分犯罪与否)。
InfoQ:图数据分析是如何促进大数据和预测分析的?
Malak:对于已有的大数据,首先你需要从数据中抽取出结构化数据,通常是关系模型或者图模型。一些问题可自然地表示为图问题,例如地图中的路由查找、社会网络分析(尤其是在一个社会网络图中发现意见领袖)。所有的机器学习都是关于做预测的,而在书中关于机器学习的一章也是内容最长的。这一章中展示了一些使用图数据上机器学习的方法。
East:基于大数据的预测分析的效能,事实上取决于抽取许多不同类型的特征作为预测算法输入的能力。书中我最喜欢的例子就是对原有垃圾邮件检测的全新实现。原问题是使用逻辑回归检测垃圾页面,但是我们采用了一种有趣的新思想,即 Truncated Page Rank 算法,该算法使用基于图的输入特性扩展了传统的输入特性。书中展示了如何在 GraphX 中实现这个模型。
InfoQ:你们能介绍一下 GraphFrames 的工作机制吗?它与 DataFrames 相比如何?
Malak:作为 Apache Spark 生态系统的一部分,GraphX 是 Spark 的官方图处理系统。即使在 Spark 2.0 中也是如此。GraphX 基于 RDD 技术,每条边和每个节点均由一个 RDD 表示。GraphFrames 作为 spark-packages.org 所提供的附加软件,依然是基于 DataFrames 的。将 GraphX 与 GrapeFrames 进行对比,这很大程度上就是 RDD 与 DataFrames 的对比。使用 DataFrames(对于 GraphFrames 也一样),Catalyst 查询计划器、Tungsten sun.misc.unsafe 原始内存布局、即时字节码生成会得到潜在的巨大性能提升。就即时字节码生成而言,Spark 2.0 对整个处理流水线而非 keyhole 代码生成进行了改进,这取得了相比于 Spark 1.6 Dataframes 十倍的性能提升。GraphX 具有内部路由表,这便利了三元组(triplet)的构建;GraphFrames 虽然缺少内部路由表的设计,但从 DataFrames 所免费获取的性能改进弥补这一不足,并给出了更大的性能优势。GraphFrames 还具有使用 Neo4j Cypher 语言的子集和 DataFrames 对 SQL 语言的支持进行组合查询的功能。最后一点,GraphFrames 提供了对 Python 和 Java 语言的绑定,这对于喜欢 Python 语言和更适应 Java 开发的程序员是一个喜讯。但是 GraphX 的痛点在于仅官方支持 Scala 语言(虽然在书中我们也展示了如何跨域数以百计的关卡实现在开发中对 Java 的支持)。我们在第十章中涵盖了 GraphFrames 相关内容,并给出了一个有趣的例子,就是去查找本应存在于 Wikipedia 中的缺失链接。
East: 弹性分布式数据集(Resilient Distributed Datasets,RDD)是 Spark 提供的核心底层数据结构。在 GraphX 中,RDD 用于表示图中的边和节点。另一方面,DataFrames 是高层数据接口,提供了一些面向开发人员的有用特性,例如 SQL 接口。DataFrames 还提供了若干性能优化。GraphFrames 使用 DataFrames 表示图,而非 RDD。
GraphFrames 中添加了若干 GraphX 所不具有的关键特性,例如查询结构、Python 属性函数(Property)和 Java API。无论如何,从一种表示方式转化为另一种都是可能的,事实上这也是 PageRank、连通分量等标准算法的实现方法。
InfoQ:你们能介绍一下 NoSQL 图数据库、图数据查询、图数据分析和图数据可视化这四种图数据相关的概念吗?
Malak:我在 2016 年 6 月的 Spark 峰会上做过一个报告,报告中对图技术给出了一个很好的“频谱”展示。频谱图的一端是真正 OLTP 风格的 NoSQL 图数据库,包括 Neo4j、Titan、OrientDB 等。另一端是 OLAP 风格的图处理和数据分析系统,包括 GraphX、GraphLab 等。图查询涉及的范围处于该频谱图的中央。NoSQL 图数据库和 GraphFrames 也都可以进行查询,但是 GraphX 在查询方面非常有局限性。无论 OLTP 风格图数据库或是 OLAP 风格的图处理和分析系统,都可以应用图数据库可视化技术,所以图数据可视化的领域范围与该频谱图是相互正交的。在本书中我们论及两种特定的技术:Gephi 和组合使用 Zpeppelin 与 d3.js。需要指出的是,图可视化的用例与关系数据可视化的用例之间有很大的差异。关系数据可视化的目标是对数据取得直观的了解,而图数据可视化的目标在于对数据或算法进行调试。
East:正如 Michael 已提到的,现在已有一些不同的图数据库,它们满足了一系列不同用例的需求。值得强调的是 GraphX 提供了内存中的图处理功能,而非数据库功能。可以使用 GraphX 从一系列数据源中构建基于内存的图,这样的数据源中可能包括对 NoSQL 图数据库的查询。实际上后一种组合的潜在应用前景巨大。
图可视化是一个需要整整一本书去阐述的话题,很高兴看到 Manning 出版社已经于前期初版了这样的一本书,那就是 Corey Lanum 所著的《Visualizing Graph Data》。
InfoQ:在哪些受欢迎的用例数据处理中,图数据处理是更好解决的方案?
Malak: 应用 GraphX 的典型代表性算法是 PageRank。一些用例使用或者拓展了 RageRank 算法,这样的用例超越了 Google 将 PageRank 用于搜索排序的应用,可用于在论文引用网络(书中给出了一个实例)和社会网络这样类型的图中查找意见领袖。在书中我们还展示了如何将 PageRank 转化为另一种称为 Truncated Page Rank 的算法,这种算法可用于发现垃圾网页链接农场。除了 PageRank 之外,我们在书中还给出了一些经典图算法的实现,这些经典图算法提出于半个世纪之前,其中包括了最短路径(例如地理空间映射)、旅行推销员问题和最小生成树等算法。最小生成树问题听上去很学术,但是在书中我们展示了它的一个有意思的应用,就是辅以 MLlib 提供的 word2vec 算法,从语料库中自动建立层次化概念分类结构。一些 Spark 中的机器学习算法实际上是 GraphX 实现的,其中包括:一种类似于 ALS 可用于推荐系统的算法 SVD++、幂迭代聚类(Power Iteration Clustering,PIC)等。在书中给出了使用 PIC 算法实现计算机视觉中图像分割的例子。
East:在数据间关联与数据项本身同等重要的情况下,就应该考虑使用图方法进行数据处理。虽然有时使用传统方法也能实现这种图处理,但是这样的实现方法很快会变成一种繁重工作,因为即使对于十分简单的结构,这样的方法也需要付出很大的努力才能实现。与之相对比的是,对于互连的数据,GraphX 等图处理系统提供了非常自然的数据表示和交互方式。
InfoQ:通过提供面向批处理、流数据和图数据处理的程序库,Spark 给出了一种统一的大数据处理架构。Spark 还提供了机器学习程序库。你们能介绍一些同时使用所有这些程序库的用例吗?
Malak:在书里关于机器学习的一章中,我们描述了在 MLlib 中使用 GraphX 的方法,但是其中所提及的方法都是批处理应用。类似于 Spark 中的任何其它对象,在 GraphX 和 GraphFrames 中图也是不可变的对象,不可以在图中增量地添加边或节点。虽然 Spark Streaming 也是基于不可变数据,但是它通过实现对关系数据的小型批处理方法使得流数据处理成为可能,小型批处理实现了类似于微型关系表的功能,这种微型表比微型图更加有用。在《Spark GraphX in Action》一书出版后,GraphX 的创立者 Ankur Dave 在 Spark 峰会上展示了一个称为 Tegra 的研究项目,该项目为实现对增量流数据的更新,重写了 GraphX 的代码(该项目与 Spark Streaming 无关)。但是我并不相信当前 Tegra 的代码已经公开可用。
East:在线欺诈检测就是这样的一个领域。考虑到欺诈攻击的快速演变特性,预测分析需要使用最近五分钟或者更短时间内所生成的特性。此外将图模型加入到特征混合中的方法,具有实现更加有效的预测算法的潜力。
InfoQ:在书中提及了性能和监控。你们能给出一些使 GraphX 程序更加高效的技术吗?
Malak:一个原则就是审慎地掌控缓存和 RDD 血统(lineage)。鉴于 GraphX 程序多为实现迭代运算,该原则对于性能问题是尤其重要的。其它一些典型的 Spark 技术对性能优化也有效,例如选取适当的序列化程序。
East:当然首要的是了解 Spark 的工作机制,以及如何对进程进行监控以了解系统运行状态。Spark 提供的基于 Web 的 GUI 可以实时展示系统运行状态,为此必须了解如何最大化地去使用这些工具。程序有很多不同的优化方向,例如缓存、序列化、监测点等,但是理想情况下只有在你理解你的应用是如何执行的,才可以应用这些优化方向。
InfoQ:在当前的 Spark GraphX 程序库实现中还有哪些缺失特性吗?
Malak:书中第八章专用于阐述“缺失的算法”,其中包括:PDF 文件的读取、图的合并、孤立节点的滤除、全局聚类参数的计算等。此外,为加速 GraphX 程序运行,GraphX 的创建者 Ankur Dave 建立了一个称为 IndexedRDD 的程序包。该程序包尚未集成到 Apache Spark 的发布版本中,因而在某种程度上也可以说是 GraphX 所“缺失”的。在第八章中我们展示了如何将 IndexedRDD 集成到 GraphX 程序中,以实现程序性能的提高。
East:可能协同使用 Spark Streaming 时需要对图的增量更新的支持,所以大家时常会提出需要此特性。鉴于当前 GraphX 的数据结构是不可变的,因而增量更新意味着重新创建整个图,这是一个十分耗时的过程。
InfoQ:接下来在图数据处理领域中将会发生什么?
Malak:一个发展趋势将会是同时可处理 OLAP 和 OLTP 类型应用的图系统。在上面提到过我在 2016 年 6 月 Spark 峰会上给出的频谱图,其中很明显可以看出 NoSQL 图数据库在对整个频谱的覆盖上遥遥领先。但是对于哪一种特定的 NoSQL 图数据库将会成为最终胜出者的问题,Neo4j、Turi(或 Dato、GraphLab)、OrientDB、Titan、Oracle PGX 等都是潜在的胜出者。其中 GraphX 的一个显著优势是,对于已经部署了 Spark 集群的系统,无需再付出额外的安装和管理代价。而当前 Spark 集群已在很多公司中得以部署。因而与 Spark 的集成将会成为影响任何未来可能处于统治地位的图技术的关键因素。
East:我认为有两个领域值得密切关注。第一个领域是在图数据库与图处理架构间的紧密集成。这可通过 Neo4j 这样的图数据库与 Spark 这样的图处理系统间的无缝互操作实现,或许这些功能也可出现在同一产品中。
另一个领域是图算法与主流机器学习算法两者间更加紧密地集成。当前一些程序库只是侧重于其中的一方(GraphX 也仅是与 Spark 机器学习程序库松散地集成)。事实上,可经常看到用图来替代表示稀疏数据矩阵。
Robin 还谈及了图数据处理的方法。
East: 如果你习惯于使用关系数据库进行传统数据处理,那么可能需要一段时间去理解使用基于图的方法进行数据建模。如果你固步自封,那么很快就会看到图结构的应用将无所不在。
关于被访者
Michael Malak是《Spark GraphX In Action》一书的主要作者,他自 2013 年初以来,已在两家《财富》世界 200 强企业中开展了 Spark 解决方案实施。在企业能采购到具有适合功能的商业产品之间,他可以做编程实现。
Robin East曾作为大型企业顾问工作超过 15 年,现在是 Worldpay 公司的数据科学家。
查看英文原文: Spark GraphX in Action Book Review and Interview
感谢冬雨对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们。
评论