本トピックでは、使用量明細に基づく MaxCompute の料金内訳の分析方法について説明します。請求明細を取得・分析することで、予期しないコスト発生を防止し、リソース活用率を最大化し、費用を削減できます。
背景情報
MaxCompute は、Alibaba Cloud が提供するクラウドネイティブなビッグデータ計算サービスです。旧称は ODPS で、エンタープライズグレードの SaaS 型 AI ネイティブデータウェアハウスであり、高いコスト効率、マルチモデル計算、エンタープライズグレードのセキュリティ、および AI 主導の機能を提供します。MaxCompute の計算リソースには、サブスクリプションまたは従量課金のいずれかの課金方法をご利用いただけます。MaxCompute はプロジェクト単位で毎日課金され、請求書は翌日の 06:00 より前に生成されます。「課金項目と課金方法」については、「課金項目と課金方法」をご参照ください。
Alibaba Cloud では、データ開発時またはプロダクトリリース前に、MaxCompute の請求額変動(通常は増加)に関する情報を公開しています。これらの変動を分析し、MaxCompute プロジェクト内のジョブを最適化できます。すべての Alibaba Cloud 有償サービスの使用量明細は、課金管理コンソールからダウンロードできます。「請求明細の取得およびダウンロード方法」については、「請求明細の確認」をご参照ください。
ステップ 1:使用量明細のダウンロード
日次使用量明細をダウンロードして料金発生状況を把握するには、使用量明細ページにアクセスします。たとえば、どのジョブが日次ストレージおよび計算料金を発生させているかを特定できます。

CSV 形式でエクスポート をクリックします。短時間待機した後、 エクスポート記録 ページに移動して、使用量明細をダウンロードします。
パラメーターの説明
期間:開始時刻および終了時刻を選択します。
ジョブが 12 月 1 日に開始し、12 月 2 日に終了する場合、ダウンロード対象の使用量明細にそのジョブを含めるには、開始時刻を 12 月 1 日に設定します。ただし、消費記録は 12 月 2 日の請求書に反映されます。
商品名:
MaxCompute (サブスクリプション)
MaxCompute (従量課金)
課金項目:必要に応じて選択します。
Billable Item
ODPSDataPlus:
あるリージョンで MaxCompute のサブスクリプションプロジェクトのみを購入している場合、ストレージおよびダウンロードなどの従量課金課金項目の使用量は、サブスクリプションプロジェクト内で計測されます。
2024 年 4 月 25 日以前に、香港 (中国) または中国以外のリージョンでサブスクリプションおよび従量課金の MaxCompute プロジェクトの両方が有効になっている場合、デフォルトの計算クォータはサブスクリプションプロジェクトに関連付けられていました。このクォータは、従量課金のストレージおよびダウンロード課金項目の計測詳細にも適用されていました。このような場合、MaxCompute (従量課金) を照会することで、従量課金プロジェクトのデフォルト計算クォータの計測詳細を取得できます。
ODPS_QUOTA_USAGE:弾力的に予約された計算リソースおよび専用トンネルリソースの計測記録。
MaxCompute (従量課金):計算、ストレージ、ダウンロードなどの従量課金課金項目の計測記録。
Time Unit:デフォルトは「時間」です。
ステップ 2(任意):使用量明細を MaxCompute にアップロード
MaxCompute SQL を使用して使用量明細を分析する場合は、この手順に従って MaxCompute にアップロードしてください。Excel のみを使用する場合は、この手順をスキップできます。
MaxCompute クライアント(odpscmd)を使用して、
maxcomputefeeという名前の MaxCompute テーブルを作成します。サンプル文:CREATE TABLE IF NOT EXISTS maxcomputefee ( projectid STRING COMMENT 'プロジェクト ID' ,feeid STRING COMMENT 'メータリング ID' ,meteringtime STRING COMMENT 'メータリング時刻' ,type STRING COMMENT 'メータリングタイプ(例:Storage、ComputationSQL、DownloadEx)' ,starttime STRING COMMENT '開始時刻' ,storage BIGINT COMMENT 'ストレージ(バイト)' ,endtime STRING COMMENT '終了時刻' ,computationsqlinput BIGINT COMMENT 'SQL 入力(バイト)' ,computationsqlcomplexity DOUBLE COMMENT 'SQL 複雑度' ,uploadex BIGINT COMMENT 'インターネット経由のアップロード(バイト)' ,download BIGINT COMMENT 'インターネット経由のダウンロード(バイト)' ,cu_usage DOUBLE COMMENT 'MR/Spark 計算(コア×秒)' ,Region STRING COMMENT 'リージョン' ,input_ots BIGINT COMMENT 'Tablestore からの入力(バイト)' ,input_oss BIGINT COMMENT 'OSS からの入力(バイト)' ,source_id STRING COMMENT 'DataWorks ノード ID' ,source_type STRING COMMENT '仕様タイプ' ,RecycleBinStorage BIGINT COMMENT 'ごみ箱ストレージ(バイト)' ,JobOwner STRING COMMENT 'ジョブ所有者' ,Signature STRING COMMENT 'SQL ジョブ署名' );フィールドの説明:
プロジェクト ID:ご利用の Alibaba Cloud アカウント、または現在の RAM ユーザーに関連付けられた Alibaba Cloud アカウントの MaxCompute プロジェクト一覧。
メータリング ID:請求 ID。ストレージ、計算、アップロード、またはダウンロードタスクのタスク ID です。SQL タスクの場合は InstanceID、アップロードまたはダウンロードタスクの場合は Tunnel SessionId です。
メータリングタイプ:Storage、ComputationSql、UploadIn、UploadEx、DownloadIn、DownloadEx。赤色で示されている項目のみが課金対象です。
ストレージ(バイト):1 時間あたりのストレージ読み取り量(バイト単位)。
開始時刻 または 終了時刻:実際のジョブ実行時間に基づいて計測されます。ストレージのみが 1 時間ごとにサンプリングされます。
SQL 入力(バイト):各 SQL 実行における入力データ量(バイト単位)。
SQL 複雑度:SQL 複雑度。これは SQL 課金の要素の 1 つです。
インターネット経由のアップロード(バイト) または インターネット経由のダウンロード(バイト):インターネット経由でアップロードまたはダウンロードされたデータ量(バイト単位)。
MR/Spark 計算(コア×秒):MapReduce または Spark ジョブの課金時間(
コア×秒単位)。課金時間に換算します。Tablestore からの SQL 入力(バイト) または OSS からの SQL 入力(バイト):外部テーブル課金後の入力データ量(バイト単位)。
バックアップストレージ(バイト):1 時間あたりのバックアップストレージ読み取り量。
リージョン:MaxCompute プロジェクトが存在するリージョン。
ジョブ所有者:ジョブを送信したユーザー。
SQL ジョブ署名:SQL ジョブを識別します。内容が同一でも、繰り返し実行またはスケジュール実行されたジョブは、同じ署名を共有します。
トンネルを使用したデータのアップロード。
CSV ファイルをアップロードする際は、列数およびデータ型が maxcomputefee テーブルの定義と一致していることを確認してください。一致していない場合、アップロードは失敗します。
tunnel upload ODPS_2019-01-12_2019-01-14.csv maxcomputefee -c "UTF-8" -h "true" -dfp "yyyy-M-d HH:mm";トンネルコマンドの構成については、「トンネルコマンド」をご参照ください。
DataWorks のデータインポート機能を使用することもできます。「DataWorks を使用したデータインポート(オフラインおよびリアルタイム)」をご参照ください。
以下の文を実行して、データを確認します。
SELECT * FROM maxcomputefee limit 10;
ステップ 3:請求データの分析
SQL 料金の分析
クラウドユーザーの 95 % が、ビジネス要件を満たすために MaxCompute SQL のみを使用しています。SQL 料金は、MaxCompute の請求額の大部分を占めています。
SQL 料金 = 入力データ量 × SQL 複雑度 × 単位価格(1 GB あたり USD 0.0438)
方法 1:Excel を使用した分析
使用量明細において、メータリングタイプが ComputationSql のレコードを分析します。SQL ジョブの料金が想定を超えていないか、または過剰な SQL ジョブが実行されていないかを確認します。SQL ジョブ料金は、次の数式で計算します:
SQL 入力(バイト)/1024/1024/1024 × SQL 複雑度 × SQL 単位価格。たとえば、入力量が
7352600872 バイトの標準 SQL ジョブの場合、料金はSQL 入力(7352600872 バイト / 1024 / 1024 / 1024)× SQL 複雑度 1 × CNY 0.3 / GB = CNY 2となります。方法 2:SQL を使用した分析
ステップ 2 を完了し、maxcomputefee テーブルを作成済みであることを前提としています:
-- SQL 料金の分析(sqlmoney 降順) SELECT to_char(endtime,'yyyymmdd') as ds,feeid as instanceid ,projectid ,computationsqlcomplexity -- 複雑度 ,SUM((computationsqlinput / 1024 / 1024 / 1024)) as computationsqlinput -- 入力量(GB) ,SUM((computationsqlinput / 1024 / 1024 / 1024)) * computationsqlcomplexity * 0.0438 AS sqlmoney FROM maxcomputefee WHERE TYPE = 'ComputationSql' AND to_char(endtime,'yyyymmdd') >= '20190112' GROUP BY to_char(endtime,'yyyymmdd'),feeid ,projectid ,computationsqlcomplexity ORDER BY sqlmoney DESC LIMIT 10000 ;
クエリ結果から得られる結論:
大規模ジョブでは、データ読み取り量を削減し、複雑度を低下させることで、コストを最適化できます。
dsフィールドを使用して、1 日あたりの処理データ量を集計し、SQL 料金の推移を分析します。Excel や Quick BI などのツールを使用して折れ線グラフを作成すると、視覚的にわかりやすくなります。最適化ポイントを特定するには、以下の手順を実行します:
instanceid で特定されたインスタンスの実行ログの LogView URL を取得します。
MaxCompute クライアント(odpscmd)または DataWorks で
wait <instanceid>;を実行し、instanceid の実行ログを表示します。
以下のコマンドを実行して、ジョブの詳細を表示します:
DESC instance 2016070102275442go3xxxxxx;応答:
ID 2016070102275442go3xxxxxx Owner ALIYUN$***@aliyun-inner.com StartTime 2016-07-01 10:27:54 EndTime 2016-07-01 10:28:16 Status Terminated console_query_task_1467340078684 Success Query select count(*) from src where ds='20160628';ブラウザで LogView URL を開きます。LogView で SourceXML タブをクリックし、SKYNET_NODENAME の値を取得します。
説明LogView の詳細については、「Logview 2.0 を使用したジョブ実行情報の表示」をご参照ください。
SKYNET_NODENAME パラメーターの値が取得できない場合、または SKYNET_NODENAME パラメーターに値がない場合は、SQL Script タブからコードスニペットを取得できます。その後、DataWorks で該当のコードスニペットを検索し、対象ノードを特定・最適化できます。「DataWorks コード検索」をご参照ください。
DataWorks で SKYNET_NODENAME の値を使用してノードを検索し、最適化します。
ジョブ増加傾向の分析
ジョブの急増(繰り返し実行や誤ったスケジューリング属性など)により、料金が上昇することがあります。
方法 1:Excel を使用した分析
使用量明細において、メータリングタイプ が ComputationSql のレコードを分析します。プロジェクトごとの日次ジョブ数をカウントし、ジョブ数の大きな変動を確認します。
方法 2:SQL を使用した分析
ステップ 2 を完了し、maxcomputefee テーブルを作成済みであることを前提としています:
-- ジョブ増加傾向の分析。 SELECT TO_CHAR(endtime,'yyyymmdd') AS ds ,projectid ,COUNT(*) AS tasknum FROM maxcomputefee WHERE TYPE = 'ComputationSql' AND TO_CHAR(endtime,'yyyymmdd') >= '20190112' GROUP BY TO_CHAR(endtime,'yyyymmdd') ,projectid ORDER BY tasknum DESC LIMIT 10000 ;1 月 12 日から 1 月 14 日までの間に MaxCompute に送信され、正常に実行されたジョブのジョブ数傾向を確認します。
ストレージ料金の分析
Excel を使用したストレージ料金が CNY 0.01 となる理由の分析:
MaxCompute のトライアルを有効化した後、MaxCompute 上でワークロードが実行されていないにもかかわらず、毎日 ¥0.01 の請求が発生します。これは通常、MaxCompute に残存データが保存されており、そのデータ量が 0.5 GB を超えていないためです。
メータリングタイプ が Storage のレコードを確認します。図に示すように、
maxcompute_docプロジェクトには 508 バイトのデータが保存されています。「ストレージ課金ルールによると、データ量 ≤ 512 MB の場合、料金は CNY 0.01 です。
このデータがテスト用のみである場合、以下の方法で問題を解決できます:未使用のテーブルデータのみの場合、
Drop Table文を実行して、プロジェクト内のテーブルデータを削除します。プロジェクト自体が未使用の場合、MaxCompute コンソールの
Excel 分析
1 日未満データストレージ料金:メータリングタイプ が Storage のレコードを確認します。仮に alian(例:プロジェクト名) プロジェクトに 333507833900 バイトのデータが保存されているとします。データは 08:00 にアップロードされたため、課金は 09:07 から開始され、15 時間分が対象となります。
課金サイクルは各日の終了時に終了するため、4 月 4 日の請求書には最終レコードは含まれません。
ストレージ課金ルールに基づき、24 時間平均ストレージ量を算出し、課金数式を適用します。
-- 平均ストレージ量の算出。 333507833900 バイト × 15 / 1024 / 1024 / 1024 / 24 = 194.127109076362103 GB -- 日次ストレージ料金の算出(小数点以下 4 桁まで四捨五入)。 194.127109076362103 GB × USD 0.0006 / GB / 日 = USD 0.1165 / 日
SQL を使用したストレージ料金内訳の分析
ステップ 2 を完了し、maxcomputefee テーブルを作成済みであることを前提としています:
-- ストレージ料金の分析。 SELECT t.ds ,t.projectid ,t.storage ,CASE WHEN t.storage < 0.5 THEN t.storage*0.01 -- 実際のストレージ量が > 0 MB かつ ≤ 512 MB の場合、単位価格は 1 GB あたり CNY 0.01 です。 WHEN t.storage >= 0.5 THEN t.storage*0.004 -- 実際のストレージ量が > 512 MB の場合、単位価格は 1 GB あたり CNY 0.004 です。 END storage_fee FROM ( SELECT to_char(starttime,'yyyymmdd') as ds ,projectid ,SUM(storage/1024/1024/1024)/24 AS storage FROM maxcomputefee WHERE TYPE = 'Storage' and to_char(starttime,'yyyymmdd') >= '20190112' GROUP BY to_char(starttime,'yyyymmdd') ,projectid ) t ORDER BY storage_fee DESC ;結果:
結論:ストレージ量は 1 月 12 日に増加し、1 月 14 日に減少しました。
ストレージの最適化には、テーブルのライフサイクルを設定したり、不要な一時テーブルを削除したりします。
長期ストレージ、低頻度アクセス(IA)ストレージ、長期ストレージアクセス、IA ストレージアクセスの SQL 分析
ステップ 2 を完了し、maxcomputefee テーブルを作成済みであることを前提としています:
-- 長期ストレージ料金の分析。 SELECT to_char(starttime,'yyyymmdd') as ds ,projectid ,SUM(storage/1024/1024/1024)/24*0.0011 AS longTerm_storage FROM maxcomputefee WHERE TYPE = 'ColdStorage' and to_char(starttime,'yyyymmdd') >= '20190112' GROUP BY to_char(starttime,'yyyymmdd') ,projectid; -- 低頻度アクセス(IA)ストレージ料金の分析。 SELECT to_char(starttime,'yyyymmdd') as ds ,projectid ,SUM(storage/1024/1024/1024)/24*0.0011 AS lowFre_storage FROM maxcomputefee WHERE TYPE = 'LowFreqStorage' and to_char(starttime,'yyyymmdd') >= '20190112' GROUP BY to_char(starttime,'yyyymmdd') ,projectid; -- 長期ストレージアクセス料金の分析。 SELECT to_char(starttime,'yyyymmdd') as ds ,projectid ,SUM(computationsqlinput/1024/1024/1024)*0.522 AS longTerm_IO FROM maxcomputefee WHERE TYPE = 'SqlLongterm' and to_char(starttime,'yyyymmdd') >= '20190112' GROUP BY to_char(starttime,'yyyymmdd') ,projectid; -- 低頻度アクセス(IA)ストレージアクセス料金の分析。 SELECT to_char(starttime,'yyyymmdd') as ds ,projectid ,SUM(computationsqlinput/1024/1024/1024)*0.522 AS lowFre_IO FROM maxcomputefee WHERE TYPE = 'SqlLowFrequency' and to_char(starttime,'yyyymmdd') >= '20190112' GROUP BY to_char(starttime,'yyyymmdd') ,projectid;
ダウンロード料金の分析
MaxCompute では、インターネット経由またはクロスリージョンでのデータダウンロード量に応じて課金されます。
ダウンロード料金 = ダウンロードデータ量 × 単位価格(1 GB あたり USD 0.1166)
方法 1:Excel を使用した分析
メータリングタイプ = DownloadEx は、インターネット経由のダウンロード課金を示します。
たとえば、0.036 GB(38,199,736 バイト)のダウンロードトラフィックのレコードが見つかった場合、このダウンロード料金は、「ダウンロード料金(従量課金)」で説明されている課金ルールに基づき、以下の数式で算出されます:
(38,199,736 バイト / 1024 / 1024 / 1024) × 0.1166 USD/GB = 0.004 USD。ダウンロードの最適化:トンネルサービスがパブリックネットワークを使用しているかどうかを確認し、課金が発生していないかを確認します。「エンドポイント」をご参照ください。大量のダウンロードを行う場合、蘇州に所在するお客様で、リージョンが中国(上海)の場合、まず中国(上海)の ECS インスタンスを使用して仮想マシンにデータをダウンロードし、その後、サブスクリプションの ECS インスタンスを使用してデータをダウンロードします。
方法 2:SQL を使用した分析
ステップ 2 を完了し、maxcomputefee テーブルを作成済みであることを前提としています:
-- ダウンロード料金の分析。 SELECT TO_CHAR(starttime,'yyyymmdd') AS ds ,projectid ,SUM((download/1024/1024/1024)*0.1166) AS download_fee FROM maxcomputefee WHERE type = 'DownloadEx' AND TO_CHAR(starttime,'yyyymmdd') >= '20190112' GROUP BY TO_CHAR(starttime,'yyyymmdd') ,projectid ORDER BY download_fee DESC ;
MapReduce ジョブの消費分析
MapReduce ジョブ料金 = 課金時間合計 × 単位価格(1 タスクあたり 1 時間あたり USD 0.0690)
方法 1:Excel を使用した分析
使用量明細において、メータリングタイプ が MapReduce のレコードを分析します。仕様タイプごとに MapReduce ジョブ料金を算出し、並べ替えます。MapReduce ジョブ料金の数式:
(MR/Spark 計算(コア×秒)/3600 × 単位価格(USD 0.0690))方法 2:SQL を使用した分析
ステップ 2 を完了し、maxcomputefee テーブルを作成済みであることを前提としています:
-- MapReduce ジョブ料金の分析。 SELECT TO_CHAR(starttime,'yyyymmdd') AS ds ,projectid ,(cu_usage/3600)*0.0690 AS mr_fee FROM maxcomputefee WHERE type = 'MapReduce' AND TO_CHAR(starttime,'yyyymmdd') >= '20190112' GROUP BY TO_CHAR(starttime,'yyyymmdd') ,projectid ,cu_usage ORDER BY mr_fee DESC ;
外部テーブルジョブ(Tablestore および OSS)の分析
SQL 外部テーブル料金 = 入力データ量 × 単位価格(1 GB あたり USD 0.0044)
方法 1:Excel を使用した分析
使用量明細において、メータリングタイプ が ComputationSqlOTS または ComputationSqlOSS のレコードを分析します。SQL 外部テーブル料金を並べ替えます。料金の数式:
SQL 入力(バイト)/1024/1024/1024 × 単位価格(USD 0.0044)。方法 2:SQL を使用した分析
ステップ 2 を完了し、maxcomputefee テーブルを作成済みであることを前提としています:
-- Tablestore 外部テーブル SQL ジョブ料金の分析。 SELECT TO_CHAR(starttime,'yyyymmdd') AS ds ,projectid ,(computationsqlinput/1024/1024/1024)*1*0.03 AS ots_fee FROM maxcomputefee WHERE type = 'ComputationSqlOTS' AND TO_CHAR(starttime,'yyyymmdd') >= '20190112' GROUP BY TO_CHAR(starttime,'yyyymmdd') ,projectid ,computationsqlinput ORDER BY ots_fee DESC ; -- OSS 外部テーブル SQL ジョブ料金の分析。 SELECT TO_CHAR(starttime,'yyyymmdd') AS ds ,projectid ,(computationsqlinput/1024/1024/1024)*1*0.03 AS oss_fee FROM maxcomputefee WHERE type = 'ComputationSqlOSS' AND TO_CHAR(starttime,'yyyymmdd') >= '20190112' GROUP BY TO_CHAR(starttime,'yyyymmdd') ,projectid ,computationsqlinput ORDER BY oss_fee DESC ;
Spark 計算料金の分析
Spark ジョブ料金 = 課金時間合計 × 単位価格(1 タスクあたり 1 時間あたり USD 0.1041)
方法 1:Excel を使用した分析
使用量明細において、メータリングタイプ が Spark のレコードを分析します。ジョブ料金を並べ替えます。料金の数式:
(MR/Spark 計算(コア×秒)/3600 × 単位価格(USD 0.1041))。方法 2:SQL を使用した分析
ステップ 2 を完了し、maxcomputefee テーブルを作成しました:
-- Spark ジョブ料金の分析。 SELECT TO_CHAR(starttime,'yyyymmdd') AS ds ,projectid ,(cu_usage/3600)*0.1041 AS mr_fee FROM maxcomputefee WHERE type = 'spark' AND TO_CHAR(starttime,'yyyymmdd') >= '20190112' GROUP BY TO_CHAR(starttime,'yyyymmdd') ,projectid ,cu_usage ORDER BY mr_fee DESC ;