全部產品
Search
文件中心

MaxCompute:MaxCompute後付費消費突增排查

更新時間:Mar 20, 2026

在使用MaxCompute開發過程中會產生費用,如果平時每日消費比較平穩,某段時間的費用增長翻倍。在排除業務增長的情況下,可以進行費用分析,排查導致費用突增的專案、作業是哪些,進而及時最佳化和調整作業,最佳化成本。本文介紹如何結合賬單詳情和MaxCompute中繼資料服務(Information Schema)排查MaxCompute後付費消費突增。

背景資訊

本文排查MaxCompute後付費消費突增總體思路如下:

  1. 通過費用中心確認費用超出預期的日期,然後確認當天具體是哪個專案中的哪個計費項目產生了高額費用。

  2. 分析具體的消費上漲原因:

    • 如果是計算費用超出預期,可以通過Information Schema視圖中的TASKS_HISTORY資料統計作業量和TOP費用作業。

    • 如果是儲存費用高出預期,您可以通過下載用量明細分析儲存費用變化。

    • 如果是公網下行流量費用高出預期,您可以通過Information Schema視圖中的TUNNELS_HISTORY資料統計公網下行流量費用變化。

步驟一:擷取Information Schema服務

自2024年03月01日開始,MaxCompute停止對新增專案自動安裝專案層級Information Schema,即新增的專案預設沒有專案層級Information Schema的Package。若有查中繼資料的業務,可以查詢租戶層級的Information Schema,以便擷取更全的資訊。租戶層級Information Schema的具體使用說明請參見租戶層級Information Schema

對於存量MaxCompute專案,在開始使用Information Schema服務前,需要以:

  • 專案所有者(Project Owner)或具備Super_Administrato管理角色的RAM使用者身份安裝Information Schema許可權包,獲得訪問專案中繼資料的許可權。更多為使用者授權管理角色操作資訊,請參見將角色賦予使用者

  • 安裝方式有如下兩種,更多關於Information Schema的功能及使用限制,請參見Information Schema概述

  • 如果統計多個MaxCompute專案的中繼資料,需要分別對各個MaxCompute專案安裝Information Schema許可權包。然後將各個MaxCompute專案的中繼資料的備份資料插入到同一個表中做集中統計分析。

  • 建議使用租戶層級Information Schema,便於查詢目前使用者所有專案的中繼資料資訊以及使用歷史資訊。

(可選)步驟二:對除Project Owner外的使用者授權

Information Schema的視圖包含了專案層級的所有使用者資料,預設專案所有者可以查看。如果專案內其他使用者或角色需要查看,需要進行授權,請參見基於Package跨專案訪問資源

授權文法如下。

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:已添加至專案中的阿里雲帳號或RAM使用者。

    您可以通過MaxCompute用戶端執行list users;命令擷取使用者帳號。

  • role_name:已添加至專案中的角色。

    您可以通過MaxCompute用戶端執行list roles;命令擷取角色名稱。

授權樣本如下。

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

(可選)步驟三:下載並備份中繼資料

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資料開發介面,建立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節點,將這些MaxCompute專案的中繼資料寫入到同一張資料備份表中。

步驟四:通過費用中心分析高額消費專案和計費項目

登入費用與成本控制台,通過如下方式分析高額消費專案和計費項目,詳情請參見查看賬單詳情

  • 在左側導覽列選擇賬單 > 賬單詳情,按统计项实例统计周期查看

    • 方式一:尋找產生高額費用的專案(執行個體ID)。如果有明顯的某個專案消費與預期不符,則針對該專案進行分析。

    • 方式二:尋找產生高額費用的計費項目。可以通過资源实例名称/ID搜尋指定的專案,針對具體專案分析具體的高額計費項目。

  • 在左側導覽列選擇成本分析,在成本分析頁面也可以較為直觀的尋找出消費上漲的計費項目。

步驟五:具體消費上漲原因排查

對高額消費專案和計費項目針對性分析排查消費上漲原因。

SQL作業計算費用高出預期

SQL作業整體消費較高(包含外部表格作業),可能是單條作業消費異常,也可能由於重複執行或調度屬性配置不合理造成作業量突增。

  1. 通過查詢消費異常作業的執行個體ID(inst_id),查看具體的執行資訊。

    1. 登入MaxCompute用戶端,使用use命令切換到步驟四找出的高額消費的專案,通過TASKS_HISTORY查詢作業消費情況,命令樣本如下。

      -- 開啟2.0資料類型開關。2.0資料類型詳情,請參見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天前的中繼資料,需要查詢通過步驟三備份的表,表名為<project_name>.tasks_history
      WHERE   task_type = 'SQL' OR task_type = 'SQLRT'
      AND ds = '待查詢的日期分區'
      ORDER BY cost_sum DESC
      LIMIT 10000
      ;
      說明
      • 一次SQL計算費用 = 計算輸入資料量×SQL複雜度×單價(0.0438 USD/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用戶端,使用use命令切換到步驟四找出的高額消費的專案,通過TASKS_HISTORY查詢重複啟動並執行作業,命令樣本如下。

      -- 分析作業增長趨勢。
      SELECT  signature
              ,ds
              ,COUNT(*) AS tasknum
      FROM    information_schema.tasks_history 
      --如果是查詢14天前的中繼資料,需要查詢通過步驟三備份的表,表名為<project_name>.tasks_history
      where   task_type = 'SQL' OR task_type = 'SQLRT'
      AND ds >= '待查詢的日期分區'
      GROUP BY ds
               ,signature
      ORDER BY tasknum DESC
      LIMIT   10000
      ;
      
      -- 確認異常的signature,查看對應的SQL作業近期執行情況
      SELECT  *
      FROM    information_schema.tasks_history 
      --如果是查詢14天前的中繼資料,需要查詢通過步驟三備份的表,表名為<project_name>.tasks_history
      where   signature = '異常signature'
      AND ds >= '待查詢的日期分區'
      ;

Spark計算費用高出預期

Spark作業整體消費較高,可以通過查詢消費異常的作業inst_id,查看具體的執行資訊。

  1. 登入MaxCompute用戶端,使用use命令切換到步驟四找出的高額消費的專案,通過TASKS_HISTORY查詢作業消費情況,命令樣本如下。

    -- 開啟2.0資料類型開關。2.0資料類型詳情,請參見2.0資料類型版本。
    SET odps.sql.decimal.odps2=true;
    SELECT  inst_id --執行個體id
    ,cost_cpu --作業CPU消耗(100表示1 core×s。例如:10 core運行5s,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天前的中繼資料,需要查詢通過步驟三備份的表,表名為<project_name>.tasks_history
    WHERE   task_type = 'CUPID' AND status='Terminated'
    AND ds = '待查詢的日期分區'
    ORDER BY cost_sum DESC
    LIMIT 10000
    ;
    說明
    • Spark作業當日計算費用 = 當日總計算時×單價(0.1041 USD/Hour/Task)。

    • 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用戶端,使用use命令切換到步驟四找出的高額消費的專案,通過TASKS_HISTORY查詢作業消費情況,命令樣本如下。

    -- 開啟2.0資料類型開關。2.0資料類型詳情,請參見2.0資料類型版本。
    SET odps.sql.decimal.odps2=true;
    SELECT  inst_id --執行個體id
    ,cost_cpu --作業CPU消耗(100表示1 core×s。例如:10 core運行5s,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天前的中繼資料,需要查詢通過步驟三備份的表,表名為<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用戶端,使用use命令切換到步驟四找出的高額消費的專案,通過TUNNELS_HISTORY查詢下載消費情況,命令樣本如下。

    --開啟2.0資料類型開關。2.0資料類型詳情,請參見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
    ;
    說明

    一次下載費用=下載資料量×單價(0.1166 USD/GB)。

  2. 按照執行結果也可以分析出某個時間段內的下載費用走勢。另外可以通過tunnel show history命令查看具體歷史資訊,具體命令請參見Tunnel命令image

更多資訊

瞭解更多關於費用成本最佳化的文章,請參見成本最佳化概述