背景
在使用MaxCompute的时候通常情况下,用户会通过Information Schema的task_history视图表来分析具体某个账号执行的SQL任务情况,来做到SQL成本分摊或SQL的时间成本优化。但大多数用户通过DataWorks标准模式下使用MaxCompute,这样在MaxCompute提供的元数据视图信息中将记录所有的生产作业执行账号为同一个主账号,只有小部分的开发作业执行账号为个人RAM子账号。本文主要介绍如何在DataWorks标准模式下统计个人账号使用资源情况。

如上图所示,这样大多数成本都无法升级到具体RAM账号上,进而做不到成本审计和分摊。
解决方案
在使用DataWorks开发MaxCompute作业时,每个节点都有一个责任人,默认为当前开发者即当前RAM子账号。如果能够获取到这个信息与Information Schema匹配即可。
获取节点责任人ID
在DataWorks页面中,一个节点的责任人如下示意图:

以一个真实的生产环境执行的作业logview为例,如下:

其中"SKYNET_ONDUTY":"219292777233523137"即为我们要获取的值。SKYNET_ONDUTY表示该节点的责任人,后面的value为该节点责任人(云账号&子账号)的ID。或者我们可以通过Information Schema的task_history表去解析获取到该ID。该值被记录在Information Schema的task_history表的settings字段里,需要进行一次解析。解析得到的账号ID就是该节点责任人(云账号&子账号)的ID。

--示例代码:
SELECT  inst_id,settings,
REGEXP_EXTRACT(settings,'"SKYNET_ONDUTY":"(.*?)"',1) AS SKYNET_ONDUTY
FROM information_schema.tasks_history
WHERE ds = 20200402 and inst_id='20200402064857130g8zorjim';

获取RAM子账号
通过上述步骤只能获取一个ID,还需要通过RAM API 来获取ID对应的子账号或云账号是哪一个。

{"requestId":"1CFF97CC-DD17-4C69-9AC7-7E869B8857AC","isTruncated":false,"users":[{"userId":"219292777233523137","userName":"mc_oss","displayName":"mc_oss","comments":"","createDate":"2019-12-25T00:25:23Z","updateDate":"2020-02-24T03:44:04Z"},{"userId":"218915375439469278","userName":"bigdata_wei","displayName":"bigdata_wei","comments":"","createDate":"2019-12-04T06:04:29Z","updateDate":"2020-02-21T01:43:37Z"}]
}

这里需要我们自己将结果抓取下来存储并解析出UserName和UserId,UserId即为节点责任人ID。
API实现代码逻辑参考如下
(1)创建一张表用来存储获取到的UserName和UserID

create table users_list(UserName string,UserId string
);

(2)ListUsers.java


import Utils.Configurations;
import Utils.ODPS;
import com.aliyun.odps.Odps;
import com.aliyun.odps.Table;
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.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.ram.model.v20150501.ListUsersRequest;
import com.aliyuncs.ram.model.v20150501.ListUsersResponse;import java.io.IOException;
import java.util.List;
import java.util.Properties;public class ListUsers {public static void main(String[] args) {Properties properties = Configurations.properties();String ai = properties.getProperty("access_id");String ak = properties.getProperty("access_key");String project = properties.getProperty("project_name");DefaultProfile profile = DefaultProfile.getProfile("cn-beijing", ai, ak);IAcsClient client = new DefaultAcsClient(profile);ListUsersRequest request = new ListUsersRequest();request.setRegionId("cn-beijing");try {ListUsersResponse response = client.getAcsResponse(request);List<ListUsersResponse.User> users = response.getUsers();//打开表Odps odps = ODPS.newOdps(ai, ak, project);Table table = odps.tables().get("users_list");TableTunnel.UploadSession uploadSession = new TableTunnel(odps).createUploadSession(project, table.getName());//遍历写到表中RecordWriter writer = uploadSession.openBufferedWriter();for (ListUsersResponse.User user : users) {Record record = uploadSession.newRecord();record.setString("username", user.getUserName());record.setString("userid", user.getUserId());System.out.println("写入数据" + user.getUserId() + ":" + user.getUserName());writer.write(record);}writer.close();uploadSession.commit();System.out.println("写入完成...");} 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());} catch (TunnelException e) {System.out.println("创建table上传session失败");System.out.println(e.getMessage());} catch (IOException e) {System.out.println("写数据到表失败");System.out.println(e.getMessage());}}
}

(3)在src下创建一个Utils目录,放以下文件Configurations.java、ODPS.java。

 a、Configurations.javapackage Utils;import java.io.IOException;import java.io.InputStream;import java.util.Properties;import java.util.ResourceBundle;public class Configurations {* 获取配置文件信息** @return*/public static Properties properties() {Properties properties = new Properties();// 使用ClassLoader加载properties配置文件生成对应的输入流InputStream in = Configurations.class.getClassLoader().getResourceAsStream("common.properties");// 使用properties对象加载输入流try {properties.load(in);return properties;} catch (IOException e) {System.out.println("配置文件读取有误" + e.getMessage());}return null;}/*** 读取配置文件** @return*/public static ResourceBundle read() {//config为属性文件名,放在包com.test.config下,如果是放在src下,直接用config即可ResourceBundle resourceBundle = ResourceBundle.getBundle("common");return resourceBundle;}
}
b、ODPS.java
package Utils;
import com.aliyun.odps.Odps;
import com.aliyun.odps.account.Account;
import com.aliyun.odps.account.AliyunAccount;public class ODPS {/*** 在外网中使用,获取odps的连接对象** @param ai* @param ak* @param project* @return*/static public Odps newOdps(String ai, String ak, String project) {Account account = new AliyunAccount(ai, ak);Odps odps = new Odps(account);odps.setDefaultProject(project);return odps;}/*** 在内网中使用,获取odps的连接对象** @param ai* @param ak* @param project* @param odpsUrl* @return*/static public Odps newOdps(String ai, String ak, String project, String odpsUrl) {Account account = new AliyunAccount(ai, ak);Odps odps = new Odps(account);odps.setEndpoint(odpsUrl);odps.setDefaultProject(project);return odps;}
}

(4)common.properties放resource路径

# 主账号:
project_name=
access_id=
access_key=

通过“获取节点责任ID”和“获取RAM子账号”步骤后,基础信息已经可以拿到,还需要进行一次join拿到instanceid对应的具体云账号or子账号

--示例代码:
select  a.UserName,b.SKYNET_ONDUTY
from    users_list a
join (SELECT inst_id,settings,REGEXP_EXTRACT(settings,'"SKYNET_ONDUTY":"(.*?)"',1) AS SKYNET_ONDUTYFROM   information_schema.tasks_historyWHERE  ds = 20200402 and inst_id='20200402064857130g8zorjim'
)b
on a.UserId = b.SKYNET_ONDUTY
;

⚠️:此处任务执行日期ds和inst_id需要根据自己的任务做相应的替换。
计算成本分摊/审计需求
1、MaxCompute提供了开放元数据的Information_Schema服务,通过元数据服务Information_Schema里面的作业历史表tasks_history,可以查询到准实时的项目作业历史明细。包括:项目名称、任务名称、Instance id、开始时间、结束时间、任务复杂度、任务CPU使用情况等字段。
2、用户可以通过费用中心账号总览消费记录去查询具体的消费情况。
同时,阿里云交易和账单管理OpenAPI为用户提供管理阿里云产品售卖和财资能力,通过该API可以程序化获取MaxCompute作业计费明细数据。
调用QueryUserOmsData接口(阿里云的账单系统OMS),可以查询到具体计量信息编号、数据分类、存储、SQL读取量、公网上下行流量等字段信息。
通过Information_Schema.tasks_history和账单系统进一步统计计算成本分摊/审计需求。
欢迎加入“MaxCompute开发者社区2群”,[MaxCompute开发者社区2群]

(https://yq.aliyun.com/go/articleRenderRedirect?spm=a2c4e.11153940.0.0.47d43dcaeTan9O&url=https%3A%2F%2Fh5.dingtalk.com%2Finvite-page%2Findex.html%3FbizSource%3D____source____%26amp%3BcorpId%3Ddingb682fb31ec15e09f35c2f4657eb6378f%26amp%3BinviterUid%3DE3F28CD2308408A8%26amp%3BencodeDeptId%3D0054DC2B53AFE745)申请加入或扫描以下二维码加入。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

在DataWorks标准模式下统计个人账号使用资源情况相关推荐

  1. VIM - 01. 标准模式 - 下简单操作

    1. 概述 标准模式下, 简单操作 移动 删除 复制粘贴 收益 熟练后, 编辑文本基本不需要鼠标操作了 思路 只讲最基本的, 避免初学时的混淆 把基本操作归类了, 方便理解 2. 准备 一篇篇幅较长的 ...

  2. u盘装机,UEFI模式下无法识别u盘的情况解决

    自己的电脑是acer暗影骑士3,win10系统,想用u盘装ubuntu,如图所示,Secure Boot已设为disabled,u盘启动项第一,保存退出,但重启电脑仍然自动进入win10系统,根本识别 ...

  3. html标准模式与混杂模式,关于Doctype、严格模式与混杂模式

    &lt现行程项些或创容的近在绑思目都者于手内近;!Doctype> 文档声明,位于文档中的最前面的位置,处于标签之前.此标签告知浏览器文档使用哪种HTML或XHTML朋说事础发开和数目间 ...

  4. 让你的网站在IE8的兼容模式下运行

    众所周知,微软的Internet Explorer团队一直在致力于将IE8打造为最符合业内标准的浏览器,所不幸的是,当前并非所有的网站都认同这些标准.如果你担心你的网站在IE8的标准模式下不能正常工作 ...

  5. “约见”面试官系列之常见面试题之第五十二篇之标准模式和怪异模式(建议收藏)

    在标准模式页面按照HTML,CSS的定义渲染,而在怪异模式就是浏览器为了兼容很早之前针对旧版本浏览器设计,并未严格遵循W3C标准而产生的一种页面渲染模式.浏览器基于页面中文件类型描述的存在以决定采用哪 ...

  6. 浏览器标准模式和怪异模式

    什么是标准模式和怪异模式? 在实现html和css标准化之前,各个浏览器对html和css的解析各有不同,甚至是同一个浏览器的不同版本渲染方式也不同(比如IE6和IE7).在W3C制定标准之后,浏览器 ...

  7. 标准模式和怪异模式指的是什么?

    标准模式(也称为"严格模式")是浏览器按照HTML和CSS规范的标准方式解析和呈现网页的模式.在标准模式下,浏览器会更严格地遵守标准,确保网页在不同浏览器中的显示效果更为一致. 怪 ...

  8. 严格模式和标准模式的区别(附严格模式实战实例)

    严格模式是一种许可式(opt-in)机制,允许开发人员使用 JavaScript 语言的一个有限但更整洁的子集. 严格模式可以在脚本或函数级别实现. "严格模式"体现了Javasc ...

  9. 文档模式:标准模式、混杂模式

    一. 背景:  由于历史的原因,不同浏览器对页面的渲染是不同的,甚至同一浏览器的不同版本也是不同的.然后这时候就出现了一个至关重要的标准规范:W3C标准. 在W3C标准出台之前,不同的浏览器在页面的渲 ...

最新文章

  1. ORACLE11g 没有控制文件如何通过rman备份恢复数据的详细实战过程
  2. canoe开发从入门到精通pdf_阿里技术官手写801页PDF《精通Java Web整合开发》
  3. 学习JS基本数据类型与对象的valueOf方法
  4. 基于mxnet的Regression问题Kaggle比赛代码框架
  5. 玩转keybd_event
  6. linux命令zip打包,linux下zip命令打包与解包
  7. AVR Studio 5 使用初体验及完整版下载地址
  8. 【Vue2.0】—常用的内置指令(九)
  9. Django(二):安装django、创建项目及目录结构说明、在pycharm中搭建
  10. ACT开发初步(二)——XML
  11. Visual studio插件:Visual Svn 替代工具--AnkhSvn
  12. python复数类型的虚部通过_Python 复数数据类型详解(complex)[学习 Python 必备基础知识][看此一篇就够了...
  13. 智齿客服签约垂直日本的最大旅游服务平台仙贝旅行
  14. 小红书种草模式有哪些?如何保证种草效果
  15. 【特征工程】Chap3 Text Data: Flatten, Filtering, Chunking
  16. Python渗透测试之Scapy模块情报收集
  17. 简单的NovelAI绘画方法
  18. 关于数据菜单如何从后端获取数据
  19. Tomcat介绍及配置
  20. Java中HashMap常见问题 -- 扩容、树化、死链问题

热门文章

  1. ups计算软件_浅析UPS与蓄电池与逆变器的区别
  2. 听说java又过气了?看我运用大数据分析2019年java发展趋势!
  3. python 怎么判断字符串是否有换行_JAVA中如何判断一个字符串是否换行
  4. 搭建微信令牌中控服务器,使用ThinkJs搭建微信中控服务的实现方法
  5. leetcode 107 --- 二叉树程序遍历 ii
  6. html未点击背景 点击背景,在AngularJs中点击状态如何改变背景色
  7. html css position,[CSS]CSS Position 详解
  8. long转string mybatis_Spring+Mybatis类型转换的问题,oracle数据库中有一个clob类型,怎样在查询以后转换为String类型?...
  9. oracle实验六杨艳华_oracle实验报告总结
  10. 建立学生选课表 mysql 语句_学生选课数据库SQL语句45道练习题整理及mysql常用函数(20161019)...