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

MaxCompute:開発とデバッグ

最終更新日:Jan 07, 2025

このトピックでは、MaxComputeでGraph開発プラグインを使用できないため、Eclipseを使用してMaxCompute Graphプログラムを開発する方法について説明します。

開発プロセス:

  1. Graphコードをコンパイルし、ローカルデバッグを実行して基本関数をテストします。

  2. クラスターデバッグを実行して結果を確認します。

開発例

このトピックでは、SSSPアルゴリズムを例として、Eclipseを使用してMaxCompute Graphプログラムを開発およびデバッグする方法について説明します。

手順:

  1. graph_examplesという名前のJavaプロジェクトを作成します。

  2. MaxComputeクライアントのlibディレクトリにあるJARパッケージをEclipseプロジェクトのJava Build Pathに追加します。

  3. MaxCompute Graph プログラムを開発します。

    実際の開発プロセスでは、SSSPなどのプログラム例が最初にコピーされ、次に修正されます。 この例では、パッケージパスのみがpackage com.aliyun.odps.graph.exampleに変更されています。

  4. コードをコンパイルしてパッケージ化します。

    Eclipse環境で、ソースコードディレクトリ (srcディレクトリ) を右クリックし、[エクスポート] > [Java] > [JARファイル] を選択してJARパッケージを生成します。 JARパッケージを格納するパス (D :\\ odps\\clt\\odps-graph-example-sssp.jarなど) を選択します。

  5. MaxComputeクライアントでSSSPを実行します。 詳細については、「 (オプション) グラフジョブの送信」をご参照ください。

ローカルデバッグ

MaxCompute Graph はローカルデバッグモードをサポートします。 ブレークポイントのデバッグにはEclipseを使用できます。

手順:

  1. odps-graph-localという名前のMavenパッケージをダウンロードします。

  2. Eclipseプロジェクトを選択し、Graphジョブのmain関数を含むメインプログラムファイルを右クリックし、[Run As] > [Run Configurations] を選択してパラメーターを設定します。

  3. [引数] タブで、メインプログラムの入力パラメーターとして、[プログラム引数]1 sssp_in sssp_outに設定します。

  4. [引数] タブで、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>

    Parameter configuration

  5. 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ディレクトリの詳細については、「ローカルモードで実行中のジョブ」をご参照ください。

  6. [実行] をクリックして、ローカルクライアントで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設定ファイルを作成する必要があります。

クラスタデバッグ

ローカルデバッグ後、テストのためにジョブをクラスターに送信できます。

手順:

  1. MaxCompute クライアントを設定します。

  2. add jar /path/work.jar -f; コマンドを実行し、JARパッケージを更新します。

  3. 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またはメモリリソースを増やします。

  • 反復の最大数を設定します。 正確な結果を必要としないアプリケーションでは、反復回数を減らして実行プロセスを高速化できます。

setNumWorkerssetSplitSizeを一緒に使用して、データの読み込みを高速化できます。 setNumWorkersの値がworkerNumの値と等しく、setSplitSizeの値がsplitSizeの値と等しく、入力バイトの総数がinputSizeの値であるとします。 分割データレコードの数は、次の式を使用して計算されます。splitNum = inputSize/splitSizeworkerNumsplitNumの関係:

  • splitNumの値がworkerNumの値と等しい場合、各ワーカーは1つの分割データレコードを読み込みます。

  • splitNumの値がworkerNumの値より大きい場合、各ワーカーは1つ以上の分割データレコードを読み込みます。

  • splitNumの値がworkerNumの値より小さい場合、各ワーカーは分割データレコードを1つアップロードするか、まったくアップロードしません。

したがって、workerNumsplitSizeを調整して、適切なデータ読み込み速度を得ることができます。 最初の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が必要なバージョンに更新されるまで待つかを選択できます。