このトピックでは、MaxComputeでGraph開発プラグインを使用できないため、Eclipseを使用してMaxCompute Graphプログラムを開発する方法について説明します。
開発プロセス:
Graphコードをコンパイルし、ローカルデバッグを実行して基本関数をテストします。
クラスターデバッグを実行して結果を確認します。
開発例
このトピックでは、SSSPアルゴリズムを例として、Eclipseを使用してMaxCompute Graphプログラムを開発およびデバッグする方法について説明します。
手順:
graph_examplesという名前のJavaプロジェクトを作成します。
MaxComputeクライアントのlibディレクトリにあるJARパッケージをEclipseプロジェクトのJava Build Pathに追加します。

MaxCompute Graph プログラムを開発します。
実際の開発プロセスでは、SSSPなどのプログラム例が最初にコピーされ、次に修正されます。 この例では、パッケージパスのみがpackage com.aliyun.odps.graph.exampleに変更されています。
コードをコンパイルしてパッケージ化します。
Eclipse環境で、ソースコードディレクトリ (srcディレクトリ) を右クリックし、 を選択してJARパッケージを生成します。 JARパッケージを格納するパス (D :\\ odps\\clt\\odps-graph-example-sssp.jarなど) を選択します。
MaxComputeクライアントでSSSPを実行します。 詳細については、「 (オプション) グラフジョブの送信」をご参照ください。
ローカルデバッグ
MaxCompute Graph はローカルデバッグモードをサポートします。 ブレークポイントのデバッグにはEclipseを使用できます。
手順:
odps-graph-localという名前のMavenパッケージをダウンロードします。
Eclipseプロジェクトを選択し、Graphジョブの
main関数を含むメインプログラムファイルを右クリックし、 を選択してパラメーターを設定します。[引数] タブで、メインプログラムの入力パラメーターとして、[プログラム引数] を1 sssp_in sssp_outに設定します。
[引数] タブで、VM引数を次の内容に設定します。
-Dodps.runner.mode=local -Dodps.project.name=<project.name> -Dodps.end.point=<end.point> -Dodps.access.id=<access.id> -Dodps.access.key=<access.key>
odps.end.pointが指定されていないローカルモードでは、sssp_Inおよびsssp_outテーブルをwarehouseディレクトリに作成し、次のデータをsssp_inテーブルに追加します。
1,"2:2,3:1,4:4" 2,"1:2,3:2,4:1" 3,"1:1,2:2,5:1" 4,"1:4,2:1,5:1" 5,"3:1,4:1"warehouseディレクトリの詳細については、「ローカルモードで実行中のジョブ」をご参照ください。
[実行] をクリックして、ローカルクライアントでSSSPを実行します。
説明MaxComputeクライアントのconf/odps_config.iniの設定に基づいてパラメーターを設定します。 上記パラメーターは共通で使用されます。 他のパラメータの説明:
odps.runner.mo de: 値はlocalです。 このパラメーターは、ローカルデバッグ機能に必要です。
odps.project.name: 現在のプロジェクトを指定します。 This parameter is required.
odps.end.point: MaxComputeのエンドポイントを指定します。 このパラメーターはオプションです。 このパラメーターを指定しない場合、テーブルまたはリソースのメタデータとデータはwarehouseディレクトリからのみ読み取られます。 そのようなデータがディレクトリに存在しない場合、例外が報告される。 このパラメーターを指定すると、メタデータとデータは最初にwarehouseディレクトリから読み取られ、そのようなデータがディレクトリに存在しない場合はリモートMaxComputeサーバーから読み取られます。
odps.access.id: MaxComputeへのアクセスに使用するAccessKey IDを指定します。 このパラメーターは、odps.end.pointが指定されている場合にのみ有効です。
odps.access.key: MaxComputeへのアクセスに使用されるAccessKeyシークレットを指定します。 このパラメーターは、odps.end.pointが指定されている場合にのみ有効です。
odps.ca che.resources: 使用するリソースを指定します。 このパラメーターは、jarコマンドの
-resourcesと同じように機能します。odps.local.warehouse: warehouseへのローカルパスを指定します。 デフォルト値は. /倉庫.
EclipseでのローカルSSSPデバッグの出力:
Counters: 3 com.aliyun.odps.graph.local.COUNTER TASK_INPUT_BYTE=211 TASK_INPUT_RECORD=5 TASK_OUTPUT_BYTE=161 TASK_OUTPUT_RECORD=5 graph task finish説明この例では、sssp_Inテーブルとsssp_outテーブルはローカルのwarehouseディレクトリに存在する必要があります。 sssp_inおよびsssp_outテーブルの詳細については、「Graphジョブの作成」をご参照ください。
ローカルジョブの一時ディレクトリ
一時ディレクトリは、ローカルデバッグが実行されるたびにEclipseプロジェクトディレクトリに作成されます。
ローカルGraphジョブの一時ディレクトリには、次のディレクトリとファイルが含まれます。
counters: ジョブの実行中に生成されたカウンタ情報を格納します。
inputs: ジョブの入力データを格納します。 データは最初にローカルwarehouseディレクトリから読み取られます。 利用可能なデータがない場合、odps.end.pointが指定されている場合、MaxCompute SDKはサーバーからデータを読み取ります。 inputディレクトリは、デフォルトで10個のデータレコードのみを読み取ります。 このしきい値は、
-Dodps.mapred.local.record.limitパラメーターを使用して変更できます。最大値は10000です。outputs: ジョブの出力データを格納します。 出力テーブルがローカルのwarehouseディレクトリに存在する場合、出力の結果は、ジョブの完了後にそのテーブルのデータを上書きします。
resources: ジョブで使用されるリソースを格納します。 入力データと同様に、リソースデータは最初にローカルwarehouseディレクトリから読み取られます。 利用可能なデータがない場合、odps.end.pointが指定されている場合、MaxCompute SDKはサーバーからデータを読み取ります。
job.xml: ジョブの設定を格納します。
superstep: 各イテレーションからの永続的なメッセージを格納します。
ローカルデバッグ中に詳細ログを記録する必要がある場合は、srcディレクトリにlog4j.properties_odps_graph_cluster_debugという名前のlog4j設定ファイルを作成する必要があります。
クラスタデバッグ
ローカルデバッグ後、テストのためにジョブをクラスターに送信できます。
手順:
MaxCompute クライアントを設定します。
add jar /path/work.jar -f;コマンドを実行し、JARパッケージを更新します。jarコマンドを実行してジョブを実行し, 操作ログとコマンド出力を確認してください。
クラスターでGraphジョブを実行する方法の詳細については、「Graphジョブの作成」をご参照ください。
パフォーマンスの最適化
グラフのパフォーマンスに影響する設定:
setSplitSize(long): 入力テーブルの分割サイズを指定します。 単位は MB です。 値は0より大きくなければなりません。 デフォルト値は64です。setNumWorkers(int): ジョブのワーカー数を指定します。 値の範囲は1から1000です。 デフォルト値は 1 です。 ワーカーの数は、ジョブの入力バイト数とsplitSizeによって決まります。setWorkerCPU(int): MapのCPUリソースを指定します。 値の範囲は50から800です。 デフォルト値は 200 です。 1 コア CPU は 100 リソースを含んでいます。setWorkerMemory(int): Mapのメモリリソースを指定します。 単位は MB です。 メモリの範囲は256から12288です。 デフォルト値は 4096 です。setMaxIteration(int): 最大反復回数を指定します。 デフォルト値は-1です。 値が0以下の場合、最大反復回数に達してもジョブは停止しません。setJobPriority(int): ジョブの優先度を指定します。 値の範囲は0から9です。 デフォルト値は9です。 値が大きいほど、優先度が低くなります。
次の1つ以上の方法を使用してパフォーマンスを最適化することを推奨します。
setNumWorkersを使用してワーカーの数を増やします。setSplitSizeを使用して、分割サイズを縮小し、データの読み込み速度を上げます。ワーカーのCPUまたはメモリリソースを増やします。
反復の最大数を設定します。 正確な結果を必要としないアプリケーションでは、反復回数を減らして実行プロセスを高速化できます。
setNumWorkersとsetSplitSizeを一緒に使用して、データの読み込みを高速化できます。 setNumWorkersの値がworkerNumの値と等しく、setSplitSizeの値がsplitSizeの値と等しく、入力バイトの総数がinputSizeの値であるとします。 分割データレコードの数は、次の式を使用して計算されます。splitNum = inputSize/splitSize。 workerNumとsplitNumの関係:
splitNumの値がworkerNumの値と等しい場合、各ワーカーは1つの分割データレコードを読み込みます。splitNumの値がworkerNumの値より大きい場合、各ワーカーは1つ以上の分割データレコードを読み込みます。splitNumの値がworkerNumの値より小さい場合、各ワーカーは分割データレコードを1つアップロードするか、まったくアップロードしません。
したがって、workerNumとsplitSizeを調整して、適切なデータ読み込み速度を得ることができます。 最初の2つのケースでは、データのロードが速くなります。 イテレーションフェーズでは、workerNumを調整するだけです。 ランタイムパーティショニングをFalseに設定した場合、setSplitSizeを使用してワーカーの数を調整するか、最初の2つのケースの条件が満たされていることを確認することを推奨します。 3番目のケースでは、一部のワーカーは分割データレコードをロードしません。 したがって、jarコマンドの前にset odps.graph.split.size=<m>; set odps.graph.worker.num=<n>; を挿入して、setNumWorkersおよびsetSplitSizeと同じ効果を得ることができます。
もう1つの一般的なパフォーマンスの問題は、データスキューです。 カウンタによって示されるように、一部のワーカーは、他のワーカーよりも過剰な分割データレコードまたはエッジを処理する。 データスキューは、一部のキーに対応する分割データレコード、エッジ、またはメッセージの数が他のキーよりもはるかに多い場合に発生します。 これらのキーは少数のワーカーによって処理されるため、ランタイムが長くなります。 この問題に対処するには、次の1つ以上の方法を試してください。
コンバイナを使用して、キーに対応する分割データレコードのメッセージを集約し、生成されるメッセージの数を減らします。
開発者はコンバイナを定義して、メッセージストレージで消費されるメモリとネットワークトラフィックを削減し、ジョブの実行時間を短縮できます。
ビジネスロジックを改善します。
データ量が大きい場合、ディスクのデータを読み出すために処理時間がかかることがある。 したがって、読み取られるデータバイトを減らして、全体的なスループットを向上させることができます。 これにより、ジョブのパフォーマンスが向上します。 データバイト数を減らすには、次のいずれかの方法を使用します。
データ入力の削減: 一部の意思決定アプリケーションでは、サンプリングされたデータの処理は結果の精度にのみ影響し、全体的な精度には影響しません。 この場合、特別なデータサンプリングを実行し、データを入力テーブルにインポートして処理することができます。
使用されないフィールドの読み取りを避ける: MaxCompute GraphフレームワークのTableInfoクラスは、テーブル全体またはパーティション全体を読み取るのではなく、列名配列を使用して転送される特定の列の読み取りをサポートします。 これにより入力データ量が減り、ジョブのパフォーマンスが向上します。
組み込みのJARパッケージ
デフォルトでは、次のJARパッケージがGraphプログラムを実行するJVMに読み込まれます。 これらのリソースを手動でアップロードしたり、-libjarsを使用してコマンドで指定する必要はありません。
commons-codec-1.3.jar
commons-io-2.0.1.jar
commons-lang-2.5.jar
commons-logging-1.0.4.jar
commons-logging-api-1.0.4.jar
グアバ-14.0.jar
json.jar
log4j-1.2.15.jar
slf4j-api-1.4.3.jar
slf4j-log4j12-1.4.3.jar
xmlenc-0.52.jar
JVMのクラスパスでは、上記の組み込みJARパッケージがJARパッケージの前に配置され、バージョンが競合する可能性があります。 たとえば、プログラムはcommons-codec-1.5.jarの特定のクラス関数を呼び出しますが、その関数はcommons-codec-1.3.jarに含まれていません。 この場合、commons-codec-1.3.jarで同様の関数を呼び出すか、MaxComputeが必要なバージョンに更新されるまで待つかを選択できます。