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

MaxCompute:MaxCompute 従量課金料金の急増をトラブルシューティングする方法

最終更新日:Mar 20, 2026

MaxCompute を開発用途で利用すると、課金が発生します。通常は毎日の支出が安定しているものの、ある期間に急激に 2 倍になるなどの異常な増加が見られた場合、料金の内訳を分析し、どのプロジェクトおよびジョブが料金増加の原因となったかを特定してください。その後、該当するジョブを最適化または調整して、コストを削減します。本トピックでは、課金明細と MaxCompute のグローバルメタサービス(Information Schema)を活用して、MaxCompute 従量課金料金の急増をトラブルシューティングする手順について説明します。

背景情報

本トピックでは、MaxCompute 従量課金料金の急増をトラブルシューティングするため、以下の全体的なアプローチを採用します。

  1. Fee Hub を使用して、予想を上回った料金が発生した日付を確認します。その後、その日にどのプロジェクトのどの課金項目で高額な料金が発生したかを特定します。

  2. 料金増加の根本原因を分析します。

    • 計算コストが予想を上回った場合は、Information Schema の TASKS_HISTORY ビューを使用してジョブ数をカウントし、コストが最も高い上位ジョブを一覧表示します。

    • ストレージ料金が予想を上回った場合は、使用量詳細をダウンロードして、ストレージ料金の変化を分析します。

    • パブリックネットワーク経由のダウンストリームトラフィック料金が予想を上回った場合は、Information Schema の TUNNELS_HISTORY ビューを使用して、パブリックネットワーク経由のダウンストリームトラフィック料金の変化を追跡します。

ステップ 1:Information Schema サービスの有効化

2024 年 3 月 1 日以降、MaxCompute では新規プロジェクトに対してプロジェクトレベルの Information Schema パッケージが自動インストールされなくなりました。そのため、新規プロジェクトにはデフォルトでプロジェクトレベルの Information Schema パッケージが含まれません。業務でメタデータクエリが必要な場合は、代わりにテナントレベルの Information Schema を使用してください。こちらの方がより包括的な情報を提供します。テナントレベルの Information Schema の使用方法については、「テナントレベルの Information Schema」をご参照ください。

既存の MaxCompute プロジェクトでは、Information Schema サービスを利用する前に、以下の準備が必要です。

  • プロジェクトオーナー、または Super_Administrator ロールを持つ Resource Access Management (RAM) ユーザーである必要があります。これにより、プロジェクトのメタデータへのアクセスが可能になります。ユーザーに管理ロールを割り当てる方法については、「ユーザーへのロールの割り当て」をご参照ください。

  • パッケージのインストールには 2 つの方法があります。Information Schema の機能および制限事項については、「Information Schema の概要」をご参照ください。

  • 複数の MaxCompute プロジェクトからメタデータを分析する場合は、各プロジェクトごとに Information Schema パッケージをインストールし、各プロジェクトのバックアップメタデータを同一テーブルに挿入して、集約的に分析を行います。

  • すべてのプロジェクトのメタデータおよび使用状況履歴をクエリできるテナントレベルの Information Schema の使用を推奨します。「テナントレベルの Information Schema」をご参照ください。

(任意)ステップ 2:プロジェクトオーナー以外のユーザーへの権限付与

Information Schema のビューには、プロジェクトレベルのすべてのユーザーのデータが含まれています。デフォルトでは、プロジェクトオーナーのみがこのデータを閲覧できます。プロジェクト内の他のユーザーまたはロールがこのデータを閲覧する必要がある場合は、明示的に権限を付与する必要があります。詳細については、「パッケージに基づくクロスプロジェクトリソースアクセス」をご参照ください。

権限付与の構文は以下のとおりです。

grant <actions> on package Information_Schema.systables to user <user_name>;
grant <actions> on package Information_Schema.systables to role <role_name>;
  • actions:付与する権限。値は Read である必要があります。

  • user_name:プロジェクトに追加済みの Alibaba Cloud アカウントまたは RAM ユーザー。

    ユーザーアカウントを取得するには、MaxCompute クライアントlist users;コマンドを実行できます。

  • role_name:プロジェクトに追加済みのロール。

    list roles;」コマンドを MaxCompute クライアントで実行すると、ロール名を取得できます。

以下に、権限付与の例を示します。

grant read on package Information_Schema.systables to user RAM$Bob@aliyun.com:user01;

(任意)ステップ 3:メタデータのダウンロードおよびバックアップ

MaxCompute では、完了したジョブの履歴が過去 14 日間保持されます。14 日以上前のデータを頻繁にクエリする場合は、定期的にメタデータをプロジェクト内にバックアップすることを推奨します。ただし、過去 14 日以内のジョブ履歴のみをアドホッククエリで検索する場合は、本ステップはスキップ可能です。

  1. MaxCompute クライアントし、メタデータバックアップテーブルを作成するための次のコマンドを実行します。

    メタデータバックアップテーブルの作成

    -- project_name は MaxCompute プロジェクト名です。
    -- tasks_history バックアップテーブルを作成します。
    CREATE TABLE IF NOT EXISTS <project_name>.tasks_history
    (
        task_catalog STRING
        ,task_schema STRING
        ,task_name STRING
        ,task_type STRING
        ,inst_id STRING
        ,status STRING
        ,owner_id STRING
        ,owner_name STRING
        ,result STRING
        ,start_time DATETIME
        ,end_time DATETIME
        ,input_records BIGINT
        ,output_records BIGINT
        ,input_bytes BIGINT
        ,output_bytes BIGINT
        ,input_tables STRING
        ,output_tables STRING
        ,operation_text STRING
        ,signature STRING
        ,complexity DOUBLE
        ,cost_cpu DOUBLE
        ,cost_mem DOUBLE
        ,settings STRING
        ,ds STRING
    );
    -- tunnels_history バックアップテーブルを作成します。
    CREATE TABLE IF NOT EXISTS <project_name>.tunnels_history
    (
    tunnel_catalog  STRING
    ,tunnel_schema   STRING
    ,session_id      STRING
    ,operate_type    STRING
    ,tunnel_type     STRING
    ,request_id      STRING
    ,object_name     STRING
    ,partition_spec  STRING
    ,data_size       BIGINT
    ,block_id        BIGINT
    ,offset          BIGINT
    ,length          BIGINT
    ,owner_id        STRING 
    ,owner_name      STRING 
    ,start_time      DATETIME
    ,end_time        DATETIME 
    ,client_ip       STRING 
    ,user_agent      STRING 
    ,object_type     STRING 
    ,columns         STRING 
    ,ds  STRING
    );
    
  2. DataWorks Data Studio インターフェイスで、「ODPS SQL ノード」を history_backup という名前で作成します。時間指定スケジューリングを設定し、tasks_history および tunnels_history バックアップテーブルにデータを書き込みます。左上隅の 保存 アイコンをクリックして保存します。

    ODPS SQL ノードのコマンド例を以下に示します。

    -- project_name は MaxCompute プロジェクト名です。 
    USE <project_name>; 
    -- tasks_history をバックアップします。
    INSERT INTO TABLE <project_name>.tasks_history 
    SELECT task_catalog,task_schema ,task_name,task_type STRING,inst_id,`status`,owner_id,owner_name,result
      ,start_time,end_time,input_records,output_records,input_bytes,output_bytes
      ,input_tables,output_tables,operation_text,signature,complexity,cost_cpu,cost_mem,settings,ds 
      FROM information_schema.tasks_history WHERE ds ='${datetime1}';
    -- tunnels_history をバックアップします。
    INSERT INTO TABLE <project_name>.tunnels_history 
    SELECT tunnel_catalog,tunnel_schema,session_id,operate_type,tunnel_type,request_id,object_name
      ,partition_spec,data_size,block_id,offset,length,owner_id,owner_name,start_time,end_time
      ,client_ip,user_agent,object_type,columns,ds 
      FROM information_schema.tunnels_history WHERE ds ='${datetime1}';
    

    ${datetime1} パラメーターは DataWorks のスケジューリングパラメーターです。ODPS SQL ノードで右側の スケジューリング設定 をクリックし、基本プロパティ セクションで パラメーターdatetime1=${yyyymmdd} に設定します。

    説明

    複数の MaxCompute プロジェクトからメタデータを分析する場合は、複数の ODPS SQL ノードを作成し、すべてのプロジェクトのメタデータを同一のバックアップテーブルに書き込みます。

ステップ 4:Fee Hub における高コストプロジェクトおよび課金項目の分析

Fee Hub にログインします。 次の方法で高コストのプロジェクトおよび課金項目を分析します。詳細については、「課金明細の表示」をご参照ください。

  • 左側のナビゲーションウィンドウで、課金 > 課金明細 を選択します。統計項目インスタンス に、統計期間 に設定します。

    • 方法 1:高コストのプロジェクト(インスタンス ID)を特定します。1 つのプロジェクトが明らかに予想を上回っている場合は、そのプロジェクトを分析します。

    • 方法 2:高コストの課金項目を特定します。特定のプロジェクトを リソースインスタンス名 / ID で検索し、そのプロジェクトの高コスト課金項目を分析します。

  • 左側のナビゲーションウィンドウで、コスト分析 を選択します。コスト分析 ページでも、コストが上昇している課金項目を特定できます。

ステップ 5:料金増加の根本原因の特定

高コストのプロジェクトおよび課金項目を分析し、料金増加の根本原因を特定します。

SQL ジョブの計算コストが予想を上回った場合

SQL ジョブ全体のコストが高くなっています(外部テーブルジョブを含む)。これは、単一の異常ジョブ、繰り返し実行、または不適切なスケジューリング構成などが原因である可能性があります。

  1. 高コストジョブのインスタンス ID(inst_id)をクエリし、その実行詳細を確認します。

    1. MaxCompute クライアントし、ステップ 4 で特定した高コストプロジェクトに use コマンドで切り替えます。次に、TASKS_HISTORY を使用してジョブコストをクエリします。例を以下に示します。

      -- ODPS 2.0 データ型を有効化します。詳細については、ODPS 2.0 データ型を参照してください。
      SET odps.sql.decimal.odps2=true;
      SELECT  
      inst_id ---インスタンス ID
      ,input_bytes ---入力データ量
      ,complexity
      ,CAST(input_bytes/1024/1024/1024 * complexity * 0.3 AS DECIMAL(18,5) ) cost_sum
      ,GET_JSON_OBJECT(settings, "$.SKYNET_ID") SKYNET_ID ---DataWorks スケジューリングジョブ ID
      FROM    information_schema.tasks_history 
      -- 14 日以上前のメタデータをクエリする場合は、ステップ 3 で作成したバックアップテーブル(テーブル名:<project_name>.tasks_history)をクエリします。
      WHERE   task_type = 'SQL' OR task_type = 'SQLRT'
      AND ds = 'クエリ対象の日付パーティション'
      ORDER BY cost_sum DESC
      LIMIT 10000
      ;
      説明
      • SQL 計算コスト = 入力データ量 × SQL 複雑度 × 単価(USD 0.0438 / GB)。

      • 例において、task_type = 'SQL' は SQL ジョブを意味し、task_type = 'SQLRT' は SQL クエリ高速化ジョブを意味します。

    2. 高コスト SQL ジョブの SKYNET_ID(DataWorks スケジューリングジョブ ID)を確認します。

      • ID が存在する場合は、DataWorks でノードの実行詳細を確認します。

      • ID が存在しない場合は、そのジョブは DataWorks のスケジューリングノードによってトリガーされていません。代わりに inst_id を使用して実行詳細を確認します。例を以下に示します。

        SELECT operation_text 
          FROM information_schema.tasks_history 
         WHERE ds='<ジョブ実行日付パーティション>' AND inst_id='<inst_id>';
  2. 多数回実行された重複ジョブを特定します。

    1. MaxCompute クライアントし、ステップ 4 で特定した高コストプロジェクトに use コマンドで切り替えます。次に、TASKS_HISTORY を使用して重複ジョブをクエリします。例を以下に示します。

      -- ジョブの増加傾向を分析します。
      SELECT  signature
              ,ds
              ,COUNT(*) AS tasknum
      FROM    information_schema.tasks_history 
      -- 14 日以上前のメタデータをクエリする場合は、ステップ 3 で作成したバックアップテーブル(テーブル名:<project_name>.tasks_history)をクエリします。
      where   task_type = 'SQL' OR task_type = 'SQLRT'
      AND ds >= 'クエリ対象の日付パーティション'
      GROUP BY ds
               ,signature
      ORDER BY tasknum DESC
      LIMIT   10000
      ;
      
      -- 異常な署名を確認し、対応する SQL ジョブの最近の実行を確認します。
      SELECT  *
      FROM    information_schema.tasks_history 
      -- 14 日以上前のメタデータをクエリする場合は、ステップ 3 で作成したバックアップテーブル(テーブル名:<project_name>.tasks_history)をクエリします。
      where   signature = '異常な署名'
      AND ds >= 'クエリ対象の日付パーティション'
      ;

Spark コンピューティングコストが想定を超える

Spark ジョブの全体的な消費量が高くなっています。異常な消費量を示すジョブの inst_id をクエリし、その具体的な実行情報を確認できます。

  1. MaxCompute クライアントし、ステップ 4 で特定した高コストプロジェクトに use コマンドで切り替えます。次に、TASKS_HISTORY を使用してジョブコストをクエリします。例を以下に示します。

    -- ODPS 2.0 データ型を有効化します。詳細については、ODPS 2.0 データ型を参照してください。
    SET odps.sql.decimal.odps2=true;
    SELECT  inst_id --インスタンス ID
    ,cost_cpu --ジョブの CPU 消費量(100 は 1 コア × 1 秒を意味します。例:10 コアを 5 秒間実行すると、cost_cpu は 10 × 100 × 5 = 5000 となります)。
    ,CAST(cost_cpu/100/3600 * 0.36 AS DECIMAL(18,5) ) cost_sum
    FROM  information_schema.tasks_history 
    -- 14 日以上前のメタデータをクエリする場合は、ステップ 3 で作成したバックアップテーブル(テーブル名:<project_name>.tasks_history)をクエリします。
    WHERE   task_type = 'CUPID' AND status='Terminated'
    AND ds = 'クエリ対象の日付パーティション'
    ORDER BY cost_sum DESC
    LIMIT 10000
    ;
    説明
    • Spark ジョブの当日計算コスト = 課金時間合計 × 単価(USD 0.1041 / 時間・タスク)。

    • task_type = 'CUPID' は Spark ジョブを意味します。

  2. inst_id を使用して実行詳細を確認します。例を以下に示します。

    SELECT operation_text 
      FROM information_schema.tasks_history 
    WHERE ds='ジョブ実行日付パーティション' AND inst_id='<inst_id>';
    

MapReduce ジョブの計算コストが予想を上回った場合

MapReduce ジョブの全体的な消費量が高くなっています。異常な消費量を示すジョブの inst_id をクエリし、詳細な実行情報を確認できます。

  1. MaxCompute クライアントし、ステップ 4 で特定した高コストプロジェクトに use コマンドで切り替えます。次に、TASKS_HISTORY を使用してジョブコストをクエリします。例を以下に示します。

    -- ODPS 2.0 データ型を有効化します。詳細については、ODPS 2.0 データ型を参照してください。
    SET odps.sql.decimal.odps2=true;
    SELECT  inst_id --インスタンス ID
    ,cost_cpu --ジョブの CPU 消費量(100 は 1 コア × 1 秒を意味します。例:10 コアを 5 秒間実行すると、cost_cpu は 10 × 100 × 5 = 5000 となります)。
    ,CAST(cost_cpu/100/3600 * 0.36 AS DECIMAL(18,5) ) cost_sum
    FROM    information_schema.tasks_history 
    -- 14 日以上前のメタデータをクエリする場合は、ステップ 3 で作成したバックアップテーブル(テーブル名:<project_name>.tasks_history)をクエリします。
    WHERE   task_type = 'LOT' AND status='Terminated'
    AND ds = 'クエリ対象の日付パーティション'
    ORDER BY cost_sum DESC
    LIMIT 10000
    ;
    

  2. inst_id を使用して実行詳細を確認します。例を以下に示します。

    SELECT operation_text 
      FROM information_schema.tasks_history 
    WHERE ds='ジョブ実行日付パーティション' AND inst_id='<inst_id>';
    

ストレージ料金が予想を上回った場合

使用量詳細 を使用してストレージ料金をクエリします。

  1. 使用量詳細をダウンロードします。詳細については、「使用量詳細のダウンロード」をご参照ください。

  2. 使用量詳細をアップロードします。詳細については、「使用量詳細データの MaxCompute へのアップロード」をご参照ください。

  3. SQL を使用して使用量詳細を分析します。詳細については、「MaxCompute 課金使用量詳細の分析」をご参照ください。

パブリックネットワーク経由のダウンストリームトラフィック料金が予想を上回った場合

パブリックネットワーク経由のダウンストリームトラフィック料金全体が高くなっています。以下の手順で、どの期間およびカテゴリでダウンロード料金が高かったかを特定します。

  1. MaxCompute クライアントし、ステップ 4 で特定した高コストプロジェクトに use コマンドで切り替えます。次に、TUNNELS_HISTORY を使用してダウンロード料金をクエリします。例を以下に示します。

    -- ODPS 2.0 データ型を有効化します。詳細については、ODPS 2.0 データ型を参照してください。
    set odps.sql.decimal.odps2=true;
    SELECT  ds
            ,operate_type
            ,SUM(CAST(data_size / 1024 / 1024 / 1024 * 0.8 AS DECIMAL(18,5))) download_fee
    FROM    information_schema.tunnels_history
    WHERE   operate_type = 'DOWNLOADLOG'
    OR      operate_type = 'DOWNLOADINSTANCELOG'
    AND     ds >= 'クエリ対象の日付パーティション'
    GROUP BY ds
             ,operate_type
    ORDER BY download_fee DESC
    ;
    説明

    ダウンロード料金 = ダウンロードされたデータ量 × 単価(USD 0.1166 / GB)。

  2. クエリ結果を用いて、ダウンロード料金の時間的傾向を分析することもできます。また、tunnel show history コマンドを実行して、詳細な履歴を確認することもできます。コマンドの完全なリファレンスについては、「Tunnel コマンド」をご参照ください。image

関連情報

コスト最適化に関するその他の記事については、「コスト最適化の概要」をご参照ください。