GraphX 在图数据库 Nebula Graph 的图计算实践

简介: 不同来源的异构数据间存在着千丝万缕的关联,这种数据之间隐藏的关联关系和网络结构特性对于数据分析至关重要,图计算就是以图作为数据模型来表达问题并予以解决的过程。

不同来源的异构数据间存在着千丝万缕的关联,这种数据之间隐藏的关联关系和网络结构特性对于数据分析至关重要,图计算就是以图作为数据模型来表达问题并予以解决的过程。

图计算实践

一、背景

随着网络信息技术的飞速发展,数据逐渐向多源异构化方向发展,且不同来源的异构数据之间也存在的千丝万缕的关联,这种数据之间隐藏的关联关系和网络结构特性对于数据分析至关重要。但传统关系型数据库在分析大规模数据关联特性时存在性能缺陷、表达有限等问题,因此有着更强大表达能力的图数据受到业界极大重视,图计算就是以图作为数据模型来表达问题并予以解决的过程。图可以融合多源多类型的数据,除了可以展示数据静态基础特性之外,还可通过图计算展示隐藏在数据之间的图结构特性和点对关联关系,成为社交网络、推荐系统、知识图谱、金融风控、网络安全、文本检索等领域重要的分析手段。

二、算法应用

为了支撑大规模图计算的业务需求,Nebula Graph 基于 GraphX 提供了 PageRankLouvain 社区发现的图计算算法,允许用户通过提交 Spark 任务的形式执行算法应用。此外,用户也可以通过 Spark Connector 编写 Spark 程序调用 GraphX 自带的其他图算法,如 LabelPropagation、ConnectedComponent 等。

PageRank

PageRank 是谷歌提出的用于解决链接分析中网页排名问题的算法,目的是为了对互联网中数以亿计的网页进行排名。

PageRank 简介

美国斯坦福大学的 Larry Page 和 Sergey Brin 在研究网页排序问题时采用学术界评判论文重要性的方法,即看论文的引用量以及引用该论文的论文质量,对应于网页的重要性有两个假设:

  1. 数量假设:如果一个网页 A 被很多其他网页链接到,则该网页比较重要;
  2. 质量假设:如果一个很重要的网页链接到网页 A,则该网页的重要性会被提高。

并基于这两个假设提出 PageRank 算法。

PageRank 应用场景

社交应用的相似度内容推荐

在对微博、微信等社交平台进行社交网络分析时,可以基于 PageRank 算法根据用户通常浏览的信息以及停留时间实现基于用户的相似度的内容推荐;

分析用户社交影响力

在社交网络分析时根据用户的 PageRank 值进行用户影响力分析;

文献重要性研究

根据文献的 PageRank 值评判该文献的质量,PageRank 算法就是基于评判文献质量的想法来实现设计。

此外 PageRank 在数据分析和挖掘中也有很多的应用。

算法思路

GraphX 的 PageRank 算法是基于 Pregel 计算模型的,该算法流程包括 3 步骤:

  1. 为图中每个节点(网页)设置一个同样的初始 PageRank 值;
  2. 第一次迭代:沿边发送消息,每个节点收到所有关联边上对点的信息,得到一个新的 PageRank 值;
  3. 第二次迭代:用这组新的 PageRank 按不同算法模式对应的公式形成节点自己新的 PageRank。

Louvain 社区发现

Louvain 是用来进行社会网络挖掘的社区发现算法,属于图的聚类算法。

Louvain 算法介绍

Louvain 是基于模块度(Modularity)的社区发现算法,通过模块度来衡量一个社区的紧密程度。如果一个节点加入到某一社区中会使得该社区的模块度相比其他社区有最大程度的增加,则该节点就应当属于该社区。如果加入其它社区后没有使其模块度增加,则留在自己当前社区中。

模块度

模块度公式

模块度 Q 的物理意义:社区内节点的连边数与随机情况下的边数之差,定义函数如下:

其中

:节点 i 和节点 j 之间边的权重
:所有与节点 i 相连的边的权重之和
:节点 i 所属的社区
: 图中所有边的权重之和

模块度公式变形

在此公式中,只有节点 i 和节点 j 属于同一社区,公式才有意义,所以该公式是衡量的某一社区内的紧密度。对于该公式的简化变形如下:

表示: 社区 c 内的边的权重之和
表示: 所有与社区 c 内节点相连的边的权重之和(因为 i 属于社区 c)包括社区内节点与节点 i 的边和社区外节点与节点 i 的边。
表示: 所有与社区 c 内节点相连的边的权重之和(因为 j 属于社区 c)包括社区内节点与节点 j 的边和社区外节点与节点 j 的边。
代替 。(即社区 c 内边权重和 + 社区 c 与其他社区连边的权重和)

求解模块度变化

在 Louvain 算法中不需要求每个社区具体的模块度,只需要比较社区中加入某个节点之后的模块度变化,所以需要求解 △Q。

将节点 i 分配到某一社区中,社区的模块度变化为:

其中

: 社区内所有节点与节点 i 连边权重之和(对应新社区的实际内部权重和乘以 2,因为 对于社区内所有的顶点 i,每条边其实被计算了两次)
: 所有与节点 i 相连的边的权重之和
故实现算法时只需求 即可。

Louvain 应用场景

  • 金融风控

在金融风控场景中,可以根据用户行为特征进行团伙识别;

  • 社交网络

可以基于网络关系中点对之间关联的广度和强度进行社交网络划分;对复杂网络分析、电话网络分析人群之间的联系密切度;

  • 推荐系统

基于用户兴趣爱好的社区发现,可以根据社区并结合协同过滤等推荐算法进行更精确有效的个性化推荐。

Louvain 算法思路

Louvain 算法包括两个阶段,其流程就是这两个阶段的迭代过程。

阶段一:不断地遍历网络图中的节点,通过比较节点给每个邻居社区带来的模块度的变化,将单个节点加入到能够使 Modularity 模块度有最大增量的社区中。
(比如节点 v 分别加入到社区 A、B、C 中,使得三个社区的模块度增量为-1, 1, 2, 则节点 v 最终应该加入到社区 C 中)

阶段二:对第一阶段进行处理,将属于同一社区的顶点合并为一个大的超点重新构造网络图,即一个社区作为图的一个新的节点。此时两个超点之间边的权重是两个超点内所有原始顶点之间相连的边权重之和,即两个社区之间的边权重之和。

下面是对第一二阶段的实例介绍。

Louvain 社区算法

第一阶段遍历图中节点加入到其所属社区中,得到中间的图,形成四个社区;

第二节点对社区内的节点进行合并成一个超级节点,社区节点有自连边,其权重为社区内部所有节点间相连的边的权重之和的 2 倍,社区之间的边为两个社区间顶点跨社区相连的边的权重之和,如红色社区和浅绿色社区之间通过(8,11)、(10,11)、(10,13)相连,所以两个社区之间边的权重为 3。

注:社区内的权重为所有内部结点之间边权重的两倍,因为 Kin 的概念是社区内所有节点与节点 i 的连边和,在计算某一社区的 Kin 时,实际上每条边都被其两端的顶点计算了一次,一共被计算了两次。

整个 Louvain 算法就是不断迭代第一阶段和第二阶段,直到算法稳定(图的模块度不再变化)或者到达最大迭代次数。

三、算法实践

演示环境

  • 三台虚拟机,环境如下:

    • Cpu name:Intel(R) Xeon(R) Platinum 8260M CPU @ 2.30GHz
    • Processors:32
    • CPU Cores:16
    • Memory Size:128G
  • 软件环境

    • Spark:spark-2.4.6-bin-hadoop2.7 三个节点集群
    • yarn V2.10.0:三个节点集群
    • Nebula Graph V1.1.0:分布式部署,默认配置

测试数据

  1. 创建图空间
CREATE SPACE algoTest(partition_num=100, replica_factor=1);
  1. 创建点边 Schema
CREATE TAG PERSON()
CREATE EDGE FRIEND(likeness double);
  1. 导入数据

利用 Exchange 工具将数据离线导入 Nebula Graph。

  1. 测试结果

Spark 任务的资源分配为 --driver-memory=20G --executor-memory=100G --executor-cores=3

  • PageRank 在一亿数据集上的执行时间为 21min(PageRank 算法执行时间)
  • Louvain 在一亿数据集上的执行时间为 1.3h(Reader + Louvain 算法执行时间)

如何使用 Nebula Graph 的算法

  1. 下载 nebula-algorithm 项目并打成 jar 包
$ git clone git@github.com:vesoft-inc/nebula-java.git
$ cd nebula-java/tools/nebula-algorithm
$ mvn package -DskipTests
  1. 配置项目中的 src/main/resources/application.conf 
{
  # Spark relation config
  spark: {
    app: {
        # not required, default name is the algorithm that you are going to execute.
        name: PageRank

        # not required
        partitionNum: 12
    }

    master: local

    # not required
    conf: {
        driver-memory: 8g
        executor-memory: 8g
        executor-cores: 1g
        cores-max:6
    }
  }

  # Nebula Graph relation config
  nebula: {
    # metadata server address
    addresses: "127.0.0.1:45500"
    user: root
    pswd: nebula
    space: algoTest
    # partition specified while creating nebula space, if you didn't specified the partition, then it's 100.
    partitionNumber: 100
    # nebula edge type
    labels: ["FRIEND"]

    hasWeight: true
    # if hasWeight is true,then weightCols is required, and weghtCols' order must be corresponding with labels.
    # Noted: the graph algorithm only supports isomorphic graphs,
    #        so the data type of each col in weightCols must be consistent and all numeric types.
    weightCols: [“likeness”]
  }

  algorithm: {
    # the algorithm that you are going to execute,pick one from [pagerank, louvain]
    executeAlgo: louvain
    # algorithm result path
    path: /tmp

    # pagerank parameter
    pagerank: {
        maxIter: 20
        resetProb: 0.15  # default 0.15

    }

    # louvain parameter
    louvain: {
        maxIter: 20
        internalIter: 10
        tol: 0.5
   }
  }
}
  1. 确保用户环境已安装 Spark 并启动 Spark 服务
  2. 提交 nebula-algorithm 应用程序:
spark-submit --master xxx --class com.vesoft.nebula.tools.algorithm.Main /your-jar-path/nebula-algorithm-1.0.1.jar -p /your-application.conf-path/application.conf

如果你对上述内容感兴趣,欢迎用 nebula-algorithm 试试^^

References

作者有话说:Hi,我是安祺,Nebula Graph 研发工程师,如果你对本文有任何疑问,欢迎来论坛和我交流: https://discuss.nebula-graph.com.cn/

推荐阅读

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
3天前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
|
4天前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。
|
7天前
|
SQL Java 数据库
Spring Boot与Flyway:数据库版本控制的自动化实践
【10月更文挑战第19天】 在软件开发中,数据库的版本控制是一个至关重要的环节,它确保了数据库结构的一致性和项目的顺利迭代。Spring Boot结合Flyway提供了一种自动化的数据库版本控制解决方案,极大地简化了数据库迁移管理。本文将详细介绍如何使用Spring Boot和Flyway实现数据库版本的自动化控制。
10 2
|
20天前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
30 11
|
19天前
|
SQL 存储 关系型数据库
添加数据到数据库的SQL语句详解与实践技巧
在数据库管理中,添加数据是一个基本操作,它涉及到向表中插入新的记录
|
20天前
|
Rust 前端开发 关系型数据库
Tauri 开发实践 — Tauri 集成本地数据库
本文介绍了在 Tauri 框架中集成本地数据库的几种方案,包括直接绑定 SQLite、使用第三方数据库库和使用 tauri-plugin-sql-api 插件。最终选择了 tauri-plugin-sql-api,因为它集成简单、支持多种数据库类型,并且与 Tauri 框架深度整合,提升了开发效率和安全性。文章详细介绍了如何安装和使用该插件,以及如何编写核心代码实现数据库操作。
89 2
|
24天前
|
SQL 关系型数据库 数据库
SQL数据库:核心原理与应用实践
随着信息技术的飞速发展,数据库管理系统已成为各类组织和企业中不可或缺的核心组件。在众多数据库管理系统中,SQL(结构化查询语言)数据库以其强大的数据管理能力和灵活性,广泛应用于各类业务场景。本文将深入探讨SQL数据库的基本原理、核心特性以及实际应用。一、SQL数据库概述SQL数据库是一种关系型数据库
22 5
|
23天前
|
SQL 开发框架 .NET
ASP连接SQL数据库:从基础到实践
随着互联网技术的快速发展,数据库与应用程序之间的连接成为了软件开发中的一项关键技术。ASP(ActiveServerPages)是一种在服务器端执行的脚本环境,它能够生成动态的网页内容。而SQL数据库则是一种关系型数据库管理系统,广泛应用于各类网站和应用程序的数据存储和管理。本文将详细介绍如何使用A
36 3
|
27天前
|
关系型数据库 数据挖掘 数据库
解析数据库联结:应用与实践中的 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN 与 CROSS JOIN
解析数据库联结:应用与实践中的 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN 与 CROSS JOIN
41 1
|
2月前
|
消息中间件 缓存 监控
优化微服务架构中的数据库访问:策略与实践
随着微服务架构的普及,如何高效管理和优化数据库访问成为了关键挑战。本文探讨了在微服务环境中优化数据库访问的策略,包括数据库分片、缓存机制、异步处理等技术手段。通过深入分析实际案例和最佳实践,本文旨在为开发者提供实际可行的解决方案,以提升系统性能和可扩展性。