在DataWorks标准模式下统计个人账号使用资源情况
背景
在使用MaxCompute的時(shí)候通常情況下,用戶會(huì)通過Information Schema的task_history視圖表來(lái)分析具體某個(gè)賬號(hào)執(zhí)行的SQL任務(wù)情況,來(lái)做到SQL成本分?jǐn)偦騍QL的時(shí)間成本優(yōu)化。但大多數(shù)用戶通過DataWorks標(biāo)準(zhǔn)模式下使用MaxCompute,這樣在MaxCompute提供的元數(shù)據(jù)視圖信息中將記錄所有的生產(chǎn)作業(yè)執(zhí)行賬號(hào)為同一個(gè)主賬號(hào),只有小部分的開發(fā)作業(yè)執(zhí)行賬號(hào)為個(gè)人RAM子賬號(hào)。本文主要介紹如何在DataWorks標(biāo)準(zhǔn)模式下統(tǒng)計(jì)個(gè)人賬號(hào)使用資源情況。
如上圖所示,這樣大多數(shù)成本都無(wú)法升級(jí)到具體RAM賬號(hào)上,進(jìn)而做不到成本審計(jì)和分?jǐn)偂?br />解決方案
在使用DataWorks開發(fā)MaxCompute作業(yè)時(shí),每個(gè)節(jié)點(diǎn)都有一個(gè)責(zé)任人,默認(rèn)為當(dāng)前開發(fā)者即當(dāng)前RAM子賬號(hào)。如果能夠獲取到這個(gè)信息與Information Schema匹配即可。
獲取節(jié)點(diǎn)責(zé)任人ID
在DataWorks頁(yè)面中,一個(gè)節(jié)點(diǎn)的責(zé)任人如下示意圖:
以一個(gè)真實(shí)的生產(chǎn)環(huán)境執(zhí)行的作業(yè)logview為例,如下:
其中"SKYNET_ONDUTY":"219292777233523137"即為我們要獲取的值。SKYNET_ONDUTY表示該節(jié)點(diǎn)的責(zé)任人,后面的value為該節(jié)點(diǎn)責(zé)任人(云賬號(hào)&子賬號(hào))的ID?;蛘呶覀兛梢酝ㄟ^Information Schema的task_history表去解析獲取到該ID。該值被記錄在Information Schema的task_history表的settings字段里,需要進(jìn)行一次解析。解析得到的賬號(hào)ID就是該節(jié)點(diǎn)責(zé)任人(云賬號(hào)&子賬號(hào))的ID。
獲取RAM子賬號(hào)
通過上述步驟只能獲取一個(gè)ID,還需要通過RAM?API?來(lái)獲取ID對(duì)應(yīng)的子賬號(hào)或云賬號(hào)是哪一個(gè)。
這里需要我們自己將結(jié)果抓取下來(lái)存儲(chǔ)并解析出UserName和UserId,UserId即為節(jié)點(diǎn)責(zé)任人ID。
API實(shí)現(xiàn)代碼邏輯參考如下
(1)創(chuàng)建一張表用來(lái)存儲(chǔ)獲取到的UserName和UserID
(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("寫入數(shù)據(jù)" + 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("創(chuàng)建table上傳session失敗");System.out.println(e.getMessage());} catch (IOException e) {System.out.println("寫數(shù)據(jù)到表失敗");System.out.println(e.getMessage());}} }(3)在src下創(chuàng)建一個(gè)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配置文件生成對(duì)應(yīng)的輸入流InputStream in = Configurations.class.getClassLoader().getResourceAsStream("common.properties");// 使用properties對(duì)象加載輸入流try {properties.load(in);return properties;} catch (IOException e) {System.out.println("配置文件讀取有誤" + e.getMessage());}return null;}/*** 讀取配置文件** @return*/public static ResourceBundle read() {//config為屬性文件名,放在包c(diǎn)om.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 {/*** 在外網(wǎng)中使用,獲取odps的連接對(duì)象** @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;}/*** 在內(nèi)網(wǎng)中使用,獲取odps的連接對(duì)象** @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路徑
# 主賬號(hào): project_name= access_id= access_key=通過“獲取節(jié)點(diǎn)責(zé)任ID”和“獲取RAM子賬號(hào)”步驟后,基礎(chǔ)信息已經(jīng)可以拿到,還需要進(jìn)行一次join拿到instanceid對(duì)應(yīng)的具體云賬號(hào)or子賬號(hào)
??:此處任務(wù)執(zhí)行日期ds和inst_id需要根據(jù)自己的任務(wù)做相應(yīng)的替換。
計(jì)算成本分?jǐn)?審計(jì)需求
1、MaxCompute提供了開放元數(shù)據(jù)的Information_Schema服務(wù),通過元數(shù)據(jù)服務(wù)Information_Schema里面的作業(yè)歷史表tasks_history,可以查詢到準(zhǔn)實(shí)時(shí)的項(xiàng)目作業(yè)歷史明細(xì)。包括:項(xiàng)目名稱、任務(wù)名稱、Instance id、開始時(shí)間、結(jié)束時(shí)間、任務(wù)復(fù)雜度、任務(wù)CPU使用情況等字段。
2、用戶可以通過費(fèi)用中心?賬號(hào)總覽?消費(fèi)記錄去查詢具體的消費(fèi)情況。
同時(shí),阿里云交易和賬單管理OpenAPI為用戶提供管理阿里云產(chǎn)品售賣和財(cái)資能力,通過該API可以程序化獲取MaxCompute作業(yè)計(jì)費(fèi)明細(xì)數(shù)據(jù)。
調(diào)用QueryUserOmsData接口(阿里云的賬單系統(tǒng)OMS),可以查詢到具體計(jì)量信息編號(hào)、數(shù)據(jù)分類、存儲(chǔ)、SQL讀取量、公網(wǎng)上下行流量等字段信息。
通過Information_Schema.tasks_history和賬單系統(tǒng)進(jìn)一步統(tǒng)計(jì)計(jì)算成本分?jǐn)?審計(jì)需求。
歡迎加入“MaxCompute開發(fā)者社區(qū)2群”,[MaxCompute開發(fā)者社區(qū)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)申請(qǐng)加入或掃描以下二維碼加入。
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的在DataWorks标准模式下统计个人账号使用资源情况的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快速入门ECS快照功能,助力大数据容灾保
- 下一篇: 【智能AI】准确率97%的开源肺炎检测模