すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:グラフの概要

最終更新日:Jan 24, 2025

MaxCompute Graphは、反復グラフ計算用に設計された処理フレームワークです。 グラフ計算ジョブでは、グラフを使ってモデルが構築されます。 グラフは、値を持つ頂点とエッジのコレクションです。 MaxCompute Graphが提供するSDK for Javaを使用して、グラフコンピューティングプログラムを作成できます。

MaxCompute Graphでは、グラフに対して次の操作を実行できます。

  • 頂点またはエッジの値を変更します。

  • 頂点を追加または削除します。

  • エッジを追加または削除します。

説明

頂点またはエッジを編集するときは、頂点とエッジの関係を維持するためのコードを使用する必要があります。

MaxCompute Graphは、イテレーションを実行してグラフを編集し、グラフを進化させ、分析結果を取得します。 典型的なアプリケーションには、PageRank単一ソース最短パス (SSSP) アルゴリズム、およびk-meansアルゴリズムが含まれます。 MaxCompute Graphが提供するSDK for Javaを使用して、グラフ計算プログラムをコンパイルできます。

用語

  • グラフ: オブジェクト間の関係を表すために使用される抽象データ構造。 頂点とエッジはグラフで使用されます。 頂点はオブジェクトを表し、エッジはオブジェクト間の関係を表します。 グラフに記述されたデータをグラフデータと呼ぶ。

  • Vertex: グラフ内のオブジェクトを表します。

  • エッジ: グラフ内のオブジェクト間の関係を表す単一の有向エッジ。 エッジは、ソース頂点ID、宛先頂点ID、およびエッジに関連するデータからなる。

  • 有向グラフ: エッジが方向を有するグラフ。 エッジ上の2つの頂点は、異なるオブジェクトを表す。 例えば、ページAはページBに接続されている。有向グラフでは、エッジは出て行くエッジと入ってくるエッジに分類される。

  • 無向グラフ: ユーザーグループ内の一般的なユーザーなど、エッジに方向がないグラフ。

  • 出力エッジ: 現在の頂点が原点である有向エッジ。

  • 着信エッジ: 現在の頂点が宛先である有向エッジ。

  • 度: 頂点に接続するエッジの数。

  • Outdegree: 頂点に接続する出力エッジの数。

  • Indegree: 頂点に接続する入力エッジの数。

  • スーパーステップ: グラフの反復。

グラフデータ構造

MaxCompute Graphは有向グラフを処理します。 MaxComputeは、2次元のテーブルストレージ構造のみを提供します。 したがって、グラフデータを2次元のテーブルに解決し、MaxComputeに保存する必要があります。 ビジネス要件に基づいてグラフデータを解決できます。

グラフの計算と分析中に、カスタムGraphLoaderを使用して、2次元テーブルデータをMaxCompute graphに適用可能な頂点とエッジに変換します。

  • 頂点の構造は <ID, 値, Halted, Edges> です。 パラメーター:

    • ID: 頂点のID。

    • 値: 頂点の値。

    • Halted: 頂点の反復を終了するかどうかを指定します。

    • エッジ: 頂点から始まるエッジ。

  • エッジの構造は <DestVertexID, Value> です。 パラメーター:

    • DestVertexID: 宛先頂点のID。

    • 値: エッジの値。

たとえば、上の図は次の2次元テーブルで表すことができます。

頂点

<ID、値、停止、エッジ>

v0

<0, 0, false, [<1,5>, <2,10>]>

v1

<1, 5, false, [<2,3>, <3,2>, <5,9>]>

v2

<2, 8, false, [<1, 2>, <5, 1 >]>

v3

<3, Long.MAX_VALUE, false, [<0, 7>, <5, 6>]>

v5

<5, Long.MAX_VALUE, false, [<3, 4 >]>

Graphプログラムのロジック

グラフプログラムは、グラフロード、反復計算、および反復終了の操作を実行します。

  1. グラフの読み込み。

    グラフの読み込みは、次の手順で構成されます。

    1. グラフの読み込み: MaxCompute GraphはカスタムGraphLoaderを呼び出して、入力テーブルのレコードを頂点またはエッジに解決します。

    2. パーティショニング: MaxCompute Graphは、カスタムのPartitionerを呼び出して頂点をパーティション分割し、パーティションを関連するワーカーに配布します。 デフォルトでは、MaxCompute Graphは、ワーカーの数を法とする頂点IDのハッシュ値に基づいて頂点を分割します。

    上の図では、ワーカーの数は2です。 頂点0と頂点2は、頂点IDモジュロ2の結果が0であるため、Worker 0に分散されます。 頂点1、頂点3、および頂点5は、頂点IDモジュロ2の結果が1であるため、Worker 1に分散される。

  2. 反復コンピューティング。

    反復はスーパーステップと呼ばれます。 反復中、プログラムは、停止されていないすべての頂点またはメッセージを受信するすべての頂点をトラバースし、compute(ComputeContextコンテキスト、反復可能メッセージ) メソッドを呼び出します。 停止していない頂点の場合、haltedパラメーターの値はfalseです。 停止した頂点は、メッセージを受信すると自動的にアクティブになります。

    compute(ComputeContext context, Iterable messages) メソッドを使用して、次の操作を実行できます。

    • 前のスーパーステップによって現在の頂点に送信されたメッセージを処理します。

    • 必要に応じてグラフを編集する:

      • 頂点またはエッジの値を変更します。

      • いくつかの頂点にメッセージを送信します。

      • 頂点またはエッジを追加または削除します。

    • アグリゲーターを使用して情報を収集し、グローバル情報を更新します。 詳細については、「Aggregator実装メカニズム」をご参照ください。

    • 現在の頂点を停止状態または非停止状態に設定します。

    • MaxCompute Graphを有効にして、各スーパーステップで関連するワーカーにメッセージを非同期で送信します。 メッセージは次のスーパーステップで処理されます。

  3. 反復終了。

    次の条件の1つ以上が満たされると、イテレーションは終了します。

    • すべての頂点は停止状態にあり (haltedパラメーターの値はtrue) 、新しいメッセージは生成されません。

    • 反復の最大数に達した。

    • アグリゲータのterminateメソッドはtrueを返します。

    Graphプログラムの疑似コード:

    // 1. load
    for each record in input_table {
      GraphLoader.load();
    }
    // 2. setup
    WorkerComputer.setup();
    for each aggr in aggregators {
      aggr.createStartupValue();
    }
    for each v in vertices {
      v.setup();
    }
    // 3. superstep
    for (step = 0; step < max; step ++) {
      for each aggr in aggregators {
        aggr.createInitialValue();
      }
      for each v in vertices {
         v.compute();
       }
    }
    // 4. cleanup
    for each v in vertices {
      v.cleanup();
    }
    WorkerComputer.cleanup();