nebula入门学习——day5 图算法

https://docs.nebula-graph.com.cn/3.1.0/nebula-analytics/

 

Nebula Analytics

Nebula Analytics 是一款高性能图计算框架工具,支持对 Nebula Graph 数据库中的数据执行图分析。

Enterpriseonly

仅企业版支持本功能。

适用场景

支持将数据源为 Nebula Graph 集群、HDFS 上的 CSV 文件或本地 CSV 文件中的数据导入 Nebula Analytics,并将图计算结果输出至 Nebula Graph 集群、HDFS 上的 CSV 文件或本地 CSV 文件。

使用限制

输入和输出均为 Nebula Graph 集群时,图计算结果只能输出到数据源所在的图空间。

版本兼容性

Nebula Analytics 版本和 Nebula Graph 内核的版本对应关系如下。

Analytics client 版本Nebula Graph 版本
3.1.0 3.1.0
1.0.x 3.0.x
0.9.0 2.6.x

支持算法

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

算法名说明分类
APSP 全图最短路径 路径
SSSP 单源最短路径 路径
BFS 广度优先遍历 路径
PageRank 页面排序 节点重要度
KCore K核 节点重要度
DegreeCentrality 度中心性 节点重要度
DegreeWithTime 基于边的时间范围统计邻居 节点重要度
BetweennessCentrality 中介中心性 节点重要度
ClosenessCentrality 接近中心性 节点重要度
TriangleCount 三角计数 图特征
LPA 标签传播 社区发现
HANP 标签传播进阶版 社区发现
WCC 联通分量 社区发现
LOUVAIN 社区发现 社区发现
Clustering Coefficient 聚集系数 聚类
Jaccard 杰卡德相似度 相似度

安装 Nebula Analytics

在多个机器安装由多个 Nebula Analytics 服务构成的集群时,需要安装路径相同,并设置节点间 SSH 免密登录。

 
sudo rpm -i nebula-analytics-3.1.0-centos.x86_64.rpm  --prefix /home/xxx/nebula-analytics

使用方法

安装完成后,用户可以设置不同算法的参数,然后执行脚本,即可获得算法的结果,并导出为指定格式。

    1. 选择 Nebula Analytics 集群的任一节点,进入目录scripts

       
  1. $ cd scripts
    
  2. 确认数据源和输出路径。配置方法如下:

    • 数据源为 Nebula Graph 集群

      1. 修改配置文件nebula.conf,设置 Nebula Graph 集群相关信息。

         
  3. # 连接 Nebula Graph 时的重试次数。
    --retry=3  
    # 要读取或写入的图空间名称。
    --space=baskeyballplayer  
    
    # 读取 Nebula Graph 设置
    # Nebula Graph 的 metad leader服务地址,例如为192.168.8.101。
    --meta_server_addrs=192.168.8.101:9559
    # 要读取的边的名称。
    --edges=LIKES  
    # 要读取的作为边的权重属性的名称。可以是属性名,也可以是 _rank。
    #--edge_data_fields 
    # 每次扫描读取的行数。
    --read_batch_size=10000  
    
    # 写回 Nebula Graph 设置
    # Nebula Graph 的 graphd 服务地址。
    --graph_server_addrs=192.168.8.100:9669  
    # Nebula Graph 的登录用户名。
    --user=root  
    # Nebula Graph 的登录密码。
    --password=nebula  
    # 写回 Nebula Graph 时采用的模式: insert 和 update。
    --mode=insert  
    # 写回到 Nebula Graph 的 Tag 名称。
    --tag=pagerank  
    # 写回到 Nebula Graph 的 Tag 对应的属性名称。
    --prop=pr  
    # 写回到 Nebula Graph 的 Tag 对应的属性的类型。
    --type=double 
    # 写回时,每次写入的行数。
    --write_batch_size=1000 
    # 写回失败的数据所存储的文件。
    --err_file=/home/xxx/analytics/err.txt 
    
  4. 修改需要使用的算法脚本,例如run_pagerank.sh,设置相关参数。

     
      1. # 集群所有机器所运行的进程数之和,推荐每台机器为 1 或者 NUMA 架构的 node 数。
        WNUM=3 
        # 每个进程的线程数,推荐最大设置为机器的硬件线程数。
        WCORES=4  
        # 数据源路径
        # 可以通过文件 nebula.conf 设置从 Nebula Graph 读取:
        INPUT=${INPUT:="nebula:$PROJECT/scripts/nebula.conf"}  
        # 也可以通过本地或 HDFS 上的 CSV 文件读取:
        # #INPUT=${INPUT:="$PROJECT/data/graph/v100_e2150_ua_c3.csv"}
        
        # 图计算结果输出路径
        # 可以输出至 Nebula Graph 集群,如果数据源也为 Nebula Graph,结果会输出至 nebula.conf 指定的图空间。
        OUTPUT=${OUTPUT:="nebula:$PROJECT/scripts/nebula.conf"}
        # 也可以输出至本地或 HDFS 上的 CSV 文件:
        # OUTPUT=${OUTPUT:='hdfs://192.168.8.100:9000/_test/output'}
        
        # true 为有向图,false 为无向图。
        IS_DIRECTED=${IS_DIRECTED:=true}
        # 是否进行 ID 编码
        NEED_ENCODE=${NEED_ENCODE:=true}
        # 数据源的点 ID 类型,例如:string、int32、int64。
        VTYPE=${VTYPE:=int32}
        # 编码类型。distributed 为分布式点ID编码,single 为单机点 ID 编码。
        ENCODER=${ENCODER:="distributed"}
        # PageRank 算法的参数。不同算法的参数不同。
        EPS=${EPS:=0.0001}
        DAMPING=${DAMPING:=0.85}
        # 迭代次数
        ITERATIONS=${ITERATIONS:=100}
        
    • 数据源为本地或 HDFS 上的 CSV 文件

      修改需要使用的算法脚本,例如run_pagerank.sh,设置相关参数。

       
    • # 集群所有机器所运行的进程数之和,推荐每台机器为 1 或者 NUMA 架构的 node 数。
      WNUM=3 
      # 每个进程的线程数,推荐最大设置为机器的硬件线程数。
      WCORES=4  
      # 数据源路径
      # 可以通过文件 nebula.conf 设置从 Nebula Graph 读取:
      # INPUT=${INPUT:="nebula:$PROJECT/scripts/nebula.conf"}  
      # 也可以通过本地或 HDFS 上的 CSV 文件读取:
      INPUT=${INPUT:="$PROJECT/data/graph/v100_e2150_ua_c3.csv"}
      
      # 图计算结果输出路径
      # 可以输出至 Nebula Graph 集群,如果数据源也为 Nebula Graph,结果会输出至 nebula.conf 指定的图空间。
      # OUTPUT=${OUTPUT:="nebula:$PROJECT/scripts/nebula.conf"}
      # 也可以输出至本地或 HDFS 上的 CSV 文件:
      OUTPUT=${OUTPUT:='hdfs://192.168.8.100:9000/_test/output'}
      
      # true 为有向图,false 为无向图。
      IS_DIRECTED=${IS_DIRECTED:=true}
      # 是否进行 ID 编码
      NEED_ENCODE=${NEED_ENCODE:=true}
      # 数据源的点 ID 类型,例如:string、int32、int64。
      VTYPE=${VTYPE:=int32}
      # 编码类型。distributed 为分布式点ID编码,single 为单机点 ID 编码。
      ENCODER=${ENCODER:="distributed"}
      # PageRank 算法的参数。不同算法的参数不同。
      EPS=${EPS:=0.0001}
      DAMPING=${DAMPING:=0.85}
      # 迭代次数
      ITERATIONS=${ITERATIONS:=100}
      
  5. 修改配置文件cluster,设置执行算法的 Nebula Analytics 集群节点和任务分配权重。

     
  6. # Nebula Analytics 集群节点 IP 地址:任务分配权重
    192.168.8.200:1
    192.168.8.201:1
    192.168.8.202:1
    
  7. 执行算法脚本。例如:

     
  8. ./run_pagerank.sh
    
  9. 在输出路径查看计算结果。

    • 输出至 Nebula Graph 集群,请根据nebula.conf的设置查看计算结果。
    • 输出至 HDFS 上的 CSV 文件或本地 CSV 文件,请根据图计算脚本内的OUTPUT设置查看计算结果,计算结果为.gz格式的压缩文件。
       
       

      Nebula Algorithm

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

      版本兼容性

      Nebula Algorithm 版本和 Nebula Graph 内核的版本对应关系如下。

      Algorithm client 版本Nebula Graph 版本
      3.0-SNAPSHOT nightly
      3.0.0 3.1.0
      2.6.x 2.6.x
      2.5.0 2.5.0、2.5.1
      2.1.0 2.0.0、2.0.1

      前提条件

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

      • Spark 版本为 2.4.x。
      • Scala 版本为 2.11。
      • (可选)如果用户需要在 Github 中克隆最新的 Algorithm,并自行编译打包,可以选择安装 Maven

      使用限制

      • 直接提交算法包时,点 ID 的数据必须为整数,即点 ID 可以是 INT 类型,或者是 String 类型但数据本身为整数。
      • 对于非整数的 String 类型数据,推荐使用调用算法接口的方式,可以使用 SparkSQL 的dense_rank函数进行编码,将 String 类型转换为 Long 类型。
      • 图计算会输出点的数据集,算法结果会以DataFrame形式作为点的属性存储。用户可以根据业务需求,自行对算法结果做进一步操作,例如统计、筛选。

      支持算法

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

      算法名说明应用场景属性名称属性数据类型
      PageRank 页面排序 网页排序、重点节点挖掘 pagerank double/string
      Louvain 社区发现 社团挖掘、层次化聚类 louvain int/string
      KCore K 核 社区发现、金融风控 kcore int/string
      LabelPropagation 标签传播 资讯传播、广告推荐、社区发现 lpa int/string
      Hanp 标签传播进阶版 社区发现、推荐 hanp int/string
      ConnectedComponent 联通分量 社区发现、孤岛发现 cc int/string
      StronglyConnectedComponent 强联通分量 社区发现 scc int/string
      ShortestPath 最短路径 路径规划、网络规划 shortestpath string
      TriangleCount 三角形计数 网络结构分析 trianglecount int/string
      GraphTriangleCount 全图三角形计数 网络结构及紧密程度分析 count int
      BetweennessCentrality 中介中心性 关键节点挖掘,节点影响力计算 betweenness double/string
      ClosenessCentrality 接近中心性 关键节点挖掘、节点影响力计算 closeness double/string
      DegreeStatic 度统计 图结构分析 degree,inDegree,outDegree int/string
      ClusteringCoefficient 聚集系数 推荐、电信诈骗分析 clustercoefficient double/string
      Jaccard 杰卡德相似度计算 相似度计算、推荐 jaccard string
      BFS 广度优先遍历 层序遍历、最短路径规划 bfs string
      Node2Vec - 图分类 node2vec string

      Note

      如果需要将算法结果写入到 Nebula Graph 中,请确保对应图空间中的 Tag 有和上表对应的属性名称和数据类型。

      实现方法

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

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

      2. 将 DataFrame 转换为 GraphX 的图。

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

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

      获取 Nebula Algorithm

      编译打包

      1. 克隆仓库nebula-algorithm

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

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

      Maven 远程仓库下载

      下载地址

      使用方法

      调用算法接口(推荐)

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

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

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

        如果用户的节点 ID 是 String 类型,可以参考 PageRank 的示例。示例中进行了 ID 转换,将 String 类型编码为 Long 类型, 并在算法结果中将 Long 类型 ID 解码为原始的 String 类型。

      直接提交算法包

      Note

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

      1. 设置配置文件

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

      示例:

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

      视频

      • 图计算工具——Nebula Algorithm 介绍(2 分 36 秒)
      • $ git clone -b v3.0.0 https://github.com/vesoft-inc/nebula-algorithm.git
        
      • 进入目录nebula-algorithm

         
      • $ cd nebula-algorithm
        
      • 编译打包。

         
      • <dependency>
             <groupId>com.vesoft</groupId>
             <artifactId>nebula-algorithm</artifactId>
             <version>3.0.0</version>
        </dependency>
        
      • 传入参数调用算法(以 PageRank 为例)。更多调用示例请参见示例

        Note

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

         
      • {
            # Spark 相关配置
            spark: {
            app: {
                name: LPA
                # Spark 分片数量
                partitionNum:100
            }
            master:local
            }
        
            data: {
            # 数据源,可选值为 nebula、csv、json。
            source: nebula
            # 数据落库,即图计算的结果写入的目标,可选值为 nebula、csv、json。
            sink: nebula
            # 算法是否需要权重。
            hasWeight: false
            }
        
            # Nebula Graph 相关配置
            nebula: {
            # 数据源。Nebula Graph 作为图计算的数据源时,nebula.read 的配置才生效。
            read: {
                # 所有 Meta 服务的 IP 地址和端口,多个地址用英文逗号(,)分隔。格式:"ip1:port1,ip2:port2"。
                # 使用 docker-compose 部署,端口需要填写 docker-compose 映射到外部的端口
                # 可以用`docker-compose ps`查看
                metaAddress: "192.168.*.10:9559"
                # Nebula Graph 图空间名称
                space: basketballplayer
                # Nebula Graph Edge type, 多个 labels 时,多个边的数据将合并。
                labels: ["serve"]
                # Nebula Graph 每个 Edge type 的属性名称,此属性将作为算法的权重列,请确保和 Edge type 对应。
                weightCols: ["start_year"]
            }
        
            # 数据落库。图计算结果落库到 Nebula Graph 时,nebula.write 的配置才生效。
            write:{
                # Graph 服务的 IP 地址和端口,多个地址用英文逗号(,)分隔。格式:"ip1:port1,ip2:port2"。
                # 使用 docker-compose 部署,端口需要填写 docker-compose 映射到外部的端口
                # 可以用`docker-compose ps`查看
                graphAddress: "192.168.*.11:9669"
                # 所有 Meta 服务的 IP 地址和端口,多个地址用英文逗号(,)分隔。格式:"ip1:port1,ip2:port2"。
                # 使用 docker-compose 部署,端口需要填写 docker-compose 映射到外部的端口
                # 可以用`docker-compose ps`查看
                metaAddress: "192.168.*.12:9559"
                user:root
                pswd:nebula
                # 在提交图计算任务之前需要自行创建图空间及 Tag
                # Nebula Graph 图空间名称
                space:nb
                # Nebula Graph Tag 名称,图计算结果会写入该 Tag。Tag 中的属性名称固定如下:
                # PageRank:pagerank
                # Louvain:louvain
                # ConnectedComponent:cc
                # StronglyConnectedComponent:scc
                # LabelPropagation:lpa
                # ShortestPath:shortestpath
                # DegreeStatic:degree、inDegree、outDegree
                # KCore:kcore
                # TriangleCount:tranglecpunt
                # BetweennessCentrality:betweennedss
                tag:pagerank
            }
            }  
        
            local: {
            # 数据源。图计算的数据源为 csv 文件或 json 文件时,local.read 的配置才生效。
            read:{
                filePath: "hdfs://127.0.0.1:9000/edge/work_for.csv"
                # 如果 CSV 文件没有表头,使用 [_c0, _c1, _c2, ..., _cn] 表示其表头,有表头或者是 json 文件时,直接使用表头名称即可。
                # 起始点 ID 列的表头。
                srcId:"_c0"
                # 目的点 ID 列的表头。
                dstId:"_c1"
                # 权重列的表头
                weight: "_c2"
                # csv 文件是否有表头
                header: false
                # csv 文件的分隔符
                delimiter:","
            }
        
            # 数据落库。图计算结果落库到 csv 文件或 text 文件时,local.write 的配置才生效。
            write:{
                resultPath:/tmp/
            }
        
            algorithm: {
            # 需要执行的算法,可选值为:
            # pagerank、louvain、connectedcomponent、labelpropagation、shortestpaths、
            # degreestatic、kcore、stronglyconnectedcomponent、trianglecount、
            # betweenness、graphtriangleCount。
            executeAlgo: pagerank
        
            # PageRank 参数
            pagerank: {
                maxIter: 10
                resetProb: 0.15  
            }
        
            # Louvain 参数
            louvain: {
                maxIter: 20
                internalIter: 10
                tol: 0.5
            }
        
            # ...
            }
            }
        }
        
      • 提交图计算任务。

         
       
posted @ 2022-05-30 14:35  bonelee  阅读(1095)  评论(0编辑  收藏  举报