1. 程式人生 > 其它 >圖計算之 nebula-algorithm——todo,待實踐,感覺有大坑

圖計算之 nebula-algorithm——todo,待實踐,感覺有大坑

寫在前面:

nebula-algorithm 目前僅支援 Nebula Graph v1.x,不支援 Nebula Graph v2.x。

這玩意是不是有大坑啊! 我看1.21以下都不支援了。。。

圖計算之 nebula-algorithm

在開始 nebula-algorithm 介紹之前,先貼一個它的開源地址:

Nebula 圖計算

目前 Nebula 圖計算集成了兩種不同圖計算框架,共有 2 款產品:nebula-algorithm 和 nebula-plato。

nebula-algorithm 是社群版本,同 nebula-plato 的不同之處在於,nebula-algorithm 提供了 API 介面來進行演算法呼叫,

最大的優勢在於集成了 [GraphX](https://spark.apache.org/docs/latest/graphx-programming-guide.html),可無縫對接 Spark 生態。正是由於 nebula-algorithm 基於 GraphX 實現,所以底層的資料結構是 RDD 抽象,在計算過程中會有很大的記憶體消耗,相對的速度會比較慢。

nebula-plato 上面介紹過,資料內部要進行 ID 編碼對映,即便是 int ID,但如果不是從 0 開始遞增,都需要進行 ID 編碼。nebula-plato 的優勢就是記憶體消耗是比較小,所以它跑演算法時,在相同資料和資源情況下,nebula-plato 速度是相對比較快的

上圖左側是是 nebula-algorithm 和 nebula-plato 的架構,二者皆從儲存層 Nebula Storage 中拉取資料。GraphX 這邊(nebula-algorithm)主要是通過 Spark Connector 來拉取儲存資料,寫入也是通過 Spark Connector。

nebula-algorithm 使用方式

jar 包提交

==》這個圖就比較能說明問題了!!!

通過 jar 包的方式整個流程如上圖所示:通過配置檔案配置資料來源,目前配置檔案資料來源支援 Nebula Graph、HDFS 上 CSV 檔案以及本地檔案。資料讀取後被構造成一個 GraphX 的圖,該圖再呼叫 nebula-algorithm

的演算法庫。演算法執行完成後會得到一個演算法結果的 data frame(DF),其實是一張二維表,基於這張二維表,Spark Connector 再寫入資料。這裡的寫入可以把結果寫回到圖資料庫,也可以寫入到 HDFS 上。

API 呼叫

更推薦大家通過 API 呼叫的方式。像上面通過 jar 包形式在後面的資料寫入部分是不處理資料的。而採用 API 呼叫方式,在資料寫入部分可進行資料預處理,或是對演算法結果進行統計分析。 API 呼叫的流程如上圖所示,主要分為 4 步:

  1. 自定義資料來源 df(id 為數值型資料)
  2. 定義演算法配置 louvainConfig
  3. 執行演算法
  4. 對演算法結果統計計算或直接展示

上圖的程式碼部分則為具體的呼叫示例。先定義個 Spark 入口:SparkSession,再通過 Spark 讀取資料來源 df,這種形式豐富了資料來源,它不侷限於讀取 HDFS 上的 CSV,也支援讀取 HBase 或者 Hive 資料。上述示例適用於頂點 ID 為數值型別的圖資料,String 型別的 ID 在後面介紹。

回到資料讀取之後的操作,資料讀取之後將進行演算法配置。上圖示例呼叫 Louvain 演算法,需要配置下 LouvainConfig 引數資訊,即 Louvain 演算法所需的引數,比如迭代次數、閾值等等。

演算法執行完之後你可以自定義下一步操作結果統計分析或者是結果展示,上面示例為直接展示結果 louvain.show()

ID Mapping 對映原理與實現

再來介紹下 ID 對映,String ID 的處理。

熟悉 GraphX 的小夥伴可能知道它是不支援 String ID 的,當我們的資料來源 ID 是個 String 該如何處理呢?

同社群使用者 GitHub issue 和論壇的日常交流中,許多使用者都提到了這個問題。這裡給出一個程式碼示例:

從上面的流程圖上,我們可以看到其實同之前呼叫流程相同,只是多兩步:ID Mapping對結算結果做 ID & 結果的反 Mapping。因為演算法執行結果是數值型,所以需要做一步反 Mapping 操作使得結果轉化為 String 型別。

上圖為 ID 對映(Mapping)的過程,在演算法呼叫的資料來源(方框 1)顯示該資料為邊資料,且為 String 型別(a、b、c、d),當中的 1.0、2.0 等等列資料為邊權重。在第 2 步中將會從邊資料中提取點資料,這裡我們提取到了 a、b、c、d,提取到點資料之後通過 ID 對映生成 long 型別的數值 ID(上圖藍色框)。有了數值型別的 ID 之後,我們將對映之後的 ID 資料(藍色框)和原始的邊資料(方框 1)進行 Join 操作,得到一個編碼之後的邊資料(方框 4)。編碼之後的資料集可用來做演算法輸入,演算法執行之後得到資料結果(黃色框),我們可以看到這個結果是一個類似二維表的結構。

為了方便理解,我們假設現在這個是 PageRank 的演算法執行過程,那我們得到的結果資料(黃色框)右列(2.2、2.4、3.1、1.4)則為計算出來的 PR 值。但這裡的結果資料並非是最終結果,別忘了我們的原始資料是 String 型別的點資料,所以我們要再做下流程上的第 5 步:對結算結果做 ID & 結果的反 Mapping,這樣我們可以得到最終的執行結果(綠色框)。

要注意的是,上圖是以 PageRank 為例,因為 PageRank 的演算法執行結果(黃框右列資料)為 double 型別數值,所以不需要做 ID 反對映,但是如果上面的流程執行的演算法為連通分量或是標籤傳播,它的演算法執行結果第二列資料是需要做 ID 反對映的。

節選下 PageRank 的程式碼中的實現

def pagerankWithIdMaping(spark: SparkSession, df: DataFrame): Unit = {
    val encodedDF      = convertStringId2LongId(df)
    val pageRankConfig = PRConfig(3, 0.85)
    val pr             = PageRankAlgo.apply(spark, encodedDF, pageRankConfig, false)
    val decodedPr      = reconvertLongId2StringId(spark, pr)
    decodedPr.show()
}

我們可以看到演算法呼叫之前通過執行 val encodedDF = convertStringId2LongId(df) 來進行 String ID 到 Long 型別的對映,語句執行完之後,我們才會呼叫演算法,演算法執行之後再來進行反對映 val decodedPr = reconvertLongId2StringId(spark, pr)

在直播視訊(B站:)中,講述了 PageRank 示例程式碼實現,有興趣的小夥伴可以看下視訊 24‘31 ~ 25'24 的程式碼講解,當中也講述了編碼對映的實現。

nebula-algorithm 支援的演算法

上圖展示的是我們在 v3.0 版本中將會支援的圖演算法,當然當中部分的圖演算法在 v2.0 也是支援的,不過這裡不做贅述具體的可以檢視 GitHub 的文件:

按照分類,我們將現支援的演算法分為了社群類、節點重要性、關聯性、圖結構類、路徑類和圖表示等 6 大類。雖然這裡只是列舉了 nebula-algorithm 的演算法分類,但是企業版的 nebula-plato 的演算法分類也是類似的,只不過各個大類中的內部演算法會更豐富點。根據目前社群使用者的提問反饋來講,演算法使用方便主要以上圖的社群類和節點重要性兩類為主,可以看到我們也是針對性的更加豐富這 2 大類的演算法。如果你在 nebula-algorithm 使用過程中,開發了新的演算法實現,記得來 GitHubnebula-algorithm 提個 pr 豐富它的演算法庫。

下圖是社群發現比較常見的 Louvain、標籤傳播演算法的一個簡單介紹:

由於之前寫過相關的演算法介紹,這裡不做贅述,可以閱讀《GraphX 在圖資料庫 Nebula Graph 的圖計算實踐》

這裡簡單介紹下連通分量演算法

連通分量一般指的是弱連通分量,演算法針對無向圖,它的計算流程相對簡單。如上圖右側所示,以虛線劃分的 5 個小社群,在計算連通分量過程中,每個社群之間的連線(紅色框)是不做計算的。你可理解為從圖資料庫中抽取出 1 個子圖來進行 1 個聯通分量的計算,計算出來有 5 個小連通分量。這時候基於全圖去資料分析,不同的小社群之間又增加了連線邊(紅色框),將它們連線起來。

社群演算法的應用場景

銀行領域

再來看個具體的應用場景,在銀行中存在這種情況,一個身份證號對應多個手機號、多臺手機裝置、多張借記卡、多張信用卡,還有多個 APP。而這些銀行資料會分散儲存,要做關聯分析時,可以先通過聯通分量來去計算小社群。舉個例子:把同一個人所擁有的不同的裝置、手機號等資料資訊歸到同一連通分量,把它們作為一個持卡人實體,再進行下一步計算。簡單來說,將分散資料通過演算法聚合成大節點統一分析。

安防領域

上圖是 Louvain 演算法在安防領域的應用,可以看到其實整個業務處理流程中,演算法本身的比重佔比並不高,整個處理流程 80% 左右是在對資料做預處理和後續結果進行統計分析。不同領域有不同的資料,領域源資料按業務場景進行實際的圖建模。 以公安為例,通過公安資料進行人、車、網咖、酒店等實體抽取,即圖資料庫中可以分成這 4 個 tag(人、車、網咖、酒店),基於使用者的動態資料抽象出擁有關係、同行關係、同住關係,即對應到圖資料庫中的 Edge Type。完成資料建模之後,再進行演算法建模,根據業務場景選擇抽取全圖,還是抽取子圖進行圖計算。資料抽取後,需要進行資料預處理。資料預處理包括很多操作,比如將資料拆分成兩類,一類進行模型訓練,另外一類進行模型驗證;或是對資料進行權重、特徵方面的數值類轉換,這些都稱為資料的一個預處理。

資料預處理完之後,執行諸如 Louvain、節點重要程度之類的演算法。計算完成後,通常會將基於點資料得到的新特徵回溯到圖資料庫中,即圖計算完成後,圖資料庫的 Tag 會新增一類屬性,這個新屬性就是 Tag 的新特徵。計算結果寫回到圖資料庫後,可將圖資料庫的資料讀取到 Studio 畫布進行視覺化分析。這裡需要領域專家針對具體業務需求進行視覺化分析,或者資料完成計算後進入到 GCN 進行模型訓練,最終得到黑名單。 以上為本次圖計算的概述部分,下面為來自社群的一些相關提問。

社群提問

這裡摘錄了部分的社群使用者提問,所有問題的提問可以觀看直播視訊 33‘05 開始的問題回覆部分。

演算法內部原理

dengchang:想了解下圖計算各類成熟演算法的內部原理,如果有結合實際場景跟資料的講解那就更好了。

Nicole:趙老師可以看下之前的文章,比如:

一些相對比較複雜的演算法,在直播中不便展開講解,後續會發布文章來詳細介紹。

圖計算的規劃

en,coder:目前我看到 Nebula Algorithm 計算要將資料庫資料匯出到 Spark,計算完再匯入到資料庫。後續是否考慮支援不匯出,至少輕量級演算法的計算,結果展示在 Studio。

Nicole:先回復前面的問題,其實用 nebula-algorithm 計算完不一定要將結果匯入到圖資料庫,目前 nebula-algorithm 的 API 呼叫和jar 包提交兩種方式均允許把結果寫入到 HDFS。是否要將結果資料匯入圖資料庫取決於你後續要針對圖計算結果進行何種處理。至於“後續是否支援不匯出,至少輕量級的計算”,我的理解輕量級的演算法計算是不是先把資料從圖資料庫中查出來,在畫布展示,再針對畫布中所展示出來的一小部分資料進行輕量級計算,計算結果立馬去通過 Studio 展示在畫布中,而不是在寫回到圖資料庫。如果是這樣的話,其實後續 Nebula 有考慮去做個圖計算平臺,結合了 AP 和 TP,針對畫布中的資料,也可以考慮進行簡單的輕量級計算,計算結果是否要寫回到圖資料庫由使用者去配置。回到需求本身,是否進行畫布資料的輕量級計算還是取決於你的具體場景,是否需要進行這種操作。

潮與虎:nebula-algorithm 打算支援 Flink 嗎?

Nicole:這裡可能指的是 Flink 的 Gelly 做圖計算,目前暫時沒有相關的打算。

繁凡:有計劃做基於 nGQL 的模式匹配嗎?全圖的 OLAP 計算任務,實際場景有一些模式匹配的任務,一般自己開發程式碼,但是效率太低。

郝彤:模式匹配是個 OLTP 場景,TP 受限於磁碟的速度較慢,所以想用在 OLAP 上,但是 OLAP 通常是處理傳統演算法,不支援模式匹配。其實後續 AP 和 TP 融合之後,圖資料放在記憶體中,速度會提升。

 

 

 

PageRank演算法實踐

演示環境

  • 三臺虛擬機器,環境如下:
    • 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 [email protected]: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

https://docs.nebula-graph.com.cn/1.2.1/nebula-algorithm/na-ug-what-is-nebula-algorithm/

什麼是 nebula-algorithm

nebula-algorithm 是一款基於 GraphX 的 Spark 應用程式,提供了 PageRank 和 Louvain 社群發現的圖計算演算法。使用 nebula-algorithm,您能以提交 Spark 任務的形式對 Nebula Graph 資料庫中的資料執行圖計算。

目前 nebula-algorithm 僅提供了 PageRank 和 Louvain 社群發現演算法。如果您有其他需求,可以參考本專案,編寫 Spark 應用程式呼叫 GraphX 自帶的其他圖演算法,如 LabelPropagation、ConnectedComponent 等。

實現方法

nebula-algorithm 根據以下方式實現圖演算法:

  1. 從 Nebula Graph 資料庫中讀取圖資料並處理成 DataFrame。
  2. 將 DataFrame 轉換為 GraphX 的圖。
  3. 呼叫 GraphX 提供的圖演算法(例如 PageRank)或者您自己實現的演算法(例如 Louvain 社群發現)。

詳細的實現方式,您可以參考 LouvainAlgo.scala 和 PageRankAlgo.scala

PageRank 和 Louvain 簡介

PageRank

GraphX 的 PageRank 演算法基於 Pregel 計算模型,該演算法流程包括 3 個步驟:

  1. 為圖中每個頂點(如網頁)設定一個相同的初始 PageRank 值。
  2. 第一次迭代:沿邊傳送訊息,每個頂點收到所有關聯邊上鄰接點(Adjacent Node)的資訊,得到一個新的 PageRank 值;
  3. 第二次迭代:用這組新的 PageRank 按不同演算法模式對應的公式形成該頂點新的 PageRank。

關於 PageRank 的詳細資訊,參考 Wikipedia PageRank 頁面

Louvain

Louvain 是基於模組度(Modularity)的社群發現演算法,通過模組度來衡量一個社群的緊密程度,屬於圖的聚類演算法。如果一個頂點加入到某一社群中使該社群的模組度相比其他社群有最大程度的增加,則該頂點就應當屬於該社群。如果加入其它社群後沒有使其模組度增加,則留在自己當前社群中。詳細資訊,您可以參考論文《Fast unfolding of communities in large networks》

Louvain 演算法包括兩個階段,其流程就是這兩個階段的迭代過程。

  1. 階段一:不斷地遍歷網路圖中的頂點,通過比較頂點給每個鄰居社群帶來的模組度的變化,將單個頂點加入到能夠使 Modulaity 模組度有最大增量的社群中。例如,頂點 v 分別加入到社群 A、B、C 中,使得三個社群的模組度增量為 -1、1、2,則頂點 v 最終應該加入到社群 C 中。
  2. 階段二:對第一階段進行處理,將屬於同一社群的頂點合併為一個大的超點重新構造網路圖,即一個社群作為圖的一個新的頂點。此時兩個超點之間邊的權重是兩個超點內所有原始頂點之間相連的邊權重之和,即兩個社群之間的邊權重之和。

整個 Louvain 演算法就是不斷迭代第一階段和第二階段,直到演算法穩定(圖的模組度不再變化)或者到達最大迭代次數。

使用場景

您可以將 PageRank 演算法應用於以下場景:

  • 社交應用的相似度內容推薦:在對微博、微信等社交平臺進行社交網路分析時,可以基於 PageRank 演算法根據使用者通常瀏覽的資訊以及停留時間實現基於使用者的相似度的內容推薦。
  • 分析使用者社交影響力:在社交網路分析時根據使用者的 PageRank 值進行使用者影響力分析。
  • 文獻重要性研究:根據文獻的 PageRank 值評判該文獻的質量,PageRank 演算法就是基於評判文獻質量的想法來實現設計。

您可以將 Louvain 演算法應用於以下場景:

  • 金融風控:在金融風控場景中根據使用者行為特徵進行團伙識別。
  • 社交網路:基於網路關係中點對(一條邊連線的兩個頂點)之間關聯的廣度和強度進行社交網路劃分;對複雜網路分析、電話網路分析人群之間的聯絡密切度。
  • 推薦系統:基於使用者興趣愛好的社群發現,可以根據社群並結合協同過濾等推薦演算法進行更精確有效的個性化推薦。

使用限制

nebula-algorithm 目前僅支援 Nebula Graph v1.x,不支援 Nebula Graph v2.x。

編譯 nebula-algorithm

前提條件

編譯 nebula-algorithm 之前,必須先編譯 Nebula Spark Connector

操作步驟

切換到 nebula-java/tools/nebula-algorithm 目錄,並編譯打包 nebula-algorithm。

 
$ cd nebula-java/tools/nebula-algorithm
$ mvn clean package -Dgpg.skip -Dmaven.javadoc.skip=true -Dmaven.test.skip=true

編譯成功後,您可以在當前目錄裡看到如下目錄結構。

 
.
├── README.md
├── pom.xml
├── src
│   ├── main
│   └── test
└── target
    ├── classes
    ├── classes.682519136.timestamp
    ├── maven-archiver
    ├── maven-status
    ├── nebula-algorithm-1.x.y-tests.jar
    ├── nebula-algorithm-1.x.y.jar
    ├── original-nebula-algorithm-1.x.y.jar
    ├── test-classes
    └── test-classes.682519136.timestamp

target 目錄下,您可以看到 nebula-algorithm-1.x.y.jar 檔案。

說明:JAR 檔案版本號會因 Nebula Java Client 的釋出版本而異。您可以在 nebula-java 倉庫的 Releases 頁面 檢視最新的 v1.x 版本。

後續操作

在使用 nebula-algorithm 時,您可以參考 target/classes/application.conf 根據實際情況修改配置檔案。詳細資訊請參考 使用示例

使用示例

一般,您可以按以下步驟使用 nebula-algorithm:

  1. 參考配置檔案修改 nebula-algorithm 的配置。
  2. 執行 nebula-algorithm。

本文以一個示例說明如何使用 nebula-algorithm。

示例環境

  • 三臺虛擬機器,配置如下:
    • CPU:Intel(R) Xeon(R) Platinum 8260M CPU @ 2.30GHz
    • Processors:32
    • CPU Cores:16
    • 記憶體:128 GB
  • 軟體環境:
    • Spark:spark-2.4.6-bin-hadoop2.7 三個節點叢集
    • yarn V2.10.0:三個節點叢集
    • Nebula Graph V1.2.1:分散式部署,預設配置

示例資料

在本示例中,Nebula Graph 圖空間名稱為 algoTest,Schema 要素如下表所示。

要素 名稱 屬性
標籤 PERSON
邊型別 FRIEND likeness(double)

前提條件

在操作之前,您需要確認以下資訊:

  • 已經完成 nebula-algorithm 編譯。詳細資訊參考 編譯 nebula-algorithm
  • Nebula Graph 資料庫中已經有圖資料。您可以使用不同的方式將其他來源的資料匯入 Nebula Graph 資料庫中,例如 Spark Writer
  • 當前機器上已經安裝 Spark 並已啟動 Spark 服務。

第 1 步. 修改配置檔案

根據專案中的 src/main/resources/application.conf 檔案修改 nebula-algorithm 配置。

 
{
  # Spark 相關設定
  spark: {
    app: {
        # Spark 應用程式的名稱,可選項。預設設定為您即將執行的演算法名稱,例如 PageRank
        name: PageRank

        # Spark 中分割槽數量,可選項。
        partitionNum: 12
    }

    master: local

    # 可選項,如果這裡未設定,則在執行 spark-submit spark 任務時設定
    conf: {
        driver-memory: 20g
        executor-memory: 100g
        executor-cores: 3
        cores-max:6
    }
  }

  # Nebula Graph 相關配置
  nebula: {
    # 必需。Meta 服務的資訊
    addresses: "127.0.0.1:45500" # 如果有多個 Meta 服務複本,則以英文逗號隔開
    user: root
    pswd: nebula
    space: algoTest
    # 必需。建立圖空間時設定的分割槽數量。如果建立圖空間時未設定分割槽數,則設定為預設值 100
    partitionNumber: 100
    # 必需。Nebula Graph 的邊型別,如果有多種邊型別,則以英文逗號隔開
    labels: ["FRIENDS"]

    hasWeight: true
    # 如果 hasWeight 配置為 true,則必須配置 weightCols。根據 labels 列出的邊型別,按順序在 weightCols 裡設定對應的屬性,一種邊型別僅對應一個屬性
    # 說明:nebula-algorithm 僅支援同構圖,所以,weightCols 中列出的屬性的資料型別必須保持一致而且均為數字型別
    weightCols: ["likeness"] # 如果 labels 裡有多種邊型別,則相應設定對應的屬性,屬性之間以英文逗號隔開
  }

  algorithm: {
    # 指定即將執行的演算法,可以配置為 pagerank 或 louvain
    executeAlgo: louvain
    # 指定演算法結果的儲存路徑
    path: /tmp

    # 如果選擇的是 PageRank,則配置 pagerank 相關引數
    #pagerank: {
    #    maxIter: 20
    #    resetProb: 0.15  # 預設值為 0.15
    #}

    # 如果選擇的是 louvain,則配置 louvain 相關引數
    #louvain: {
    #   maxIter: 20
    #    internalIter: 10
    #    tol: 0.5
   #}
  }
}

第 2 步. 執行 nebula-algorithm

執行以下命令,提交 nebula-algorithm 應用程式。

 
spark-submit --master "local" --class com.vesoft.nebula.tools.algorithm.Main /your-jar-path/nebula-algorithm-1.x.y.jar -p /your-application.conf-path/application.conf

其中,

  • --master:指定 Spark 叢集中Master 程序的 URL。詳細資訊,參考 master-urls
  • --class:指定 Driver 主類。
  • 指定 nebula-algorithm JAR 檔案的路徑,JAR 檔案版本號以您實際編譯得到的 JAR 檔名稱為準。
  • -p:Spark 配置檔案檔案路徑。
  • 其他:如果您未在配置檔案中設定 Spark 的任務資源分配(conf)資訊,您可以在這個命令中指定。例如,本示例中,--driver-memory=20G --executor-memory=100G --executor-cores=3

測試結果

按本示例設定的 Spark 任務資源分配,對於一個擁有一億個資料的資料集:

  • PageRank 的執行時間(PageRank 演算法執行時間)為 21 分鐘
  • Louvain 的執行時間(Reader + Louvain 演算法執行時間)為 1.3 小時