Nebula Algorithm

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

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

    • Spark 版本为 2.4.x 。

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

    使用限制

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

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

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

    实现方法

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

    2. 将DataFrame转换为GraphX的图。

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

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

    1. 克隆仓库nebula-spark-utils

    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

    使用方法

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

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

    2. 传入参数调用算法(以PageRank为例)。更多算法请参见。

      1. val prConfig = new PRConfig(5, 1.0)
      2. val louvainResult = PageRankAlgo.apply(spark, data, prConfig, false)
    1. 设置配置文件

      ``` {

      1. # Spark相关配置
      2. spark: {
      3. app: {
      4. name: LPA
      5. # Spark分片数量
      6. partitionNum:100
      7. }
      8. master:local
      9. }
      10. data: {
      11. # 数据源,可选值为nebula、csv、json。
      12. # 数据落库,即图计算的结果写入的目标,可选值为nebula、csv、json。
      13. sink: nebula
      14. # 算法是否需要权重。
      15. hasWeight: false
      16. }
      17. # Nebula Graph相关配置
      18. nebula: {
      19. # 数据源。Nebula Graph作为图计算的数据源时,nebula.read的配置才生效。
      20. # 所有Meta服务的IP地址和端口,多个地址用英文逗号(,)分隔。格式: "ip1:port1,ip2:port2"。
      21. # 使用docker-compose部署,端口需要填写docker-compose映射到外部的端口
      22. # 可以用`docker-compose ps`查看
      23. metaAddress: "192.168.*.10:9559"
      24. # Nebula Graph图空间名称
      25. space: basketballplayer
      26. # Nebula Graph边类型, 多个labels时,多个边的数据将合并。
      27. labels: ["serve"]
      28. # Nebula Graph每个边类型的属性名称,此属性将作为算法的权重列,请确保和边类型对应。
      29. weightCols: ["start_year"]
      30. }
      31. # 数据落库。图计算结果落库到Nebula Graph时,nebula.write的配置才生效。
      32. write:{
      33. # Graph服务的IP地址和端口, 多个地址用英文逗号(,)分隔。格式: "ip1:port1,ip2:port2"。
      34. # 使用docker-compose部署,端口需要填写docker-compose映射到外部的端口
      35. # 可以用`docker-compose ps`查看
      36. graphAddress: "192.168.*.11:9669"
      37. # 所有Meta服务的IP地址和端口,多个地址用英文逗号(,)分隔。格式: "ip1:port1,ip2:port2"。
      38. # 使用docker-compose部署,端口需要填写docker-compose映射到外部的端口
      39. # 可以用`docker-compose ps`查看
      40. metaAddress: "192.168.*.12:9559"
      41. user:root
      42. pswd:nebula
      43. # 在提交图计算任务之前需要自行创建图空间及标签
      44. # Nebula Graph图空间名称
      45. space:nb
      46. # Nebula Graph标签名称,图计算结果会写入该标签。标签中的属性名称固定如下:
      47. # Louvain:louvain
      48. # ConnectedComponent:cc
      49. # StronglyConnectedComponent:scc
      50. # ShortestPath:shortestpath
      51. # DegreeStatic:degree、inDegree、outDegree
      52. # KCore:kcore
      53. # TriangleCount:tranglecpunt
      54. # BetweennessCentrality:betweennedss
      55. tag:pagerank
      56. }
      57. }
      58. local: {
      59. # 数据源。图计算的数据源为csv文件或json文件时,local.read的配置才生效。
      60. read:{
      61. filePath: "hdfs://127.0.0.1:9000/edge/work_for.csv"
      62. # 如果CSV文件没有表头,使用[_c0, _c1, _c2, ..., _cn]表示其表头,有表头或者是json文件时,直接使用表头名称即可。
      63. # 起始点ID列的表头。
      64. srcId:"_c0"
      65. # 目的点ID列的表头。
      66. dstId:"_c1"
      67. # 权重列的表头
      68. weight: "_c2"
      69. # csv文件是否有表头
      70. header: false
      71. # csv文件的分隔符
      72. delimiter:","
      73. }
      74. # 数据落库。图计算结果落库到csv文件或text文件时,local.write的配置才生效。
      75. write:{
      76. resultPath:/tmp/
      77. }
      78. }
    1. 提交图计算任务。

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