日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/8/23 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在DataWorks标准模式下统计个人账号使用资源情况 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景
在使用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标准模式下统计个人账号使用资源情况的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。