本文為您介紹MaxCompute的訂用帳戶作業優先順序功能,並提供開啟、設定和查看作業優先順序的操作指導。
背景資訊
MaxCompute的訂用帳戶計算資源有限,在實際資料開發過程中,系統需要優先保障重要作業的計算資源。例如,系統必須在06:00點前產出某些資料,則需要保障產出這些資料的一系列作業(工作流程)能夠在運行時優先搶佔到計算資源。
您可以通過MaxCompute設定使用訂用帳戶計算資源Project的作業優先順序,優先保障高優先順序作業的計算資源。當高優先順序作業啟動時,可以搶佔低優先順序作業的計算資源。
概述
MaxCompute中的每個作業都有優先順序(Priority),取值為0~9,數值越小,優先順序越高。高優先順序作業會先於低優先順序作業擷取計算資源。
需要注意:
MaxCompute只支援設定使用訂用帳戶計算資源Project的作業優先順序。
當Project的作業優先順序功能未開啟時,除以下作業外,其他作業的預設優先順序為9。
PAI演算法作業,預設優先順序為1。
開啟優先順序功能
Project層級開啟優先順序
僅Project Owner或擁有Super_Administrator角色的使用者可以執行如下命令開啟優先順序功能開關。
setproject odps.instance.priority.enable=true;
優先順序功能開啟後,使用訂用帳戶計算資源Project的所有作業的優先順序會立即生效。如果您設定的優先順序不合理,可能導致作業排隊混亂。
重要建議您先通過Information Schema排查存量作業的優先順序,並根據需要將非9的作業優先順序設定為9,然後再開啟優先順序功能開關。
Quota層級開啟優先順序
優先順序功能開啟後,在此Quota上執行的作業優先順序將生效,等同Project層級開啟優先順序。
前提條件
已購買訂用帳戶標準版Quota。
已建立Quota模板和Quota計劃,詳情請參見配置Quota。
操作步驟
登入MaxCompute控制台,在左上方選擇地區。
在左側導覽列,選擇工作區 > 配額(Quota)管理。
在Quota管理頁面,單擊需要配置的一級Quota操作列的Quota配置。
在Quota計劃頁簽,單擊目標計劃操作列的編輯。
在編輯Quota計劃對話方塊,勾選目標二級Quota行中的開啟優先順序。
說明二級Quota類型為互動式時,開啟優先順序參數預設不可用。
單擊確定。
排查作業優先順序步驟如下:
統計作業優先順序分布情況。
命令樣本如下。
SELECT get_json_object( REPLACE(settings, '.', '_') ,'$.odps_instance_priority' ) AS priority ,task_type ,COUNT(1) AS cnt FROM information_schema.tasks_history WHERE ds = '${bizdate}' --bizdate為日期分區。 GROUP BY get_json_object( REPLACE(settings, '.', '_') ,'$.odps_instance_priority' ) ,task_type ORDER BY cnt DESC LIMIT 100 ;
返回結果樣本如下。
+----------+-----------+------------+ | priority | task_type | cnt | +----------+-----------+------------+ | 9 | SQL | 4 | | NULL | SQL | 1 | | 2 | SQL | 1 | +----------+-----------+------------+
返回結果樣本涉及NULL、2和9三種優先順序。您需要定位優先順序為2和NULL的作業。NULL通常為DDL任務,可忽略。
定位優先順序非9的作業。命令樣本如下。
SELECT inst_id ,owner_name ,task_name ,task_type ,settings FROM information_schema.tasks_history WHERE ds = '${bizdate}' AND get_json_object(REPLACE(settings, '.', '_'), '$.odps_instance_priority') = '${priority}' LIMIT 100 ;
bizdate:取值為日期分區,例如20200517。
priority:取值為非9的優先順序數值,例如2。
返回結果樣本如下。
+---------+------------+-----------+-----------+----------+ | inst_id | owner_name | task_name | task_type | settings | +---------+------------+-----------+-----------+----------+ | 20200517160200907g4jm**** | ALIYUN$odps_dev_****@prod.trusteeship.aliyunid.com | console_query_task_158973132**** | SQL | {"SKYNET_ID": "21000041****", "odps.instance.priority": "2", "SKYNET_ONDUTY": "113058643178****", "user_agent": "JavaSDK Revision:33acd11 Version:0.30.9 JavaVersion:1.8.0_112 CLT(0.30.2 : 9da012b); Linux(/)", "biz_id": "210000416174_20200517_211843317416_210033365461_1_habai_test_1130586431784115_39419845061****", "SKYNET_NODENAME": "test_priority"} | +---------+------------+-----------+-----------+----------+
SKYNET_ID:表示DataWorks的調度節點ID。如果返回結果中不包含該欄位,表明不是通過DataWorks提交的作業,需要通過owner_name和user_agent欄位進行排查。
SKYNET_ONDUTY:表示周期性作業。您可以進入DataWorks營運中心,選擇 ,查看作業。
排查作業優先順序。
通過DataWorks提交的作業:如果作業設定了基準,您需要判斷基準的合理性。如果基準不合理,刪除基準。詳情請參見基準管理。
不是通過DataWorks提交的作業:您可以通過返回結果定位到具體責任人和代碼,取消代碼中設定的優先順序,即可恢複預設優先順序9。
設定優先權
設定作業優先順序的方式如下:
運行MaxCompute用戶端並進入Project空間,設定作業優先順序。
該方式常用於設定臨時查詢作業的優先順序。命令樣本如下。
set odps.instance.priority=values; //values取值為0~9。
運行MaxCompute用戶端並進入Project空間,將SQL作為參數傳入,設定作業優先順序。
該方式常用於設定臨時查詢作業的優先順序。命令樣本如下。
bin/odpscmd --config=xxx --project=xxx --instance-priority=x -e "<sql>"
通過Java SDK設定作業優先順序。
您可以通過該方式自行設計優先順序設定方法。詳情請參見Java SDK介紹。命令樣本如下。
import com.aliyun.odps.Instance; import com.aliyun.odps.LogView; 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.task.SQLTask; public class OdpsPriorityDemo { public static void main(String args[]) throws OdpsException { // 阿里雲帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM使用者進行API訪問或日常營運,請登入RAM控制台建立RAM使用者 // 此處以把AccessKey 和 AccessKeySecret 儲存在環境變數為例說明。您也可以根據業務需要,儲存到設定檔裡 // 強烈建議不要把 AccessKey 和 AccessKeySecret 儲存到代碼裡,會存在密鑰泄漏風險 Account account = new AliyunAccount(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); Odps odps = new Odps(account); // 公用雲URL。 String odpsUrl = "http://service.odps.aliyun.com/api"; odps.setEndpoint(odpsUrl); odps.setDefaultProject("xxxxxxxxxx"); SQLTask task = new SQLTask(); task.setName("adhoc_sql_task_1"); task.setQuery("select count(*) from aa;"); // 5為作業優先順序。 Instance instance = odps.instances().create(task, 5); LogView logView = new LogView(odps); // 列印Logview,用於查看Instance執行狀態,非必須。 System.out.println(logView.generateLogView(instance, 24)); // 等待Instance執行完成,非必須。 instance.waitForSuccess(); } }
通過DataWorks的基準管理功能設定作業優先順序。
該方式常用於保障某個周期性作業以及其上遊作業優先產出資料。您可以通過基準管理功能集中設定整條資料鏈路上各個作業的優先順序,無需單獨處理每個作業。DataWorks的基準管理功能詳情請參見基準管理。
DataWorks的基準優先順序為1、3、5、7或8,數值越大,優先順序越高。當您通過DataWorks的基準管理功能設定MaxCompute作業優先順序時,MaxCompute作業優先順序=9-DataWorks基準優先順序。
說明DataWorks臨時查詢,預設沒有基準,發起的MaxCompute作業最低優先順序為9。
DataWorks工作流程,由於有預設基準優先順序為1,所以發起的MaxCompute作業最低優先順序為8。
通過DataWorks節點直接設定作業優先順序。
該方式常用於設定臨時查詢作業的優先順序。命令樣本如下。
set odps.instance.priority=x; //x為優先順序取值。
查看作業優先順序
您可以在Logview 2.0頁面的Json Summary頁簽,通過odps.instance.priority參數查看作業優先順序。更多Logview 2.0操作請參見使用Logview 2.0查看作業運行資訊。
Logview頁面上XML顯示的優先順序不準確。對於使用隨用隨付的Project,以及沒有開啟優先順序功能且使用訂用帳戶計算資源的Project,即使XML中設定的優先順序值不等於9,系統也會將其改為9,防止排隊不公平。