統(tǒng)計(jì)MaxCompute TOPN費(fèi)用賬號(hào)及耗時(shí)作業(yè)
數(shù)據(jù)開(kāi)發(fā)者在使用MaxCompute開(kāi)發(fā)過(guò)程中,需要統(tǒng)計(jì)MaxCompute項(xiàng)目中賬號(hào)的費(fèi)用以及作業(yè)的耗時(shí)情況,助力合理規(guī)劃和調(diào)整作業(yè)。本文為您介紹如何通過(guò)MaxCompute元數(shù)據(jù)(Information Schema)統(tǒng)計(jì)TOP費(fèi)用賬號(hào)及耗時(shí)作業(yè),同時(shí)通過(guò)釘釘推送到客戶群。
背景信息
通常,數(shù)據(jù)開(kāi)發(fā)者會(huì)通過(guò)DataWorks標(biāo)準(zhǔn)模式使用MaxCompute,MaxCompute會(huì)在Information Schema中記錄所有作業(yè)的執(zhí)行賬號(hào)為同一個(gè)主賬號(hào),只有小部分的作業(yè)執(zhí)行賬號(hào)為RAM用戶。此時(shí)數(shù)據(jù)開(kāi)發(fā)者會(huì)關(guān)注如何統(tǒng)計(jì)各個(gè)賬號(hào)的費(fèi)用和耗時(shí)作業(yè)。MaxCompute提供如下方案解決這兩個(gè)問(wèn)題:
賬號(hào)費(fèi)用:您可以通過(guò)賬單詳情中的用量明細(xì)來(lái)查詢,但是這種方式無(wú)法將用量明細(xì)歸屬到對(duì)應(yīng)的RAM用戶。Information Schema視圖中的TASKS_HISTORY會(huì)記錄MaxCompute項(xiàng)目?jī)?nèi)已完成的作業(yè)詳情,且保留近14天數(shù)據(jù)。您可以將TASKS_HISTORY中的數(shù)據(jù)備份到指定MaxCompute項(xiàng)目中,基于該數(shù)據(jù)統(tǒng)計(jì)TOP費(fèi)用賬號(hào)。
耗時(shí)作業(yè):您可以通過(guò)TASKS_HISTORY中的數(shù)據(jù)統(tǒng)計(jì)TOP耗時(shí)作業(yè)。
更多關(guān)于Information Schema的功能及使用限制,請(qǐng)參見(jiàn)項(xiàng)目級(jí)別Information Schema(即將下線)。
統(tǒng)計(jì)MaxCompute TOPN費(fèi)用賬號(hào)及耗時(shí)作業(yè)的流程如下:
步驟一:獲取Information Schema服務(wù)
自2024年03月01日開(kāi)始,MaxCompute停止對(duì)新增項(xiàng)目自動(dòng)安裝項(xiàng)目級(jí)別Information Schema,即新增的項(xiàng)目默認(rèn)沒(méi)有項(xiàng)目級(jí)別Information Schema的Package。若您有查元數(shù)據(jù)的業(yè)務(wù),您可以查詢租戶級(jí)別的Information Schema,以便獲取更全的信息。租戶級(jí)別Information Schema的具體使用說(shuō)明請(qǐng)參見(jiàn)租戶級(jí)別Information Schema。
對(duì)于存量MaxCompute項(xiàng)目,在您開(kāi)始使用Information Schema服務(wù)前,需要以項(xiàng)目所有者(Project Owner)或具備Super_Administrator管理角色的RAM用戶身份安裝Information Schema權(quán)限包,獲得訪問(wèn)項(xiàng)目元數(shù)據(jù)的權(quán)限。更多為用戶授權(quán)管理角色操作信息,請(qǐng)參見(jiàn)將角色賦予用戶。安裝方式有如下兩種:
登錄MaxCompute客戶端,執(zhí)行如下命令:
install package Information_Schema.systables;
登錄DataWorks控制臺(tái),進(jìn)入臨時(shí)查詢界面。更多臨時(shí)查詢操作詳情,請(qǐng)參見(jiàn)使用臨時(shí)查詢運(yùn)行SQL語(yǔ)句(可選)。執(zhí)行如下命令:
install package Information_Schema.systables;
執(zhí)行示例如下。
如果統(tǒng)計(jì)多個(gè)MaxCompute項(xiàng)目的元數(shù)據(jù),您需要分別對(duì)各個(gè)MaxCompute項(xiàng)目安裝Information Schema權(quán)限包。然后把各個(gè)MaxCompute項(xiàng)目的元數(shù)據(jù)的備份數(shù)據(jù)插入到同一個(gè)表中做集中統(tǒng)計(jì)分析。
(可選)步驟二:對(duì)除Project Owner外的用戶授權(quán)
Information Schema的視圖包含了項(xiàng)目級(jí)別的所有用戶數(shù)據(jù),默認(rèn)項(xiàng)目所有者可以查看。如果項(xiàng)目?jī)?nèi)其他用戶或角色需要查看,需要進(jìn)行授權(quán),請(qǐng)參見(jiàn)基于Package跨項(xiàng)目訪問(wèn)資源。
授權(quán)語(yǔ)法如下。
grant <actions> on package Information_Schema.systables to user <user_name>;
grant <actions> on package Information_Schema.systables to role <role_name>;
actions:待授予的操作權(quán)限,取值為Read。
user_name:已添加至項(xiàng)目中的阿里云賬號(hào)或RAM用戶。
您可以通過(guò)MaxCompute客戶端執(zhí)行
list users;
命令獲取用戶賬號(hào)。role_name:已添加至項(xiàng)目中的角色。
您可以通過(guò)MaxCompute客戶端執(zhí)行
list roles;
命令獲取角色名稱。
授權(quán)示例如下。
grant read on package Information_Schema.systables to user RAM$Bob@aliyun.com:user01;
步驟三:下載并備份元數(shù)據(jù)
在MaxCompute項(xiàng)目上創(chuàng)建元數(shù)據(jù)備份表,并定時(shí)將元數(shù)據(jù)寫入備份表中。以MaxCompute客戶端為例,操作流程如下:
登錄MaxCompute客戶端,執(zhí)行如下命令創(chuàng)建元數(shù)據(jù)備份表。
--project_name為MaxCompute項(xiàng)目名稱。 create table if not exists <project_name>.information_history ( task_catalog STRING ,task_schema STRING ,task_name STRING ,task_type STRING ,inst_id STRING ,`status` STRING ,owner_id STRING ,owner_name STRING ,result STRING ,start_time DATETIME ,end_time DATETIME ,input_records BIGINT ,output_records BIGINT ,input_bytes BIGINT ,output_bytes BIGINT ,input_tables STRING ,output_tables STRING ,operation_text STRING ,signature STRING ,complexity DOUBLE ,cost_cpu DOUBLE ,cost_mem DOUBLE ,settings STRING ,ds STRING );
進(jìn)入DataWorks數(shù)據(jù)開(kāi)發(fā)界面,創(chuàng)建ODPS SQL節(jié)點(diǎn)(information_history)并配置定時(shí)調(diào)度,用于定時(shí)將數(shù)據(jù)寫入備份表information_history。完成后單擊左上角圖標(biāo)保存。
創(chuàng)建ODPS SQL節(jié)點(diǎn)操作,請(qǐng)參見(jiàn)開(kāi)發(fā)ODPS SQL任務(wù)。
ODPS SQL節(jié)點(diǎn)運(yùn)行的命令示例如下:
--project_name為MaxCompute項(xiàng)目名稱。 use <project_name>; insert into table <project_name>.information_history select * from information_schema.tasks_history where ds ='datetime1';
${datetime1}
為DataWorks的調(diào)度參數(shù),您需要在ODPS SQL節(jié)點(diǎn)右側(cè),單擊調(diào)度配置,在基礎(chǔ)屬性區(qū)域配置參數(shù)值為datetime1=${yyyymmdd}
。說(shuō)明如果需要同時(shí)對(duì)多個(gè)MaxCompute項(xiàng)目的元數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析,您可以創(chuàng)建多個(gè)ODPS SQL節(jié)點(diǎn),將這些MaxCompute項(xiàng)目的元數(shù)據(jù)寫入到同一張數(shù)據(jù)備份表中。
步驟四:創(chuàng)建統(tǒng)計(jì)TOPN費(fèi)用賬號(hào)及耗時(shí)作業(yè)
TASKS_HISTORY視圖中的settings會(huì)記錄上層調(diào)度或用戶傳入的信息,以JSON格式存儲(chǔ)。包含的具體信息有:useragent、bizid、skynet_id和skynet_nodename。您可以通過(guò)settings字段定位到創(chuàng)建作業(yè)的RAM用戶信息。因此您可以基于備份數(shù)據(jù)表計(jì)算TOPN費(fèi)用賬號(hào)及耗時(shí)作業(yè)。操作流程如下:
登錄MaxCompute客戶端,創(chuàng)建一張RAM用戶明細(xì)表user_ram,記錄需要統(tǒng)計(jì)的賬號(hào)及賬號(hào)ID。
命令示例如下:
create table if not exists <project_name>.user_ram ( user_id STRING ,user_name STRING );
創(chuàng)建一張統(tǒng)計(jì)賬號(hào)費(fèi)用的明細(xì)表cost_topn,記錄TOPN費(fèi)用賬號(hào)明細(xì)。
命令示例如下:
create table if not exists <project_name>.cost_topn ( cost_sum DECIMAL(38,5) ,task_owner STRING ) partitioned by ( ds STRING );
建一張統(tǒng)計(jì)耗時(shí)作業(yè)的明細(xì)表time_topn,記錄TOPN耗時(shí)作業(yè)明細(xì)。
命令示例如下:
create table if not exists <project_name>.time_topn ( inst_id STRING ,cost_time BIGINT ,task_owner STRING ) partitioned by ( ds STRING );
進(jìn)入DataWorks數(shù)據(jù)開(kāi)發(fā)界面,創(chuàng)建ODPS SQL節(jié)點(diǎn)(topn)并配置定時(shí)調(diào)度,用于定時(shí)將cost_topn表中統(tǒng)計(jì)的數(shù)據(jù)寫入user_ram表。完成后單擊左上角圖標(biāo)保存。
創(chuàng)建ODPS SQL節(jié)點(diǎn)操作,請(qǐng)參見(jiàn)開(kāi)發(fā)ODPS SQL任務(wù)。
ODPS SQL節(jié)點(diǎn)運(yùn)行的命令示例如下:
--開(kāi)啟2.0數(shù)據(jù)類型開(kāi)關(guān)。2.0數(shù)據(jù)類型詳情,請(qǐng)參見(jiàn)2.0數(shù)據(jù)類型版本。 set odps.sql.decimal.odps2=true; --將元數(shù)據(jù)寫入cost_topn、time_topn表。user_id為賬號(hào)ID。您可以在個(gè)人信息頁(yè)面查看賬號(hào)ID。 insert into table <project_name>.cost_topn partition (ds = '${datetime1}') select nvl(cost_sum,0) cost_sum ,case when a.task_owner='<user_id>' or a.task_owner='<user_id>' or a.task_owner='<user_id>' then b.user_name else a.task_owner end task_owner from ( select inst_id ,owner_name ,task_type ,a.input_bytes ,a.cost_cpu ,a.status ,case when a.task_type = 'SQL' then cast(a.input_bytes/1024/1024/1024 * a.complexity * 0.3 as DECIMAL(18,5) ) when a.task_type = 'SQLRT' then cast(a.input_bytes/1024/1024/1024 * a.complexity * 0.3 as DECIMAL(18,5) ) when a.task_type = 'CUPID' and a.status='Terminated'then cast(a.cost_cpu/100/3600 * 0.66 as DECIMAL(18,5) ) else 0 end cost_sum ,a.settings ,get_json_object(settings, "$.SKYNET_ONDUTY") owner ,case when get_json_object(a.settings, "$.SKYNET_ONDUTY") is null then owner_name else get_json_object(a.settings, "$.SKYNET_ONDUTY") end task_owner from information_history where ds = '${datetime1}' ) a left join <project_name>.user_ram b on a.task_owner = b.user_id; insert into table <project_name>.time_topn partition(ds = '${datetime1}') select inst_id ,cost_time ,case when a.task_owner='<user_id>' or a.task_owner='<user_id>' or a.task_owner='<user_id>' then b.user_name else a.task_owner end task_owner from ( select inst_id ,task_type ,status ,datediff(a.end_time, a.start_time, 'ss') AS cost_time ,case when get_json_object(a.settings, "$.SKYNET_ONDUTY") is null then owner_name else get_json_object(a.settings, "$.SKYNET_ONDUTY") end task_owner from <project_name>.information_history a where ds = '${datetime1}' ) a left join <project_name>.user_ram b on a.task_owner = b.user_id ;
說(shuō)明示例中的
task_type = 'SQL'
表示SQL作業(yè),task_type = 'SQLRT'
表示查詢加速作業(yè),task_type = 'CUPID'
表示Spark作業(yè)。如果需要統(tǒng)計(jì)其他計(jì)費(fèi)作業(yè),例如MapReduce、Lightning(交互式分析)、Mars,您可以按照計(jì)費(fèi)公式添加相應(yīng)代碼行。計(jì)費(fèi)詳情,請(qǐng)參見(jiàn)計(jì)算費(fèi)用(按量計(jì)費(fèi))。${datetime1}
為DataWorks的調(diào)度參數(shù),您需要在ODPS SQL節(jié)點(diǎn)右側(cè),單擊調(diào)度配置,在基礎(chǔ)屬性區(qū)域配置參數(shù)值為datetime1=${yyyymmdd}
。
步驟五:創(chuàng)建釘釘群機(jī)器人并推送TOPN費(fèi)用賬號(hào)及耗時(shí)作業(yè)信息
以PC端為例,創(chuàng)建釘釘群機(jī)器人并推送TOPN費(fèi)用賬號(hào)及耗時(shí)作業(yè)信息的操作流程如下:
創(chuàng)建釘釘群機(jī)器人。
選擇目標(biāo)釘釘群,單擊右上角的圖標(biāo)。
在群設(shè)置面板,單擊智能群助手。
在智能群助手面板,單擊添加機(jī)器人。
在群機(jī)器人對(duì)話框的添加機(jī)器人區(qū)域,單擊圖標(biāo)。
在群機(jī)器人對(duì)話框,單擊自定義機(jī)器人。
在機(jī)器人詳情對(duì)話框,單擊添加。
在添加機(jī)器人對(duì)話框,編輯機(jī)器人信息。
屬性名稱
設(shè)置規(guī)則
頭像
單擊頭像右下角的圖標(biāo)來(lái)編輯頭像。
機(jī)器人名字
輸入機(jī)器人名字。
安全設(shè)置
完成必要的安全設(shè)置(至少選擇1種),勾選我已閱讀并同意《自定義機(jī)器人服務(wù)及免責(zé)條款》,單擊完成。
安全設(shè)置有3種方式:
自定義關(guān)鍵詞:最多可以設(shè)置10個(gè)關(guān)鍵詞。
加簽:勾選加簽可以獲取到機(jī)器人的密鑰。
IP地址(段):只有來(lái)自IP地址范圍內(nèi)的請(qǐng)求才會(huì)被正常處理。
在添加機(jī)器人對(duì)話框,復(fù)制生成的Webhook地址。單擊完成。
重要請(qǐng)保管好此Webhook地址,不要公布在外部網(wǎng)站上,泄露后會(huì)有安全風(fēng)險(xiǎn)。
通過(guò)IntelliJ IDEA創(chuàng)建Maven項(xiàng)目并編譯推送釘釘群消息的Java程序,編譯完成后生成JAR包。
IntelliJ IDEA操作詳情,請(qǐng)單擊IntelliJ IDEA工具界面右上角的Help獲取。
配置Pom依賴。
Pom依賴如下。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>DingTalk_Information</groupId> <artifactId>DingTalk_Information</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.aliyun.odps</groupId> <artifactId>odps-sdk-core</artifactId> <version>0.35.5-public</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.15</version> <exclusions> <exclusion> <groupId>com.sun.jmx</groupId> <artifactId>jmxri</artifactId> </exclusion> <exclusion> <groupId>com.sun.jdmk</groupId> <artifactId>jmxtools</artifactId> </exclusion> <exclusion> <groupId>javax.jms</groupId> <artifactId>jms</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>alibaba-dingtalk-service-sdk</artifactId> <version>1.0.1</version> </dependency> <dependency> <groupId>com.aliyun.odps</groupId> <artifactId>odps-jdbc</artifactId> <version>3.0.1</version> <classifier>jar-with-dependencies</classifier> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.4.1</version> <configuration> <!-- get all project dependencies --> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <!-- MainClass in mainfest make a executable jar --> <archive> <manifest> <mainClass>com.alibaba.sgri.message.test</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <!-- bind to the packaging phase --> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
開(kāi)發(fā)Java程序并生成JAR包topn_new.jar。
Java代碼示例如下:
package com.alibaba.sgri.message; import java.io.IOException; import java.util.concurrent.atomic.AtomicInteger; import com.aliyun.odps.Instance; import com.aliyun.odps.Odps; import com.aliyun.odps.OdpsException; import com.aliyun.odps.account.Account; import com.aliyun.odps.account.AliyunAccount; import com.aliyun.odps.data.ResultSet; import com.aliyun.odps.task.SQLTask; import com.dingtalk.api.DefaultDingTalkClient; import com.dingtalk.api.DingTalkClient; import com.dingtalk.api.request.OapiRobotSendRequest; import com.dingtalk.api.response.OapiRobotSendResponse; import com.taobao.api.ApiException; public class test { public static void main(String[] args) throws ApiException { if (args.length < 1) { System.out.println("請(qǐng)輸入日期參數(shù)"); System.exit(0); } System.out.println("開(kāi)始讀取數(shù)據(jù)"); DingTalkClient client = new DefaultDingTalkClient( "https://oapi.dingtalk" + ".com/robot/send?access_token=<機(jī)器人Webhook地址>\n"); OapiRobotSendRequest request = new OapiRobotSendRequest(); request.setMsgtype("markdown"); OapiRobotSendRequest.Markdown markdown = new OapiRobotSendRequest.Markdown(); //這里的日期作為參數(shù) markdown.setText(getContent(args[0])); markdown.setTitle("作業(yè)消費(fèi)TOPN"); request.setMarkdown(markdown); OapiRobotSendResponse response = client.execute(request); System.out.println("消息發(fā)送成功"); } /** * 讀取ODPS,獲取要發(fā)送的數(shù)據(jù) */ public static String getContent(String day) { Odps odps = createOdps(); StringBuilder sb = new StringBuilder(); try { //==================這是費(fèi)用賬號(hào)===================== String costTopnSql = "select sum(cost_sum)cost_sum,task_owner from cost_topn where ds='" + day + "' " + "group by task_owner order by cost_sum desc limit 5;"; Instance costInstance = SQLTask.run(odps, costTopnSql); costInstance.waitForSuccess(); ResultSet costTopnRecords = SQLTask.getResultSet(costInstance); sb.append("<font color=#FF0000 size=4>").append("費(fèi)用賬號(hào)TOPN(").append(day).append( ")[按照阿里云按量付費(fèi)計(jì)算]").append("</font>").append("\n\n"); AtomicInteger costIndex = new AtomicInteger(1); costTopnRecords.forEach(item -> { sb.append(costIndex.getAndIncrement()).append(".").append("賬號(hào):"); sb.append("<font color=#2E64FE>").append(item.getString("task_owner")).append("\n\n").append("</font>"); sb.append(" ").append(" ").append("消費(fèi):").append("<font color=#2E64FE>").append(item.get("cost_sum")) .append("元").append( "</font>").append("\n\n") .append("</font>"); }); //==================這是耗時(shí)作業(yè)===================== String timeTopnSql = "select * from time_topn where ds='" + day + "' ORDER BY cost_time DESC limit 5;"; Instance timeInstance = SQLTask.run(odps, timeTopnSql); timeInstance.waitForSuccess(); ResultSet timeTopnRecords = SQLTask.getResultSet(timeInstance); sb.append("<font color=#FF8C00 size=4>").append("耗時(shí)作業(yè)TOPN(").append(day).append(")") .append("\n\n").append("</font>"); AtomicInteger timeIndex = new AtomicInteger(1); timeTopnRecords.forEach(item -> { sb.append(timeIndex.getAndIncrement()).append(".").append("作業(yè):"); sb.append("<font color=#2E64FE>").append(item.getString("inst_id")).append("\n\n").append("</font>"); sb.append(" ").append("賬號(hào):").append("<font color=#2E64FE>").append(item.getString("task_owner")).append("\n\n").append("</font>"); sb.append(" ").append("耗時(shí):).append("<font color=#2E64FE>").append(item.get("cost_time")) .append("秒").append( "</font>").append("\n\n"); }); } catch (OdpsException | IOException e) { e.printStackTrace(); } return sb.toString(); } /** * 創(chuàng)建ODPS */ public static Odps createOdps() { String project = "<project_name>"; // 阿里云賬號(hào)AccessKey擁有所有API的訪問(wèn)權(quán)限,風(fēng)險(xiǎn)很高。強(qiáng)烈建議您創(chuàng)建并使用RAM用戶進(jìn)行API訪問(wèn)或日常運(yùn)維,請(qǐng)登錄RAM控制臺(tái)創(chuàng)建RAM用戶 // 此處以把AccessKey 和 AccessKeySecret 保存在環(huán)境變量為例說(shuō)明。您也可以根據(jù)業(yè)務(wù)需要,保存到配置文件里 // 強(qiáng)烈建議不要把 AccessKey 和 AccessKeySecret 保存到代碼里,會(huì)存在密鑰泄漏風(fēng)險(xiǎn) private static String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); private static String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); String endPoint = "http://service.odps.aliyun.com/api"; Account account = new AliyunAccount(accessId, accessKey); Odps odps = new Odps(account); odps.setEndpoint(endPoint); odps.setDefaultProject(project); return odps; } }
說(shuō)明自定義釘釘群機(jī)器人開(kāi)發(fā)API,請(qǐng)參見(jiàn)機(jī)器人開(kāi)發(fā)。
上傳生成的topn_new.jar包為MaxCompute資源。
上傳MaxCompute資源操作,請(qǐng)參見(jiàn)創(chuàng)建并使用MaxCompute資源。
創(chuàng)建Shell節(jié)點(diǎn)(dingsend),引用topn_new.jar包并配置定時(shí)調(diào)度。
創(chuàng)建Shell節(jié)點(diǎn)操作,請(qǐng)參見(jiàn)Shell節(jié)點(diǎn)。
Shell節(jié)點(diǎn)運(yùn)行的命令示例如下:
java -jar topn_new.jar $1
$1
為DataWorks的調(diào)度參數(shù),您需要在Shell節(jié)點(diǎn)右側(cè),單擊調(diào)度配置,在基礎(chǔ)屬性區(qū)域配置參數(shù)值為${yyyymmdd}
。
步驟六:配置上下游節(jié)點(diǎn)調(diào)度屬性并運(yùn)行節(jié)點(diǎn)
在業(yè)務(wù)流程面板將information_history、topn和dingsend節(jié)點(diǎn)連線形成依賴關(guān)系,并配置每個(gè)節(jié)點(diǎn)的重跑屬性和依賴的上游節(jié)點(diǎn)。配置完成后在節(jié)點(diǎn)上單擊右鍵,選擇運(yùn)行節(jié)點(diǎn)即可。
依賴關(guān)系配置,請(qǐng)參見(jiàn)配置同周期調(diào)度依賴。
節(jié)點(diǎn)上下游配置,請(qǐng)參見(jiàn)配置節(jié)點(diǎn)上下文。
效果展示
釘釘群推送內(nèi)容效果如下,僅供參考。
相關(guān)文檔
在線支持
如果您在使用MaxCompute的過(guò)程中有任何疑問(wèn)或建議,單擊申請(qǐng)鏈接或搜索(釘釘群號(hào):11782920)加入釘釘群進(jìn)行反饋。