在使用MaxCompute開發過程中會產生費用,如果平時每日消費比較平穩,某段時間的費用增長翻倍。在排除業務增長的情況下,可以進行費用分析,排查導致費用突增的專案、作業是哪些,進而及時最佳化和調整作業,最佳化成本。本文為您介紹如何結合賬單詳情和MaxCompute中繼資料服務(Information Schema)排查MaxCompute後付費消費突增。
背景資訊
本文排查MaxCompute後付費消費突增總體思路如下:
通過費用中心確認費用超出預期的日期,然後確認當天具體是哪個專案中的哪個計費項目產生了高額費用。
分析具體的消費上漲原因:
如果是計算費用超出預期,您可以通過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用戶端,執行如下命令:
install package Information_Schema.systables;
登入DataWorks控制台,進入臨時查詢介面。更多臨時查詢操作詳情,請參見使用臨時查詢運行SQL語句(可選)。執行如下命令:
install package Information_Schema.systables;
如果統計多個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天以內的作業運行歷史,可以忽略此步驟。
登入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 );
進入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。如果有明顯的某個專案消費與預期不符,則針對該專案進行分析。
在賬單詳情頁面的明細賬單頁簽下,按統計項為計費項目、統計周期為按天進行查看,尋找產生高額費用的計費項目。可以通過執行個體ID搜尋指定的專案,針對具體專案分析具體的高額計費項目。
在成本分析頁面也可以較為直觀的尋找出消費上漲的計費項目。
步驟五:具體消費上漲原因排查
對高額消費專案和計費項目針對性分析排查消費上漲原因。
SQL作業計算費用高出預期
SQL作業整體消費較高(包含外部表格作業),可能是單條作業消費異常,也可能由於重複執行或調度屬性配置不合理造成作業量突增。
可以通過查詢消費異常作業的執行個體ID(inst_id),查看具體的執行資訊。
登入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查詢加速作業。
查看消費較高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用戶端,使用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
,查看具體的執行資訊。
登入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作業。
根據
inst_id
,查看具體的執行資訊,命令樣本如下。select operation_text from information_schema.tasks_history where ds='任務執行所在日期分區' and inst_id='<inst_id>';
MapReduce作業消費高出預期
MapReduce作業整體消費較高,可以通過查詢消費異常的作業inst_id
,查看具體的執行資訊。
登入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 ;
根據
inst_id
,查看具體的執行資訊,命令樣本如下。select operation_text from information_schema.tasks_history where ds='任務執行所在日期分區' and inst_id='<inst_id>';
儲存費用高出預期
需要使用用量明細查詢儲存費用。
下載用量明細,詳情請參見下載用量明細。
上傳用量明細,詳情請參見上傳用量詳細資料至MaxCompute。
通過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命令。
更多資訊
如果您想瞭解更多關於費用成本最佳化的文章,請參見成本最佳化概述。