1. 程式人生 > >21分鐘教會你分析MaxCompute賬單

21分鐘教會你分析MaxCompute賬單

1.5 產生 推薦 安保 source 公網 文章 但是 調度

背景
阿裏雲大計算服務MaxCompute是一款商業化的大數據分析平臺,其計算資源有預付費和後付費兩種計費方式。並且產品每天按照project為維度進行計量計費(賬單基本情況下會第二天6點前產出)。本文使用的為雲上客戶真實數據,故在下文中的截圖都mask掉了。

關於MaxCompute計量計費說明,詳見官方文檔:

技術分享圖片

但是通常情況下,我們在數據開發階段或者在上線前夕會發下賬單有波動(通常情況下為增大), 其實用戶首先可以通過自助的方式來分析賬單波動情況,再倒逼自己的作業進行優化。阿裏雲費用中心就是一個很好的通道,阿裏雲所有商業化收費的產品都可以在其中下載費用明細。

獲取賬單信息
通常您需要使用主賬號查看賬單詳情。如果您需要使用子賬號查看賬單信息,請首先參考費用中心RAM配置策略行子賬號授權。

step1:使用主賬號或者被授權的RAM子賬號來登錄阿裏雲管控臺。
step2:右上角進入費用中心。

技術分享圖片

step3:在費用中心-消費記錄-消費明細中,選擇產品和賬單日期。
技術分享圖片

包年包月中的 後付費是指項目開通包年包月計算計費模式後,還產生的存儲、下載對應的費用(存儲、下載費用只有後付費)。

step4:為了方便批量分析數據,我們選擇下載使用記錄csv文件在本地分析。

技術分享圖片

下載csv文件如下,可以在本地打開進行分析。

技術分享圖片

--csv的表頭
項目編號,計量信息編號,數據分類,存儲(Byte),SQL 讀取量(Byte),SQL 復雜度(Byte),公網上行流量(Byte),公網下行流量(Byte),MR 作業計算,開始時間,結束時間,SQL讀取量_訪問OTS(Byte),SQL讀取量_訪問OSS(Byte)

上傳賬單明細至MaxCompute
使用記錄明細字段解釋:

項目編號:當前賬號下或子賬號對應的主賬號的MaxCompute project列表。
計量信息編號:其中會包含存儲、計算、上傳和下載的計費信息編號,SQL為instanceid,上傳和下載為Tunnel sessionid。
數據分類:Storage(存儲)、ComputationSql(計算)、UploadIn(內網上傳)、UploadEx(外網上傳)、DownloadIn(內網下載)、DownloadEx(外網下載)。按照計費規則其中只有紅色為實際計費項目。
開始時間/結束時間:按照實際作業執行時間進行計量,只有Storage是按照每個小時取一次數據。

存儲(Byte):每小時讀取的存儲量單位為Byte。
SQL 讀取量(Byte):SQL計算項,每一次SQL執行時SQL的input數據量,單位為Byte。
SQL 復雜度(Byte):每次執行SQL的復雜度,為SQL計費因子之一。
公網上行流量(Byte),公網下行流量(Byte):分別為公網上傳和下載的數據量,單位Byte。
MR作業計算(CoreSecond):MR作業的計算時單位為coresecond,需要轉換為計算時hour。
SQL讀取量_訪問OTS(Byte),SQL讀取量_訪問OSS(Byte):外部表實施收費後的讀取數據量,單位Byte。
① 確認CSV文件數據,尤其是列分隔符等(推薦使用UE)。
技術分享圖片

數據以逗號分隔,且單元格值都帶有雙引號。技術分享圖片

② 數據預處理:替換掉文檔所有雙引號,以方便使用Tunnel等上傳工具。

替換為不用填寫。直接點擊全部替換。

③ 創建MaxCompute表,存儲下載的消費明細。

DROP TABLE IF EXISTS maxcomputefee ;

CREATE TABLE IF NOT EXISTS maxcomputefee
(
projectid STRING COMMENT ‘項目編號‘
,feeid STRING COMMENT ‘計費信息編號‘
,type STRING COMMENT ‘數據分類,包括Storage、ComputationSQL、DownloadEx等‘
,starttime DATETIME COMMENT ‘開始時間‘
,storage BIGINT COMMENT ‘存儲量‘
,endtime DATETIME COMMENT ‘結束時間‘
,computationsqlinput BIGINT COMMENT ‘輸入數據量‘
,computationsqlcomplexity DOUBLE COMMENT ‘sql復雜度‘
,uploadex BIGINT COMMENT ‘公網上行流量Byte‘
,download BIGINT COMMENT ‘公網下行流量Byte‘
,cu_usage DOUBLE COMMENT ‘MR計算時*second‘
,input_ots BIGINT COMMENT ‘訪問OTS的數據輸入量‘
,input_oss BIGINT COMMENT ‘訪問OSS的數據輸入量‘
)
;
④ Tunnel上傳數據,具體Tunnel的配置詳見官方文檔。
odps@ sz_mc>tunnel upload /Users/yangyi/Desktop/ODPS_2019-01-12_2019-01-14.csv maxcomputefee -c "UTF-8" -h "true" -dfp "yyyy-MM-dd HH:mm:ss";

技術分享圖片

當然用戶也可以通過DataWorks數據導入的功能來進行,具體詳見操作步驟。

⑤ 驗證數據。

技術分享圖片

通過SQL分析賬單數據
1、分析SQL費用
雲上客戶使用MaxCompute,95%的用戶通過SQL即可滿足需求,SQL也在消費成長中占據了絕大部分。
SQL費用=一次SQL計算費用 = 計算輸入數據量 SQL復雜度 0.3元/GB

--分析SQL消費,按照SQL進行排行
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.3 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
;
--查詢結果--
技術分享圖片

根據此段SQL執行結果可以得到如下結論:

大作業可以優化的點:**是否可以減小數據讀取量、降低復雜度來優化費用成本。
也可以按照ds字段(按照天)進行匯總,分析某個時間段內的SQL消費金額走勢。比如利用本地excle或雲上QuickBI等工具繪制折線圖等方式,更直觀的反應作業的趨勢。
拿到具體的instanceid,在console或者DataWorks腳本中進行wait instanceid;查看具體作業和SQL。
image
隨即在瀏覽器中打開logview的url地址(關於logview的介紹詳見官方文檔):

技術分享圖片

從logview中獲取DataWorks節點名稱:
在logview中打開SourceXML可以查看到具體執行信息,如SKYNET_NODENAME表示DataWorks的節點名稱(當然只有被調度系統執行的作業才有值,臨時查詢為空,如下圖所示)。拿到節點名稱可以快速的在DataWorks找到該節點進行優化或查看責任人。

技術分享圖片

2、分析作業增長趨勢
一般情況下費用的增長背後其實是作業量的暴漲,可能是重復執行,也可能是調度屬性配置的不是很合理。

--分析作業增長趨勢
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且執行成功的作業數的波動趨勢。

3、分析存儲費用
存儲費用的計費規則相對來說比較復雜,因為下載到的明細是每個小時取一次數據。按照MaxCompute存儲計費規則,會整體24小時求和然後平均之後的值再階梯收費。具體詳見官網。

--分析存儲費用
SELECT t.ds
,t.projectid
,t.storage
,CASE WHEN t.storage < 0.5 THEN 0.01
WHEN t.storage >= 0.5 AND t.storage <= 100 THEN t.storage0.0192
WHEN t.storage > 100 AND t.storage <= 1024 THEN (100
0.0192+(t.storage-100)0.0096)
WHEN t.storage > 1024 AND t.storage <= 10240 THEN (100
0.0192+(1024-100)0.0096+(t.storage-1024)0.0084)
WHEN t.storage > 10240 AND t.storage <= 102400 THEN (1000.0192+(1024-100)0.0096+(10240-1024)0.0084+(t.storage-10240)0.0072)
WHEN t.storage > 102400 AND t.storage <= 1048576 THEN (1000.0192+(1024-100)0.0096+(10240-1024)0.0084+(102400-10240)0.0072+(t.storage-102400)*0.006)
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
;
--執行結果--

技術分享圖片

根據計算結果可以分析得出結論:

存儲在13日為最高有一個增長的過程,但是在14日是有降低。
存儲優化,建議表設置生命周期,刪除長期不使用的臨時表等。
4、分析下載費用
對於公網或者跨Region的數據下載,MaxCompute將按照下載的數據大小進行計費。計費公式為:一次下載費用=下載數據量*0.8元/GB。

--分析下載消費明細
SELECT TO_CHAR(starttime,‘yyyymmdd‘) AS ds
,projectid
,SUM((download/1024/1024/1024)*0.8) 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
;
按照執行結果也可以分析出某個時間段內的下載費用走勢。另外可以通過tunnel show history查看具體歷史信息,具體命令詳見官方文檔。

以下幾種計算作業與SQL類似,按照官方計費文檔編寫SQL即可。

5、分析MapReduce作業消費
MR任務當日計算費用=當日總計算時*0.46元

--分析MR作業消費
SELECT TO_CHAR(starttime,‘yyyymmdd‘) AS ds
,projectid
,(cu_usage/3600)*0.46 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
;
6、分析外部表作業(OTS和OSS)
SQL外部表功能計費規則:一次SQL計算費用=計算輸入數據量SQL復雜度0.03元/GB

--分析OTS外部表SQL作業消費
SELECT TO_CHAR(starttime,‘yyyymmdd‘) AS ds
,projectid
,(input_ots/1024/1024/1024)10.03 AS ots_fee
FROM maxcomputefee
WHERE type = ‘ComputationSql‘
AND TO_CHAR(starttime,‘yyyymmdd‘) >= ‘20190112‘
GROUP BY TO_CHAR(starttime,‘yyyymmdd‘)
,projectid
,input_ots
ORDER BY ots_fee DESC
;

--分析OSS外部表SQL作業消費
SELECT TO_CHAR(starttime,‘yyyymmdd‘) AS ds
,projectid
,(input_oss/1024/1024/1024)10.03 AS ots_fee
FROM maxcomputefee
WHERE type = ‘ComputationSql‘
AND TO_CHAR(starttime,‘yyyymmdd‘) >= ‘20190112‘
GROUP BY TO_CHAR(starttime,‘yyyymmdd‘)
,projectid
,input_oss
ORDER BY ots_fee DESC
;
總結
MaxCompute產品消費的增長(暴漲)往往背後都是由於作業量的大幅度提升,要優化自己的費用成本,首選要知道自己SQL等作業中存在什麽問題,要優化具體哪一個SQL。本文期望能夠給予大家一些幫助。更多關於費用成本優化的文章可以詳見,雲棲社區《幫助企業做好MaxCompute大數據平臺成本優化的最佳實踐》和《眾安保險如果優化自己的MaxCompute費用成本實踐》。

21分鐘教會你分析MaxCompute賬單