MaxCompute按量付费业务流程的计量明细统计-阿里云开发者社区

开发者社区> 阿里巴巴大数据计算> 正文
登录阅读全文

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

简介: 本文针对一个公司有多个部门,一个部门又含有多条业务,另外业务流程中可能包含MapReduce、Spark、SQL,但是如何统计其中一条的业务流程的计费信息。针对这一需求,本文采用的方案是:通过计量计费中获取当前所有project的在某一天的计费信息->采用DataWorks的API获取该project的业务流程下的所有nodeID->通过MaxCompute的SDK将数据写入到MaxCompute表中->最后使用SQL统计出一条业务流程的总的计费统计情况。

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

1.1导出用量明细数据

用量明细的参考文档

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


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

image.png

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

image.png

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

image.png


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创建表

image.png

查看MaxCompute表是否创建成功

image.png

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

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

image.png

选择创建的表odpsFree

image.png

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

image.png


二、DataWorks的API的介绍和使用

2.1DataWorks的API的介绍

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

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


对应使用的API为ListNodes

image.png

image.png



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的控制台,点击工作空间配置

image.png

点击更多设置

image.png

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

image.png


代码逻辑

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的表中

image.png

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


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

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

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


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


image.png


执行统计的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执行得出最后的结果

image.png

总结:

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

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

image.png

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
阿里巴巴大数据计算
使用钉钉扫一扫加入圈子
+ 订阅

阿里大数据官方技术圈

官方博客
链接