一、计量明细的介绍和使用
1.1导出用量明细数据
用量明细的参考文档
https://help.aliyun.com/document_detail/53057.html
费用账单>用量明细 可以看到费用明细下的用量明细,在右侧选择大数据计算服务MaxCompute(按量付费),并选择所有统计的时间段,以及计费粒度,填写验证码,选择导出CSV。
可以看到界面的正处于导出状态,稍等片刻,可以看到导出成功的状态,点击下载功能
经过筛选后可以看到使用的业务流程主要为3个SQL任务
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表是否创建成功
1.3将下载的计量明细数据到入到MaxCompute表中
在业务流程中中,鼠标指向表,并点击右键,选择导入数据
选择创建的表odpsFree
选择浏览点击本地下载的计量明细数据,选择原始字符集为UTF-8,可以看到数据在数据预览中显示
二、DataWorks的API的介绍和使用
2.1DataWorks的API的介绍
参考文档,其中有DataWorks的内容介绍以及对应的限制,目前DataWorks的企业版可以使用DataWorks的API功能
https://help.aliyun.com/document_detail/175553.html
对应使用的API为ListNodes
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的控制台,点击工作空间配置
点击更多设置
可以查看到左上角工作空间的ID
代码逻辑
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的表中
三、在DataWorks通过SQL任务计算得出整个业务流程的消费情况
3.1统计整个业务流程的消费情况
各个类型任务的计费方法:
https://help.aliyun.com/document_detail/112752.html
应为本次使用的业务流程为3个SQL任务,是使用标准版的MaxCompute的SQL作业,因此选择的计费公式如下
执行统计的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执行得出最后的结果
总结:
本文使用的方案,在其中使用的时候要注意几点:
1.如果在使用企业版DataWorks的API测试时,出现权限错误,需要提工单开通DataWorks的API功能。
2.在使用时要注意计算的类型以及计算方式,将本文的实践代码略作修改,另外统计时也要关注各个字段的单位,以及数据类型方便最后的统计计算。
3.要仔细查看对应的文档介绍,熟悉其使用方法以及对应的参数设置。
欢迎加入“MaxCompute开发者社区2群”,点击链接申请加入或扫描二维码