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

MaxCompute:MaxFrame ジョブの部分サブミッション

最終更新日:Jun 10, 2026

このトピックでは、MaxFrame ジョブの部分サブミッション機能の使用方法と課金について説明します。

背景情報

大規模な MaxCompute ジョブでは、ロングテールタスクや無限ループにより、一部の Fuxi インスタンスが長時間実行される場合があります。これにより、ジョブの実行時間が長くなったり、ジョブが失敗したりする可能性があります。デフォルトでは、MaxCompute は失敗したジョブの結果データを一切保持しないため、時間とコンピューティングリソースが無駄になります。

このシナリオに対処するため、MaxFrame は部分サブミッション機能をサポートしています。この機能により、軽微な障害やデータ損失を許容し、ジョブが失敗した場合でも、正常に完了した Fuxi インスタンスの結果を取得できます。

機能

  • サポート対象のジョブタイプ

    MaxCompute MaxFrame ジョブのみサポートされます。

  • 主な機能

    • MaxFrame ジョブが失敗した場合、正常に完了した Fuxi インスタンスの結果が保持されます。

    • タイムアウトを設定することで、ロングテールジョブを意図的に終了させ、正常に完了した Fuxi インスタンスの結果を保持できます。

説明

現在、部分サブミッション機能は手動でキャンセルされたジョブには適用されません。

使用方法

失敗したジョブからの部分的な結果の取得

部分サブミッションを有効にすると、ジョブが失敗した場合でも、正常に完了した Fuxi インスタンスの結果を取得できます。

部分サブミッション機能を有効にするには、ジョブレベルで次のパラメーターを設定します。

options.sql.settings = {
    "odps.sql.always.commit.result": "true"  # 部分サブミッションを有効にします。
}
  • (推奨) 最終結果の宛先テーブルへの書き込み

    次の例では、ジョブの最終結果を宛先テーブル data_output に書き込みます。このテーブルをクエリすることで、部分的な結果を取得できます。

    df.mf.flatmap(
        ... # ここにビジネスロジックを記述します
    ).to_odps_table("data_output").execute()

    ジョブの Logview で、正常に完了した Fuxi インスタンスを確認することもできます。

    WARNING:[0,0]  [MF_UDF_20250507084433360GZQPJR9T002_USER_UDF_xxx($0, $1, $2, $3, $4, $5)]: more optimization opportunities are
        possible if [MF_UDF_20250507084433360GZQPJR9T002_USER_UDF_xxx($0, $1, $2, $3, $4, $5)] is annotated as deterministic.
    resource cost: cpu 23.25 Core * Min, memory 29.06 GB * Min
    inputs:
        llm_mf_bj.llm_mf_bj.test_input: 87 (442569 bytes)
    outputs:
        llm_mf_bj.default.tmp_mf_20250507084433360gzqpjr9t0o2_c0d07f4412d0c87742def840ffddb d5f_0: 870 (43620 bytes, 87 files)
    --------------------------------------------CommitFileStatusInfo--------------------------------------------
    PartialCommitSummary(Because odps.sql.always.commit.result=true, and the job(SQL_0_0_0_job_0) is FAILED, so we commit partial result):
        llm_mf_bj.default.tmp_mf_20250507084433360gzqpjr9t0o2_c0d07f4412d0c87742def840ffddb d5f_0:
        Successfully committed Fuxi instance count: 87
        Total Fuxi instance count: 100
    --------------------------------------------JOB:SQL_0_0_0_job_0--------------------------------------------
    Job run time: 139.214
    Job run mode: fuxi job 2.0
    Job run engine: execution engine
    M1:
        instance count: 87
        rerun worker count: 1
        run time: 177.844
        instance time:
            min: 9.384, max: 25.759, avg: 16.035
        input records:
            TableScan1: 87  (min: 1, max: 1, avg: 1)
        input bytes:
            TableScan1: 442569  (min: 5087, max: 5087, avg: 5087)
        output records:
            TableSink1: 870  (min: 10, max: 10, avg: 10)
        output bytes:
            TableSink1: 43620  (min: 489, max: 512, avg: 501)
        output file count:
            TableSink1: 87  (size min: 489, max: 512, avg: 501)
        metrics_output_count:
            TableFunctionScan1: 870  (min: 0, max: 10, avg: 8)
  • 一時テーブルを使用したクエリ

    ジョブが結果を宛先テーブルに書き込まない場合、Logview で自動生成された一時テーブルの名前を確認できます。このテーブル名を使用して、部分的な結果を取得できます。

    df.mf.flatmap(
        ...
    ).execute()

    一時テーブルの名前を確認するには、Logview の [Job Details] タブで [Progress Chart] ビューを選択します。フローチャートの出力ノードに、j.default.tmp_mf_<timestamp> のような形式で自動生成された一時テーブルの名前が表示されます。このテーブル名を使用して、部分的な結果をクエリできます。

部分的な結果のタイムアウト設定

ロングテールタスクや無限ループが発生しやすいジョブの場合、タイムアウトを設定できます。タイムアウトに達すると、システムはジョブを終了しますが、正常に完了した Fuxi インスタンスの結果は保持されます。これらの部分的な結果は、宛先テーブルまたは一時テーブルから取得できます。

部分サブミッション機能を有効にし、ジョブのタイムアウトを設定します。

options.sql.settings = {
    "odps.sql.always.commit.result": "true",  # 部分サブミッションを有効にします。
    "odps.sql.job.max.time.hours": "1"        # タイムアウトを1時間に設定します。
}
説明

タイムアウト前にジョブが失敗した場合でも、正常に完了した Fuxi インスタンスの結果は保持されます。

課金

従量課金

従量課金 モードの MaxFrame ジョブは、実際に消費された CU 時間に基づいて課金されます。

利用明細は、利用明細ページからダウンロードできます。 詳細については、「MaxCompute の課金と利用明細を分析する」をご参照ください。

サブスクリプション

サブスクリプション モードの MaxFrame ジョブは、要求された量に基づいてサブスクリプションリソースグループのリソースを消費します。追加料金は発生しません。