MaxCompute を開発用途で利用すると、課金が発生します。通常は毎日の支出が安定しているものの、ある期間に急激に 2 倍になるなどの異常な増加が見られた場合、料金の内訳を分析し、どのプロジェクトおよびジョブが料金増加の原因となったかを特定してください。その後、該当するジョブを最適化または調整して、コストを削減します。本トピックでは、課金明細と MaxCompute のグローバルメタサービス(Information Schema)を活用して、MaxCompute 従量課金料金の急増をトラブルシューティングする手順について説明します。
背景情報
本トピックでは、MaxCompute 従量課金料金の急増をトラブルシューティングするため、以下の全体的なアプローチを採用します。
Fee Hub を使用して、予想を上回った料金が発生した日付を確認します。その後、その日にどのプロジェクトのどの課金項目で高額な料金が発生したかを特定します。
料金増加の根本原因を分析します。
計算コストが予想を上回った場合は、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 の概要」をご参照ください。
方法 1:「MaxCompute クライアント」にログインし、次のコマンドを実行します。
install package Information_Schema.systables;方法 2: DataWorks コンソールにログインします。Ad Hoc Query インターフェイスに移動します。アドホッククエリの詳細については、「アドホッククエリを使用して SQL ステートメントを実行する (オプション)」をご参照ください。次のコマンドを実行します。
install package Information_Schema.systables;
複数の 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 日以内のジョブ履歴のみをアドホッククエリで検索する場合は、本ステップはスキップ可能です。
MaxCompute クライアントし、メタデータバックアップテーブルを作成するための次のコマンドを実行します。
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 ジョブ全体のコストが高くなっています(外部テーブルジョブを含む)。これは、単一の異常ジョブ、繰り返し実行、または不適切なスケジューリング構成などが原因である可能性があります。
高コストジョブのインスタンス ID(inst_id)をクエリし、その実行詳細を確認します。
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 クエリ高速化ジョブを意味します。
高コスト 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>';
多数回実行された重複ジョブを特定します。
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 をクエリし、その具体的な実行情報を確認できます。
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 ジョブを意味します。
inst_idを使用して実行詳細を確認します。例を以下に示します。SELECT operation_text FROM information_schema.tasks_history WHERE ds='ジョブ実行日付パーティション' AND inst_id='<inst_id>';
MapReduce ジョブの計算コストが予想を上回った場合
MapReduce ジョブの全体的な消費量が高くなっています。異常な消費量を示すジョブの inst_id をクエリし、詳細な実行情報を確認できます。
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 ;inst_idを使用して実行詳細を確認します。例を以下に示します。SELECT operation_text FROM information_schema.tasks_history WHERE ds='ジョブ実行日付パーティション' AND inst_id='<inst_id>';
ストレージ料金が予想を上回った場合
使用量詳細 を使用してストレージ料金をクエリします。
使用量詳細をダウンロードします。詳細については、「使用量詳細のダウンロード」をご参照ください。
使用量詳細をアップロードします。詳細については、「使用量詳細データの MaxCompute へのアップロード」をご参照ください。
SQL を使用して使用量詳細を分析します。詳細については、「MaxCompute 課金使用量詳細の分析」をご参照ください。
パブリックネットワーク経由のダウンストリームトラフィック料金が予想を上回った場合
パブリックネットワーク経由のダウンストリームトラフィック料金全体が高くなっています。以下の手順で、どの期間およびカテゴリでダウンロード料金が高かったかを特定します。
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)。
クエリ結果を用いて、ダウンロード料金の時間的傾向を分析することもできます。また、
tunnel show historyコマンドを実行して、詳細な履歴を確認することもできます。コマンドの完全なリファレンスについては、「Tunnel コマンド」をご参照ください。
関連情報
コスト最適化に関するその他の記事については、「コスト最適化の概要」をご参照ください。