MaxCompute按量付费业务流程的计量明细统计

一、计量明细的介绍和使用

1.1导出用量明细数据

用量明细的参考文档

https://help.aliyun.com/document_detail/53057.html


费用账单>用量明细 可以看到费用明细下的用量明细,在右侧选择大数据计算服务MaxCompute(按量付费),并选择所有统计的时间段,以及计费粒度,填写验证码,选择导出CSV。

MaxCompute按量付费业务流程的计量明细统计

可以看到界面的正处于导出状态,稍等片刻,可以看到导出成功的状态,点击下载功能

MaxCompute按量付费业务流程的计量明细统计

经过筛选后可以看到使用的业务流程主要为3个SQL任务

MaxCompute按量付费业务流程的计量明细统计


1.2在MaxCompute创建用量明细的表

用量明细的表以及所有字段

CREATE TABLE IF NOT EXISTS OdpsFee(
ProjectId          STRING COMMENT '项目编号',
MeteringId         STRING COMMENT '计量信息编号',
Type                  STRING COMMENT '数据分类',
Storage            STRING COMMENT '存储(Byte)',
EndTime            STRING COMMENT '结束时间',
ComputationSqlInput  STRING COMMENT 'SQL读取量',
ComputationSqlComplexity  STRING COMMENT 'SQL复杂度',
Upload STRING COMMENT '公网上行',
Download STRING COMMENT '公网下行',
ComputationCount STRING COMMENT 'MR/Spark作业计算(Core*Second)',
SqlReadOTS STRING COMMENT 'SQL读取量_访问OTS(Byte)',
SqlReadOSS STRING COMMENT 'SQL读取量_访问OSS(Byte)',
StartTime STRING COMMENT '开始时间',
OdpsSpecCode STRING COMMENT '计算资源规格',
DataWorksID STRING COMMENT 'DataWorks调度任务ID'
);


在DataWorks创建表

MaxCompute按量付费业务流程的计量明细统计

查看MaxCompute表是否创建成功

MaxCompute按量付费业务流程的计量明细统计

1.3将下载的计量明细数据到入到MaxCompute表中

在业务流程中中,鼠标指向表,并点击右键,选择导入数据

MaxCompute按量付费业务流程的计量明细统计

选择创建的表odpsFree

MaxCompute按量付费业务流程的计量明细统计

选择浏览点击本地下载的计量明细数据,选择原始字符集为UTF-8,可以看到数据在数据预览中显示

MaxCompute按量付费业务流程的计量明细统计


二、DataWorks的API的介绍和使用

2.1DataWorks的API的介绍

参考文档,其中有DataWorks的内容介绍以及对应的限制,目前DataWorks的企业版可以使用DataWorks的API功能

https://help.aliyun.com/document_detail/175553.html


对应使用的API为ListNodes

MaxCompute按量付费业务流程的计量明细统计

MaxCompute按量付费业务流程的计量明细统计



2.2创建MaxCompute表,以便将DataWorks查询的数据插入到MaxCompute表中,并在DataWorks界面执行

create TABLE IF NOT EXISTS nodeItem(
nodeId  BIGINT  COMMENT '节点ID',
nodeName String COMMENT '节点名称',
cronExpress String COMMENT 'cron表达式',
schedulerType String COMMENT '调度类型',
programType String COMMENT '节点类型',
ownerId String  COMMENT '负责人ID',
projectId BIGINT  COMMENT  '工作空间ID',
repeatability Boolean COMMENT '是否可以重复运行',
paramValues String COMMENT  '额外的参数',
description String COMMENT '节点描述信息',
resGroupName String COMMENT '资源组名称'
);


2.3编写对应逻辑的执行代码

其中参考的MaxCompute的SDK文档为https://help.aliyun.com/document_detail/27844.html

其中如何获取项目空间的projectID:

进入DataWorks的控制台,点击工作空间配置

MaxCompute按量付费业务流程的计量明细统计

点击更多设置

MaxCompute按量付费业务流程的计量明细统计

可以查看到左上角工作空间的ID

MaxCompute按量付费业务流程的计量明细统计


代码逻辑

package com.git.cost;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dataworks_public.model.v20200518.ListNodesRequest;
import com.aliyuncs.dataworks_public.model.v20200518.ListNodesResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.Date;
import com.aliyun.odps.Column;
import com.aliyun.odps.Odps;
import com.aliyun.odps.PartitionSpec;
import com.aliyun.odps.TableSchema;
import com.aliyun.odps.account.Account;
import com.aliyun.odps.account.AliyunAccount;
import com.aliyun.odps.data.Record;
import com.aliyun.odps.data.RecordWriter;
import com.aliyun.odps.tunnel.TableTunnel;
import com.aliyun.odps.tunnel.TunnelException;
import com.aliyun.odps.tunnel.TableTunnel.UploadSession;

import java.util.List;
import java.util.Map;

public class GetOrderDetail {
    private static String accessId = "";
    private static String accessKey = "";
    private static String odpsUrl = "http://service.odps.aliyun.com/api";
    private static String tunnelUrl = "http://dt.cn-shanghai.maxcompute.aliyun.com";
    //默认情况下,使用公网进行传输。如果需要通过内网进行数据传输,必须设置tunnelUrl变量。
    //此处取值为华东2经典网络Tunnel Endpoint。
    private static String project = "";
    private static String table = "nodeItem";
    private static List<ListNodesResponse.Data.NodesItem> dataList;
    public static void main(String[] args) {

        DefaultProfile profile = DefaultProfile.getProfile(
                "cn-shanghai",
                "",// 您的AccessKeyID。
                "");// 您的AccessKeySecret。
        IAcsClient client = new DefaultAcsClient(profile);

/*获取指定业务流程的节点*/

        ListNodesRequest requestListNode = new ListNodesRequest();
        requestListNode.setRegionId("cn-shanghai");
        //project的ID
        requestListNode.setProjectId();   
        requestListNode.setProjectEnv("PROD");
        //业务流程的名称
        requestListNode.setBizName("workshop_git");

        try {
            ListNodesResponse response = client.getAcsResponse(requestListNode);
            dataList = response.getData().getNodes();
            System.out.println(new Gson().toJson(dataList));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }



        // 该部分为准备工作,仅需执行一次。
        Account account = new AliyunAccount(accessId, accessKey);
        Odps odps = new Odps(account);
        odps.setEndpoint(odpsUrl);
        odps.setDefaultProject(project);
        try {
            TableTunnel tunnel = new TableTunnel(odps);
            tunnel.setEndpoint(tunnelUrl);
            UploadSession uploadSession = tunnel.createUploadSession(project, table);
            System.out.println("Session Status is : " + uploadSession.getStatus().toString());
            TableSchema schema = uploadSession.getSchema();
            RecordWriter recordWriter = uploadSession.openRecordWriter(0);
            Record record = uploadSession.newRecord();

            for (int i = 0; i < dataList.size(); i++) {
                System.out.println(i);
                record.set("nodeId".toLowerCase(),dataList.get(i).getNodeId());
                record.set("nodeName".toLowerCase(),dataList.get(i).getNodeName());
                record.set("cronExpress".toLowerCase(),dataList.get(i).getCronExpress());
                record.set("schedulerType".toLowerCase(),dataList.get(i).getSchedulerType());
                record.set("programType".toLowerCase(),dataList.get(i).getProgramType());
                record.set("ownerId".toLowerCase(),dataList.get(i).getOwnerId());
                record.set("projectId".toLowerCase(),dataList.get(i).getProjectId());
                record.set("repeatability".toLowerCase(),dataList.get(i).getRepeatability());
                record.set("paramValues".toLowerCase(),dataList.get(i).getParamValues());
                record.set("description".toLowerCase(),dataList.get(i).getDescription());
                record.set("resGroupName".toLowerCase(),dataList.get(i).getResGroupName());
                recordWriter.write(record);
            }
            recordWriter.close();
            uploadSession.commit(new Long[]{0L});
            System.out.println("upload success!");
        } catch (TunnelException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

2.4进入DataWorks界面可以查看到数据以及写入到MaxCompute的表中

MaxCompute按量付费业务流程的计量明细统计

三、在DataWorks通过SQL任务计算得出整个业务流程的消费情况


3.1统计整个业务流程的消费情况

各个类型任务的计费方法:

https://help.aliyun.com/document_detail/112752.html


应为本次使用的业务流程为3个SQL任务,是使用标准版的MaxCompute的SQL作业,因此选择的计费公式如下


MaxCompute按量付费业务流程的计量明细统计


执行统计的SQL语句

SELECT  sum(
            CAST(ComputationSqlInput AS DOUBLE)/1024/1024/1024*ComputationSqlComplexity*0.3
        ) AS sumcost
FROM    odpsfee
WHERE   projectid = 'maxcompute_git'
AND     starttime > '2020-11-30'
AND     TYPE != 'Storage'
AND     dataworksid IN(SELECT nodeid FROM nodeItem)
;

在DataWorks执行得出最后的结果

MaxCompute按量付费业务流程的计量明细统计

总结:

本文使用的方案,在其中使用的时候要注意几点:

1.如果在使用企业版DataWorks的API测试时,出现权限错误,需要提工单开通DataWorks的API功能。

2.在使用时要注意计算的类型以及计算方式,将本文的实践代码略作修改,另外统计时也要关注各个字段的单位,以及数据类型方便最后的统计计算。

3.要仔细查看对应的文档介绍,熟悉其使用方法以及对应的参数设置。

欢迎加入“MaxCompute开发者社区2群”,点击链接申请加入或扫描二维码

https://h5.dingtalk.com/invite-page/index.html?bizSource=____source____&corpId=dingb682fb31ec15e09f35c2f4657eb6378f&inviterUid=E3F28CD2308408A8&encodeDeptId=0054DC2B53AFE745

MaxCompute按量付费业务流程的计量明细统计

上一篇:【Elastic Engineering】Elasticsearch:定制分词器(analyzer)及相关性


下一篇:Mybatis通用mapper