MaxCompute用量明細賬單分析最佳實踐

MaxCompute用量明細賬單分析最佳實踐

MaxCompute中計算資源的計費方式分爲包年包月和按量計費兩種,產品每天會以Project爲維度進行計費(賬單會在第二天上午6點前生成)。

用量詳情賬單字段說明

查看自己的MaxCompute用量詳情,可以到控制檯中如下菜單進行查詢並導出到本地:

賬單明細字段如下:

  • 項目編號:當前賬號或子賬號對應的主賬號的MaxCompute Project列表。
  • 計量信息編號:以存儲、計算、上傳和下載的任務ID爲計費信息編號,SQL爲InstanceId,上傳和下載爲Tunnel SessionId。
  • 數據分類:Storage(存儲)、ComputationSql(計算)、UploadIn(內網上傳)、UploadEx(外網上傳)、DownloadIn(內網下載)、DownloadEx(外網下載)。按照計費規則其中只有紅色部分爲實際計費項目。
  • 存儲(Byte):每小時讀取的存儲量,單位爲Byte。
  • 開始時間/結束時間:按照實際作業執行時間進行計量,只有存儲是按照每個小時取一次數據。
  • SQL讀取量(Byte):SQL計算項,每一次SQL執行時SQL的Input數據量,單位爲Byte。
  • SQL複雜度(Byte):每次執行SQL的複雜度,爲SQL計費因子之一。
  • 公網上行流量(Byte)、公網下行流量(Byte):分別爲公網上傳和下載的數據量,單位Byte。
  • MR/Spark作業計算(CoreSecond):MapReduce/Spark作業的計算時單位爲CoreSecond,需要轉換爲計算時Hour。
  • SQL讀取量_訪問OTS(Byte)、SQL讀取量_訪問OSS(Byte):外部表實施收費後的讀取數據量,單位Byte。
  • 計算資源規格(按量計費):對應計量信息所在項目所屬的計算資源規格,若值爲NULL,則表示按量計費標準版;若值爲OdpsDev,則表示按量計費開發者版。
  • 計算資源規格(包年包月):對應計量信息所在項目所屬的計算資源規格。若值爲NULL,則表示包年包月標準版;若值爲OdpsPlus160CU150TB、 OdpsPlus320CU300TB、OdpsPlus600CU500TB,則分別表示存儲密集型160套餐、存儲密集型320套餐,存儲密集型600套餐。
  • DataWorks調度任務ID:計量作業在DataWorks上的調度節點ID。若值NULL,則表示非DataWorks調度節點提交的Job;若值爲一串數字ID,則表示Job對應DataWorks調度節點ID。您可以在DataWorks對應的項目中使用該ID搜索到具體任務。

下面將自己的20200415-20200425時間段內的MaxCompute用量賬單詳情導出到本地,然後在MaxCompute中創建表用於存儲賬單數據,進而進行相應的賬單數據分析。包括如下幾個部分:

  • 創建數據表並導入數據
  • 通過SQL分析賬單數據

創建數據表並導入數據

1. 將20200415-20200425時間段MaxCompute用量明細數據導出到本地,保存文件爲:odps_20200415_20200425_oms_data.csv。

2. 使用如下命令創建數據表,用於保存賬單數據:

DROP TABLE IF EXISTS maxcomputefee ;

CREATE TABLE IF NOT EXISTS maxcomputefee (
  projectid STRING COMMENT '項目編號',
  feeid STRING COMMENT '計費信息編號',
  type STRING COMMENT '數據分類,包括Storage、ComputationSQL、DownloadEx等',
  storage BIGINT COMMENT '存儲(Byte)',
  endtime DATETIME COMMENT '結束時間',
  computation_sql_input BIGINT COMMENT 'SQL/交互式分析 讀取量(Byte)',
  computation_sql_complexity 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的數據輸入量',
  starttime DATETIME COMMENT '開始時間',
  source_type String COMMENT '計算資源',
  source_id String COMMENT 'DataWorks調度任務ID'
);

3. 使用tunnel命令將本地數據上傳數據至數據表,命令如下:

odps@ YITIAN_BJ_MC>tunnel upload /Users/yitian/Documents/MaxCompute/maxcompute-data/odps_20200415_20200425_oms_data.csv maxcomputefee -c "UTF-8" -h "true" -dfp "yyyy-MM-dd HH:mm:ss";

4. 上傳完成後,使用如下命令檢查數據導入情況:

select count(*) from maxcomputefee;

返回結果爲:

1996

查詢數據前十條,檢查數據導入是否正確:

select * from maxcomputefee limit 10;

返回結果如下: 

 

通過SQL分析賬單數據

數據導入到MaxCompute之後,就可以進行相應的數據分析過程了,具體的分析示例如下。

示例1:分析SQL費用。雲上用戶使用MaxCompute,95%的用戶通過SQL即可滿足需求,SQL也在消費增長中佔了很大比例。說明:一次SQL計算費用=計算輸入數據量*SQL複雜度*單價(0.3元/GB)

 

-- 分析SQL費用
select to_char(endtime, 'yyyymmdd') as ds,
       feeid as instanceid,
       projectid,
       computation_sql_complexity,
       sum((cast(computation_sql_input as bigint) / 1024 / 1024 / 1024)) as computation_sql_input,
       sum((cast(computation_sql_input as bigint) / 1024 / 1024 / 1024)) * computation_sql_complexity * 0.3 as sqlmoney
from maxcomputefee
where type='ComputationSql'
  and computation_sql_input is not null
  and computation_sql_complexity is not null
  and to_char(endtime, 'yyyymmdd') >= '20200415'
group by to_char(endtime, 'yyyymmdd'), feeid, projectid, computation_sql_complexity
order by sqlmoney desc
limit 20;

返回結果如下: 

示例2:分析作業增長趨勢。通常費用的增長是由於重複執行或調度屬性配置不合理造成的作業量暴漲。

 

-- 分析作業增長趨勢
select to_char(endtime, 'yyyymmdd') as ds,
       projectid,
       count(*) as tasknum
from maxcomputefee
where type='ComputationSql' and  to_char(endtime, 'yyyymmdd') >= '20200415'
group by to_char(endtime, 'yyyymmdd'), projectid
order by tasknum desc
limit 20;

返回結果如下: 

示例3:分析存儲費用。說明 存儲費用的計費規則相對複雜。明細中是按每個小時取一次得出的數據。按照MaxCompute存儲計費規則,會先整體24小時求和,再將平均之後的值進行階梯收費。詳情請參見存儲費用(按量計費)

-- 分析存儲費用
select t.ds,
       t.projectid,
       t.storage,
       case when t.storage < 0.5 then 0.1
            when t.storage >= 0.5 and t.storage <= 10240 then t.storage * 0.0072
            when t.storage > 10240 and t.storage <= 102400 then (10240 * 0.0072 + (t.storage - 10240) * 0.006)
            when t.storage > 102400 then (10240 * 0.0072 + (102400 - 10240) * 0.006 + (t.storage - 102400) * 0.004)
       end as 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 storage is not null and storage > 0
  and to_char(starttime, 'yyyymmdd') >= '20200415'
  group by to_char(starttime, 'yyyymmdd'), projectid
) t
order by storage_fee desc
limit 20;

返回結果如下:

 

 

根據執行結果可以分析得出如下結論:

  • 由於數據量很小,因此這裏的存儲開銷很比較少。
  • 對於數據量比較大時的存儲優化,建議爲表設置生命週期,刪除長期不使用的臨時表等。

示例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') >= '20200415'
and download is not null
group by to_char(starttime, 'yyyymmdd'), projectid
order by download_fee desc
limit 20;

返回結果如下: 

示例5:分析MapReduce作業消費。說明 MapReduce任務當日計算費用=當日總計算時*單價(0.46元)

-- 分析MapReduce作業消費(暫時無數據)
SELECT  TO_CHAR(starttime,'yyyymmdd') AS ds,
        projectid,
        (cu_usage/3600)*0.46 AS mr_fee
FROM    maxcomputefee
WHERE   type = 'MapReduce'
and     cu_usage is not null
AND     TO_CHAR(starttime, 'yyyymmdd') >= '20200415'
GROUP BY TO_CHAR(starttime, 'yyyymmdd'), projectid, cu_usage
ORDER BY mr_fee DESC
limit 20;

示例6:分析外部表作業(OTS和OSS)。說明 一次SQL外部表計算費用=計算輸入數據量*SQL複雜度(1)*單價(0.03元/GB)

--分析OTS外部表SQL作業消費(暫時無數據)
SELECT  TO_CHAR(starttime,'yyyymmdd') AS ds,
        projectid,
        (input_ots/1024/1024/1024)*1*0.03 AS ots_fee
FROM    maxcomputefee
WHERE   type = 'ComputationSql'
AND     input_ots is not null
AND     TO_CHAR(starttime, 'yyyymmdd') >= '20200415'
GROUP BY TO_CHAR(starttime, 'yyyymmdd'), projectid, input_ots
ORDER BY ots_fee DESC
limit 20;

--分析OSS外部表SQL作業消費(暫時無數據)
SELECT  TO_CHAR(starttime,'yyyymmdd') AS ds,
        projectid,
        (input_oss/1024/1024/1024)*1*0.03 AS ots_fee
FROM    maxcomputefee
WHERE   type = 'ComputationSql'
AND     input_oss is not null
AND     TO_CHAR(starttime,'yyyymmdd') >= '20200415'
GROUP BY TO_CHAR(starttime,'yyyymmdd'), projectid, input_oss
ORDER BY ots_fee DESC
limit 20;

示例7:分析Lightning查詢費用。說明 一次Lightning查詢費用 = 查詢輸入數據量*單價(0.03元/GB)

-- 分析Lightning查詢費用(暫時無數據)
SELECT  to_char(endtime,'yyyymmdd') as ds,
        feeid as instanceid,
        projectid,
        computation_sql_complexity,
        SUM((computation_sql_input / 1024 / 1024 / 1024)) as computationsqlinput,
        SUM((computation_sql_input / 1024 / 1024 / 1024)) * computation_sql_complexity * 0.03 AS sqlmoney
FROM    maxcomputefee
WHERE   TYPE = 'LightningQuery'
--AND to_char(endtime,'yyyymmdd') >= '20190112'
AND     computation_sql_input is not null 
AND     computation_sql_complexity is not null
GROUP BY to_char(endtime, 'yyyymmdd'), feeid, projectid, computation_sql_complexity
ORDER BY sqlmoney DESC
LIMIT   20;

示例8:分析Spark計算費用。說明 Spark任務當日計算費用 = 當日總計算時*單價(0.66元/計算時)

--分析Spark作業消費(暫時無數據)
SELECT  TO_CHAR(starttime, 'yyyymmdd') AS ds,
        projectid,
        (cu_usage/3600)*0.66 AS mr_fee
FROM    maxcomputefee
WHERE   type = 'spark'
AND     cu_usage it not null
AND     TO_CHAR(starttime, 'yyyymmdd') >= '20200415'
GROUP BY TO_CHAR(starttime, 'yyyymmdd'), projectid, cu_usage
ORDER BY mr_fee DESC
limit 20;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章