Nebula Algorithm

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

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

    • Spark 版本为 2.4.x。

    • Scala 版本为 2.11。

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

    使用限制

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

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

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

    实现方法

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

    1. 将DataFrame转换为GraphX的图。

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

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

    1. 克隆仓库nebula-spark-utils

    2. 进入目录nebula-algorithm

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

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

    使用方法

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

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

      Note

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

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

      示例:

      • (2分36秒)