如果您想瞭解費用的分布情況並避免在使用MaxCompute產品時費用超出預期,您可以通過擷取MaxCompute賬單並進行分析,為資源使用率最大化及降低成本提供有效支撐。本文為您介紹如何通過用量明細表分析MaxCompute的費用分布情況。
背景資訊
MaxCompute是一款巨量資料分析平台,其計算資源的計費方式分為訂用帳戶和隨用隨付兩種。MaxCompute每天以專案為維度進行計費,賬單會在第二天06:00前產生。更多MaxCompute計量計費資訊,請參見計費項目與計費方式概述。
MaxCompute會在資料開發階段或者產品上線前發布賬單波動(通常情況下為消費增長)資訊。您可以自助分析賬單波動情況,再對MaxCompute專案的作業進行最佳化。您可以在阿里雲費用中心下載阿里雲所有收費產品的用量明細。更多擷取和下載賬單操作,請參見查看賬單詳情。
步驟一:下載用量明細
您可以通過用量明細下載每天的詳細使用資訊,瞭解費用是如何產生。例如每天的儲存費用、計算費用是由哪些任務產生的。
配置參數說明如下:
產品:選擇MaxCompute(隨用隨付)。
計量規格:
MaxCompute(隨用隨付)是隨用隨付模式的計量明細。
ODPSDataPlus是訂用帳戶模式的計量明細。
使用時間:單擊下拉框選擇開始時間和結束時間。
如果出現跨天執行的任務,例如某任務開始時間為12月1日,結束時間為12月2日,那麼需要選擇開始時間為12月1日才能在下載的用量明細表中查詢到該任務,但是該任務的消費記錄體現在12月2日的賬單中。
單擊匯出CSV,等待一段時間後,可前往匯出記錄下載用量明細表。
步驟二(可選):上傳用量詳細資料至MaxCompute
如果您期望通過MaxCompute SQL進行用量明細分析,則需要參考本步驟將用量明細匯入MaxCompute;如果您只希望使用Excel進行用量明細分析,則無需進行此步驟。
使用MaxCompute用戶端(odpscmd)按如下樣本語句建立
maxcomputefee
表。CREATE TABLE IF NOT EXISTS maxcomputefee ( projectid STRING COMMENT '專案編號' ,feeid STRING COMMENT '計費資訊編號' ,meteringtime STRING COMMENT '檔案表頭(MeteringTime)' ,type STRING COMMENT '資料分類,包括Storage、ComputationSQL、DownloadEx等' ,starttime STRING COMMENT '開始時間' ,storage BIGINT COMMENT '儲存(Byte)' ,endtime STRING COMMENT '結束時間' ,computationsqlinput BIGINT COMMENT 'SQL/互動式分析讀取量(Byte)' ,computationsqlcomplexity DOUBLE COMMENT 'SQL複雜度' ,uploadex BIGINT COMMENT '公網上行流量Byte' ,download BIGINT COMMENT '公網下行流量Byte' ,cu_usage DOUBLE COMMENT 'MR/Spark作業計算(core*second)' ,Region STRING COMMENT '地區' ,input_ots BIGINT COMMENT '訪問OTS的資料輸入量' ,input_oss BIGINT COMMENT '訪問OSS的資料輸入量' ,source_id STRING COMMENT 'DataWorks調度任務ID' ,source_type STRING COMMENT '計算資源規格' ,RecycleBinStorage BIGINT COMMENT '備份儲存(Byte)' ,JobOwner STRING COMMENT '作業Owner' ,Signature STRING COMMENT 'SQL作業簽名' );
賬單詳細欄位說明如下:
專案編號:當前帳號或RAM使用者對應的阿里雲帳號的MaxCompute專案列表。
計量資訊編號:以儲存、計算、上傳和下載的任務ID為計費資訊編號,SQL為InstanceID,上傳和下載為Tunnel SessionId。
資料分類:Storage(儲存)、ComputationSql(計算)、UploadIn(內網上傳)、UploadEx(外網上傳)、DownloadIn(內網下載)、DownloadEx(外網下載)。按照計費規則只有紅色部分為實際計費項目。
儲存(Byte):每小時讀取的儲存量,單位為Byte。
開始時間或結束時間:按照實際作業執行時間進行計量,只有儲存是按照每個小時取一次資料。
SQL/互動式分析讀取量(Byte):SQL計算項,每一次SQL執行時SQL的Input資料量,單位為Byte。
SQL複雜度:SQL的複雜度,為SQL計費因子之一。
公網上行流量(Byte)或公網下行流量(Byte):分別為外網上傳或下載的資料量,單位為Byte。
MR/Spark作業計算(Core*Second):MapReduce或Spark作業的計算時單位為
Core*Second
,需要轉換為計算時Hour。SQL讀取量_訪問OTS(Byte)、SQL讀取量_訪問OSS(Byte):外部表格實施收費後的讀取資料量,單位為Byte。
備份儲存(Byte):每小時讀取的備份儲存量,單位為Byte。
地區:MaxCompute專案所在的地區。
作業Owner:提交作業的使用者。
SQL作業簽名:用於標識SQL作業,主體內容一致、而多次重複或調度執行的SQL作業簽名一致。
使用Tunnel上傳資料。
在上傳CSV檔案時,您需確保CSV檔案中的列數、資料類型必須與表maxcomputefee的列數、資料類型保持一致,否則會匯入失敗。
tunnel upload ODPS_2019-01-12_2019-01-14.csv maxcomputefee -c "UTF-8" -h "true" -dfp "yyyy-MM-dd HH:mm:ss";
說明Tunnel的配置詳情請參見Tunnel命令。
您也可以通過DataWorks的資料匯入功能來執行此操作,具體請參見使用DataWorks(離線與即時)。
執行如下語句驗證資料。
SELECT * FROM maxcomputefee limit 10;
步驟三:分析賬單資料
分析SQL費用。
雲上使用者使用MaxCompute,95%的使用者通過SQL即可滿足需求,SQL也在消費增長中占很大比例。
一次SQL計算費用 = 計算輸入資料量×SQL複雜度×單價(0.0438 USD/GB)
通過Excel分析:分析用量明細中資料分類為ComputationSql的資料。對SQL作業費用進行排序,觀察是否存在某些SQL作業費用超出預期或者SQL任務過多。SQL作業費用計算公式為(
SQL/互動式分析讀取量(Byte)/1024/1024/1024 × SQL複雜度 × SQL單價)
。通過SQL分析(已完成步驟二的資料匯入,產生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
欄位(按照天)進行匯總,分析某個時間段內的SQL消費金額走勢。例如利用本地Excel或Quick BI等工具繪製折線圖等方式,更直觀地反映作業的趨勢。根據執行結果可以定位到需要最佳化的點,方法如下:
通過查詢的instanceid,擷取目標執行個體作業記錄的Logview地址。
在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,對目標節點進行最佳化。
分析作業增長趨勢
通常費用的增長是由於重複執行或調度屬性配置不合理造成作業量暴漲導致。
通過Excel分析:分析用量明細中資料分類為ComputationSql的資料。統計各專案每天的作業數量,觀察是否存在某些專案作業數量波動較大。
通過SQL分析(已完成步驟二的資料匯入,產生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 ;
執行結果如下。從執行結果可以看出12~14日提交到MaxCompute且執行成功的作業數的波動趨勢。
分析儲存費用
通過Excel分析儲存收取1分錢的原因:
開通MaxCompute進行試用,當前沒有業務在MaxCompute上運行,但是每天都有1分錢賬單,此問題一般是因為有存留資料在MaxCompute上儲存,且資料量不超過0.5 GB。
查看資料分類中的Storage儲存計費項目,發現
maxcompute_doc
專案下儲存了508 Byte資料,如下圖所示。按照儲存費用計費規則,小於等於512 MB資料收取1分錢。如果這份資料只用於測試,您可以通過以下方式解決此問題。僅表資料不再使用,請執行
Drop Table
語句刪除Project下的表資料。Project不再使用,請通過MaxCompute控制台的專案管理刪除專案。
通過Excel分析
不足一天
的資料存放區費用:查看資料分類中的Storage儲存計費項目,會發現在alian專案下儲存了333507833900位元組資料,由於是8點上傳的資料,所以從09:07開始計量儲存費用,一共計量15小時。
說明天計量範圍以當天的結束時間為準,所以最後一條資料不包括在4月4日賬單中。
按照儲存費用計費規則先計算24小時儲存平均值,再根據計費公式進行計算。
--計算儲存平均值。 333507833900 Byte×15/1024/1024/1024/24=194.127109076362103 GB --一天的儲存費用計算如下,結果保留4位小數。 194.127109076362103GB×0.0006 USD/GB/天=0.1165 USD/天
通過SQL分析儲存費用的分布(已完成步驟二的資料匯入,產生maxcomputefee表):
--分析儲存費用。 SELECT t.ds ,t.projectid ,t.storage ,CASE WHEN t.storage < 0.5 THEN t.storage*0.01 ---當專案的實際資料存放區量大於0 MB小於等於512MB時,計費單價為0.01元/GB/天 WHEN t.storage >= 0.5 THEN t.storage*0.004 ---當專案的實際資料存放區量大於512MB時,計費單價為0.004元/GB/天 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 ;
執行結果如下。根據執行結果可以分析得出如下結論:
儲存在12日有一個增長的過程,但在14日出現降低。
儲存最佳化,建議為表設定生命週期,刪除長期不使用的暫存資料表等。
通過SQL分析長期儲存、低頻儲存、長期儲存訪問和低頻儲存訪問的分布。(已完成步驟二的資料匯入,產生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; --分析低頻儲存費用。 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; --分析低頻儲存訪問費用。 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將按照下載的資料量進行計費。
一次下載費用=下載資料量×單價(0.1166USD/GB)
通過Excel分析:資料分類為DownloadEx代表公網下載計費項目。
公網下行流量產生了一條約0.036 GB(38199736 Byte)的下行流量,根據下載費用(隨用隨付)標準,產生費用為
(38,199,736 bytes/1024/1024/1024) × 0.1166 USD/GB = 0.004 USD
。下載最佳化舉例。查看您的Tunnel設定的Service,是否因為設定了公用網路產生費用,更多資訊請參見Endpoint。如果是大批量下載,您本地在蘇州,Region在華東2(上海),則可以先通過華東2(上海)的ECS把資料下載到虛擬機器,然後利用ECS包月下載資源。
通過SQL分析下載費用的分布(已完成步驟二的資料匯入,產生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作業當日計算費用 = 當日總計算時×單價(0.0690 USD/Hour/Task)
通過Excel分析:分析用量明細中資料分類為MapReduce的資料。按照計算資源規格分別對MapReduce作業費用進行計算及排序。MapReduce作業費用計算公式為
(MR/Spark作業計算(Core*Second)/3600 × 單價(0.0690))。
通過SQL分析(已完成步驟二的資料匯入,產生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 ;
分析外部表格作業(OTS和OSS)
一次SQL外部表格計算費用 = 計算輸入資料量×單價(0.0044 USD/GB)
通過Excel分析:分析用量明細中資料分類為ComputationSqlOTS、ComputationSqlOSS的資料。對SQL外部表格計算費用進行排序,費用計算公式為
SQL/互動式分析讀取量(Byte)/1024/1024/1024 × 單價 ( 0.0044)
。通過SQL分析(已完成步驟二的資料匯入,產生maxcomputefee表):
--分析OTS外部表格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作業當日計算費用 = 當日總計算時×單價(0.1041 USD/Hour/Task)
通過Excel分析:分用量明細中資料分類為spark的資料。對作業費用進行排序,計算公式為
(MR/Spark作業計算(Core*Second)/3600 × 單價(0.1041))
。通過SQL分析(已完成步驟二的資料匯入,產生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 ;
相關文檔
TO_CHAR函數分為字串類型和日期類型兩種,關於TO_CHAR函數的詳情,請參見TO_CHAR。