本文为您介绍如何通过MaxCompute管家设置包年包月项目使用包年包月CU资源,而项目中的某些作业使用按量计费CU资源。只支持设置SQL类型作业使用按量计费CU资源。

概述

使用MaxCompute进行数据开发时,您通常需要按照业务需求选择包年包月或者按量计费CU资源,不同计费模式的CU资源具有不同的优劣。

包年包月CU资源为独享资源;按量计费CU资源为公共资源,按照需要弹性使用。某些情况下,会同时使用包年包月和按量计费的CU资源,对于资源需求量极高且优先级要求也很高的作业,包年包月CU资源远远不足,您需要使用按量计费CU资源来满足需求。

您可以先通过MaxCompute管家对使用包年包月计费模式的项目设置按量计费配额,然后在需要使用按量计费CU资源的SQL作业脚本中增加set odps.task.quota.preference.tag=payasyougo;语句,与SQL语句同时提交,即可将SQL作业提交到按量计费弹性资源池。SQL执行成功则会按量计费。

使用限制

您在使用该功能前需要确保项目满足如下要求:
  • 项目的计费模式为包年包月。
  • 项目所在区域已开通按量计费服务,详情请参见开通MaxCompute

注意事项

您在使用该功能前需要注意:
  • 提交到按量计费CU资源中的SQL作业,会按量计费并在第二天出账,计费详情请参见计算费用(按量计费)
  • 建议您配置消费监控告警,监控SQL作业消费情况,详情请参见消费监控告警

操作步骤

  1. 登录DataWorks控制台
  2. 在左侧导航栏,单击计算引擎列表 > MaxCompute
  3. 计算引擎列表—MaxCompute页面上方选择您所在的区域。
  4. 包年包月区域,单击CU管理,进入MaxCompute管家页面。
  5. 在左侧导航栏,单击项目,在包年包月项目区域,单击需要使用按量计费CU资源的项目右侧的增加按量付费配额
    增加按量付费配额配置成功后,按量付费属性值变为已添加
  6. 在需要使用按量计费CU资源的SQL语句前增加set odps.task.quota.preference.tag=payasyougo;命令,与SQL语句一起提交。
  7. (可选)在左侧导航栏,单击作业,在作业快照页签,查看SQL作业运行情况。
  8. (可选)如果项目不再使用按量计费CU资源,您可以在左侧导航栏,单击项目,在包年包月项目区域,单击需要移除按量计费CU资源的项目右侧的移除按量付费配额。移除成功后,新提交的SQL作业不会再使用按量计费CU资源。

通过Java SDK使用示例

您可以通过Java SDK方式提交作业,实现包年包月项目使用按量计费资源。命令示例如下。Java SDK详情请参见Java SDK介绍
import com.aliyun.odps.*;
import com.aliyun.odps.account.Account;
import com.aliyun.odps.account.AliyunAccount;
import com.aliyun.odps.task.SQLTask;

import java.util.HashMap;
import java.util.Map;

public class TestOdpsSdk {
public static void main(String args[]) throws OdpsException {
Account account = new AliyunAccount("AccessKey_id", "AccessKey_secret");
Odps odps = new Odps(account);
odps.setEndpoint("odps public cloud url");
odps.setDefaultProject("your_project_name");

String sqlText = "select count(*) from test_table1;";
Map<String, String> hints = new HashMap<>();
hints.put("odps.task.quota.preference.tag", "payasyougo"); // 提示系统sqlText希望提交到按量计费资源组(只有当your_project_name是包年包月计费类型,且添加了按量计费资源组,该配置才生效)。
Instance instance = SQLTask.run(odps, odps.getDefaultProject(), sqlText, hints, null);

LogView logView = new LogView(odps);
System.out.println(logView.generateLogView(instance, 48));
instance.waitForSuccess();
}
}