Nebula Algorithm

Nebula Algorithm (简称Algorithm)是一款基于GraphX的Spark应用程序,通过提交Spark任务的形式使用完整的算法工具对Nebula Graph数据库中的数据执行图计算,也可以通过编程形式调用lib库下的算法针对DataFrame执行图计算。

前提条件

在使用 Algorithm 之前,用户需要确认以下信息:

  • Nebula Graph 服务已经部署并启动。详细信息,参考Nebula Graph安装部署

  • Spark 版本为 2.4.x。

  • Scala 版本为 2.11。

  • (可选)如果用户需要在Github中克隆最新的Algorithm,并自行编译打包,可以选择安装Maven

使用限制

点ID的数据必须为整数,即点ID可以是INT类型,或者是String类型但数据本身为整数。

对于非整数的String类型数据,推荐使用调用算法接口的方式,可以使用SparkSQL的dense_rank函数进行编码,将String类型转换为Long类型。

支持算法

Nebula Algorithm支持的图计算算法如下。

算法名说明应用场景
PageRank页面排序网页排序、重点节点挖掘
Louvain社区发现社团挖掘、层次化聚类
KCoreK核社区发现、金融风控
LabelPropagation标签传播资讯传播、广告推荐、社区发现
ConnectedComponent联通分量社区发现、孤岛发现
StronglyConnectedComponent强联通分量社区发现
ShortestPath最短路径路径规划、网络规划
TriangleCount三角形计数网络结构分析
GraphTriangleCount全图三角形计数网络结构及紧密程度分析
BetweennessCentrality介数中心性关键节点挖掘,节点影响力计算
DegreeStatic度统计图结构分析

实现方法

Nebula Algorithm实现图计算的流程如下:

  1. 利用Nebula Spark Connector从Nebula Graph数据库中读取图数据为DataFrame。

  2. 将DataFrame转换为GraphX的图。

  3. 调用GraphX提供的图算法(例如PageRank)或者自行实现的算法(例如Louvain社区发现)。

详细的实现方法可以参见相关Scala文件

获取Nebula Algorithm

编译打包

  1. 克隆仓库nebula-spark-utils

    1. $ git clone -b v2.5.1 https://github.com/vesoft-inc/nebula-spark-utils.git
  2. 进入目录nebula-algorithm

    1. $ cd nebula-spark-utils/nebula-algorithm
  3. 编译打包。

    1. $ mvn clean package -Dgpg.skip -Dmaven.javadoc.skip=true -Dmaven.test.skip=true

编译完成后,在目录nebula-algorithm/target下生成类似文件nebula-algorithm-2.5.1.jar

Maven远程仓库下载

下载地址

使用方法

调用算法接口(推荐)

lib库中提供了10种常用图计算算法,用户可以通过编程调用的形式调用算法。

  1. 在文件pom.xml中添加依赖。

    1. <dependency>
    2. <groupId>com.vesoft</groupId>
    3. <artifactId>nebula-algorithm</artifactId>
    4. <version>2.5.1</version>
    5. </dependency>
  2. 传入参数调用算法(以PageRank为例)。更多算法请参见测试用例

    Note

    执行算法的DataFrame默认第一列是起始点,第二列是目的点,第三列是边权重(非Nebula Graph中的Rank)。

    1. val prConfig = new PRConfig(5, 1.0)
    2. val louvainResult = PageRankAlgo.apply(spark, data, prConfig, false)

直接提交算法包

Note

使用封装好的算法包有一定的局限性,例如落库到Nebula Graph时,落库的图空间中创建的Tag的属性名称必须和代码内预设的名称保持一致。如果用户有开发能力,推荐使用第一种方法。

  1. 设置配置文件

    1. {
    2. # Spark相关配置
    3. spark: {
    4. app: {
    5. name: LPA
    6. # Spark分片数量
    7. partitionNum:100
    8. }
    9. master:local
    10. }
    11. data: {
    12. # 数据源,可选值为nebula、csv、json。
    13. source: nebula
    14. # 数据落库,即图计算的结果写入的目标,可选值为nebula、csv、json。
    15. sink: nebula
    16. # 算法是否需要权重。
    17. hasWeight: false
    18. }
    19. # Nebula Graph相关配置
    20. nebula: {
    21. # 数据源。Nebula Graph作为图计算的数据源时,nebula.read的配置才生效。
    22. read: {
    23. # 所有Meta服务的IP地址和端口,多个地址用英文逗号(,)分隔。格式: "ip1:port1,ip2:port2"。
    24. # 使用docker-compose部署,端口需要填写docker-compose映射到外部的端口
    25. # 可以用`docker-compose ps`查看
    26. metaAddress: "192.168.*.10:9559"
    27. # Nebula Graph图空间名称
    28. space: basketballplayer
    29. # Nebula Graph Edge type, 多个labels时,多个边的数据将合并。
    30. labels: ["serve"]
    31. # Nebula Graph每个Edge type的属性名称,此属性将作为算法的权重列,请确保和Edge type对应。
    32. weightCols: ["start_year"]
    33. }
    34. # 数据落库。图计算结果落库到Nebula Graph时,nebula.write的配置才生效。
    35. write:{
    36. # Graph服务的IP地址和端口, 多个地址用英文逗号(,)分隔。格式: "ip1:port1,ip2:port2"。
    37. # 使用docker-compose部署,端口需要填写docker-compose映射到外部的端口
    38. # 可以用`docker-compose ps`查看
    39. graphAddress: "192.168.*.11:9669"
    40. # 所有Meta服务的IP地址和端口,多个地址用英文逗号(,)分隔。格式: "ip1:port1,ip2:port2"。
    41. # 使用docker-compose部署,端口需要填写docker-compose映射到外部的端口
    42. # 可以用`docker-compose ps`查看
    43. metaAddress: "192.168.*.12:9559"
    44. user:root
    45. pswd:nebula
    46. # 在提交图计算任务之前需要自行创建图空间及Tag
    47. # Nebula Graph图空间名称
    48. space:nb
    49. # Nebula Graph Tag名称,图计算结果会写入该Tag。Tag中的属性名称固定如下:
    50. # PageRank:pagerank
    51. # Louvain:louvain
    52. # ConnectedComponent:cc
    53. # StronglyConnectedComponent:scc
    54. # LabelPropagation:lpa
    55. # ShortestPath:shortestpath
    56. # DegreeStatic:degree、inDegree、outDegree
    57. # KCore:kcore
    58. # TriangleCount:tranglecpunt
    59. # BetweennessCentrality:betweennedss
    60. tag:pagerank
    61. }
    62. }
    63. local: {
    64. # 数据源。图计算的数据源为csv文件或json文件时,local.read的配置才生效。
    65. read:{
    66. filePath: "hdfs://127.0.0.1:9000/edge/work_for.csv"
    67. # 如果CSV文件没有表头,使用[_c0, _c1, _c2, ..., _cn]表示其表头,有表头或者是json文件时,直接使用表头名称即可。
    68. # 起始点ID列的表头。
    69. srcId:"_c0"
    70. # 目的点ID列的表头。
    71. dstId:"_c1"
    72. # 权重列的表头
    73. weight: "_c2"
    74. # csv文件是否有表头
    75. header: false
    76. # csv文件的分隔符
    77. delimiter:","
    78. }
    79. # 数据落库。图计算结果落库到csv文件或text文件时,local.write的配置才生效。
    80. write:{
    81. resultPath:/tmp/
    82. }
    83. }
    84. algorithm: {
    85. # 需要执行的算法,可选值为:pagerank、louvain、connectedcomponent、
    86. # labelpropagation、shortestpaths、degreestatic、kcore、
    87. # stronglyconnectedcomponent、trianglecount、betweenness
    88. executeAlgo: pagerank
    89. # PageRank参数
    90. pagerank: {
    91. maxIter: 10
    92. resetProb: 0.15 # 默认为0.15
    93. }
    94. # Louvain参数
    95. louvain: {
    96. maxIter: 20
    97. internalIter: 10
    98. tol: 0.5
    99. }
    100. # ConnectedComponent/StronglyConnectedComponent参数
    101. connectedcomponent: {
    102. maxIter: 20
    103. }
    104. # LabelPropagation参数
    105. labelpropagation: {
    106. maxIter: 20
    107. }
    108. # ShortestPath参数
    109. shortestpaths: {
    110. # several vertices to compute the shortest path to all vertices.
    111. landmarks: "1"
    112. }
    113. # DegreeStatic参数
    114. degreestatic: {}
    115. # KCore参数
    116. kcore:{
    117. maxIter:10
    118. degree:1
    119. }
    120. # TriangleCount参数
    121. trianglecount:{}
    122. # BetweennessCentrality参数
    123. betweenness:{
    124. maxIter:5
    125. }
    126. }
    127. }
  2. 提交图计算任务。

    1. ${SPARK_HOME}/bin/spark-submit --master <mode> --class com.vesoft.nebula.algorithm.Main <nebula-algorithm-2.5.1.jar_path> -p <application.conf_path>

    示例:

    1. ${SPARK_HOME}/bin/spark-submit --master "local" --class com.vesoft.nebula.algorithm.Main /root/nebula-spark-utils/nebula-algorithm/target/nebula-algorithm-2.5.1.jar -p /root/nebula-spark-utils/nebula-algorithm/src/main/resources/application.conf

视频


最后更新: October 12, 2021