本文为您介绍如何分析MaxCompute账单。

背景信息

MaxCompute是一款大数据分析平台,其计算资源的计费方式分为包年包月和按量计费两种,每天以项目为维度进行计费(账单会在第二天06:00前生成)。关于MaxCompute计量计费说明,详情请参见计费方式

系统会在数据开发阶段或者在产品上线前夕发布账单波动(通常情况下为消费增长)信息。您可以通过自助的方式来分析账单波动情况,再对自己的作业进行优化。您可以在阿里云费用中心下载阿里云所有收费产品的费用明细。账单的获取和下载,请参见查看账单详情

账单字段说明

账单明细字段如下:
  • 项目编号:当前账号或RAM用户对应的主账号的MaxCompute项目列表。
  • 计量信息编号:以存储、计算、上传和下载的任务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作业计算(Core*Second):MapReduce或Spark作业的计算时单位为Core*Second,需要转换为计算时Hour。
  • SQL读取量_访问OTS(Byte)、SQL读取量_访问OSS(Byte):外部表实施收费后的读取数据量,单位Byte。

上传账单明细至MaxCompute

  1. 确认CSV文件数据,尤其是列分隔符等。数据以英文逗号(,)分隔,且单元格值都带有双引号。导出信息
  2. 使用MaxCompute客户端(odpscmd)创建MaxCompute表maxcomputefee,存储下载的消费明细。
    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 STRING COMMENT '结束时间'
        ,computationsqlinput BIGINT COMMENT 'SQL/交互式分析 读取量(Byte)'
        ,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的数据输入量'
        ,starttime STRING COMMENT '开始时间'
        ,source_type STRING COMMENT '计算资源'
        ,source_id STRING COMMENT 'DataWorks调度任务ID'
    );
  3. 使用Tunnel上传数据,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";
    tunnel上传
    说明 您也可以通过DataWorks的数据导入功能来执行此操作,具体请参见数据集成导入导出数据
  4. 执行如下语句验证数据。
    SELECT * FROM maxcomputefee limit 10;
    验证导入结果

通过SQL分析账单数据

  1. 分析SQL费用。云上用户使用MaxCompute,95%的用户通过SQL即可满足需求,SQL也在消费增长中占很大比例。
    说明 一次SQL计算费用 = 计算输入数据量×SQL复杂度×单价(0.0438 USD/GB)
    --分析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等工具绘制折线图等方式,更直观的反应作业的趋势。
    • 根据执行结果可以定位到需要优化的点,方法如下:
      1. 获取具体的InstanceId。
        在MaxCompute客户端(odpscmd)或DataWorks中执行WAIT InstanceId;命令,查看具体作业和SQL。wait命令
      2. 在浏览器中打开Logview的URL地址。
        关于Logview的介绍请参见使用Logview查看作业运行信息Logview
      3. 从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. 分析存储费用。
    --分析存储费用。
    SELECT  t.ds
            ,t.projectid
            ,t.storage
            ,CASE    WHEN t.storage < 0.5 THEN 0.01
                     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 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日出现降低。
    • 存储优化,建议为表设置生命周期,删除长期不使用的临时表等。
  4. 分析下载费用。
    对于外网或者跨区域的数据下载,MaxCompute将按照下载的数据量进行计费。
    说明 一次下载费用=下载数据量×单价(0.1166USD/GB)
    --分析下载消费明细。
    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
    ;
  5. 分析MapReduce作业消费。
    说明 MapReduce作业当日计算费用 = 当日总计算时×单价(0.0690 USD/Hour/Task)
    --分析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
    ;
  6. 分析外部表作业(OTS和OSS)。
    说明 一次SQL外部表计算费用 = 计算输入数据量×SQL复杂度×单价(0.0044 USD/GB)
    --分析OTS外部表SQL作业消费。
    SELECT  TO_CHAR(starttime,'yyyymmdd') AS ds
            ,projectid
            ,(input_ots/1024/1024/1024)*1*0.0044 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)*1*0.0044 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
    ;
  7. 分析Spark计算费用。
    说明 Spark作业当日计算费用 = 当日总计算时×单价(0.1041 USD/Hour/Task)
    --分析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
    ;