全部產品
Search
文件中心

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

更新時間:Jun 25, 2024

在使用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服務,便於查詢目前使用者所有專案的中繼資料資訊以及使用歷史資訊。更多資訊請參見租戶層級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節點操作,請參見建立ODPS SQL節點

    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。如果有明顯的某個專案消費與預期不符,則針對該專案進行分析。image

  • 賬單詳情頁面的明細賬單頁簽下,按統計項計費項目統計周期按天進行查看,尋找產生高額費用的計費項目。可以通過執行個體ID搜尋指定的專案,針對具體專案分析具體的高額計費項目。image

  • 成本分析頁面也可以較為直觀的尋找出消費上漲的計費項目。

    image

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

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

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. 尋找運行數量較多的重複作業。

登入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.66 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.46 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賬單用量明細分析

公網下行流量費用高出預期

公網下行流量整體消費較高,可以按照如下操作分析具體哪段時間哪個類別的下載費用較高。

登入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)。

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

更多資訊

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