複数のジョブが同じコンピューティングリソースを競合する場合、MaxCompute はジョブの優先度を使用して、どのジョブが最初にリソースを取得するかを決定します。優先度の高いジョブは、優先度の低いジョブよりも先にコンピューティングリソースを受け取り、すでに実行中の優先度の低いジョブからリソースをプリエンプトできます。ジョブの優先度を使用して、緊急性の低いワークロードでクラスターがビジー状態のときに、時間的制約のあるパイプライン (午前 6 時までに完了する必要がある ETL ジョブなど) を保護します。
仕組み
すべての MaxCompute ジョブには、0 から 9 までの優先度の値があります。数値が小さいほど優先度が高くなります。優先度 0 が最も高く、優先度 9 が最も低くなります。
コンピューティングリソースが限られている場合、MaxCompute は優先度順にジョブをスケジュールします。リソースが優先度の低いジョブで完全に占有されているときに優先度の高いジョブが到着した場合、そのジョブはそれらのジョブをプリエンプトして、必要なリソースを要求します。
優先度機能が無効な場合のデフォルトの動作:
すべてのジョブ:優先度 9 (最も低い)
PAI アルゴリズムジョブ:優先度 1 (ほぼ最も高い)
クエリ結果の NULL 優先度は通常、DDL タスクを示しており、無視できます。
前提条件
ジョブの優先度を有効にする前に、次のことを確認してください:
MaxCompute プロジェクトのプロジェクト所有者または
Super_Administratorロール(クォータレベルでの有効化の場合) クォータテンプレートとクォータプランが設定されていること。詳細については、「クォータの設定」をご参照ください。
ジョブの優先度の有効化
ジョブの優先度を有効にする前に、Information Schema を使用して既存のジョブの優先度を監査し、9 以外の値を 9 にリセットしてください。このステップをスキップすると、既存の高優先度設定を持つジョブが予期せずキューの先頭に移動する可能性があります。
既存のジョブの優先度の確認
Information Schema で次のクエリを実行して、日付パーティション内のすべてのジョブにわたる優先度の分布を確認します:
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}' -- 日付パーティションに置き換えます (例:20200517)。
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 優先度のジョブは DDL タスクです。これらは無視してください。優先度の値が 9 以外のジョブ (この例では 2 など) については、所有者を特定し、この機能を有効にする前に優先度をリセットしてください。
特定の優先度の値を持つジョブの詳細を検索するには:
SELECT inst_id,
owner_name,
task_name,
task_type,
settings
FROM information_schema.tasks_history
WHERE ds = '${bizdate}' -- 日付パーティションに置き換えます (例:20200517)。
AND get_json_object(
REPLACE(settings, '.', '_'),
'$.odps_instance_priority'
) = '${priority}' -- フィルタリングする優先度の値に置き換えます (例:2)。
LIMIT 100;出力の主要なフィールド:
フィールド | 説明 |
| DataWorks のスケジューリングノード ID。ジョブが DataWorks を介して送信されなかった場合は表示されません。 |
| ジョブが定期的なジョブの場合に表示されます。 |
| ジョブの所有者。これを使用して、DataWorks 以外のジョブを追跡します。 |
9 以外の優先度を持つジョブを特定した後:
DataWorks ジョブ: 関連付けられたベースラインが妥当かどうかを確認してください。妥当でない場合は削除してください。詳細については、「ベースライン管理」をご参照ください。
DataWorks 以外のジョブ:
owner_nameとuser_agentを使用して所有者に連絡してください。ジョブコードから優先度設定を削除して、デフォルトの優先度 9 に戻してください。
プロジェクトレベルでの優先度の有効化
プロジェクト所有者または Super_Administrator ロールを持つユーザーのみが優先度を有効にできます。MaxCompute クライアントで次のコマンドを実行してください:
setproject odps.instance.priority.enable=true;優先度は、プロジェクト内のすべてのジョブに対してすぐに有効になります。
クォータレベルでの優先度の有効化
クォータレベルで優先度を有効にすると、そのクォータで実行されているすべてのジョブに優先度スケジューリングが適用されます。
MaxCompute コンソールにログインし、リージョンを選択します。MaxCompute コンソール
ナビゲーションペインで、[Manage Configurations] > [Quotas] を選択します。
対象のクォータを見つけ、[Actions] 列の [Quota Configuration] をクリックします。
[Basic Configurations] タブで、[Edit Basic Configurations] をクリックします。
対象のレベル 2 クォータの [Enable Priority] オプションを選択します。
レベル 2 クォータの [Type] が [Interactive] の場合、[Enable Priority] オプションはデフォルトで利用できません。
[OK] をクリックします。
ジョブの優先度の設定
ワークフローに合った方法を選択してください:
方法 | 最適な用途 |
MaxCompute クライアント (SET コマンド) | アドホッククエリ |
MaxCompute クライアント (CLI フラグ) | スクリプト経由のアドホッククエリ |
Java SDK | カスタムの優先度ロジックを持つアプリケーション |
DataWorks ベースライン管理 | SLA 要件を持つ定期的なパイプライン |
DataWorks ノード設定 | DataWorks でのアドホッククエリ |
方法 1:MaxCompute クライアント — SET コマンド
MaxCompute クライアントで SQL 文の前にこのコマンドを実行してください:
SET odps.instance.priority = <value>;
-- は 0 (最も高い優先度) から 9 (最も低い優先度) までの整数です。 方法 2:MaxCompute クライアント — CLI フラグ
SQL 文を送信するときに、優先度をフラグとして渡してください:
bin/odpscmd --config=<config-file> --project=<project-name> --instance-priority=<value> -e "<sql>"方法 3:Java SDK
ジョブを送信するときに odps.instances().create(task, priority) メソッドを使用して優先度を設定してください:
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 の認証情報をコードにハードコーディングしないでください。
Account account = new AliyunAccount(
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
);
Odps odps = new Odps(account);
odps.setEndpoint("http://service.odps.aliyun.com/api");
odps.setDefaultProject("<your-project-name>");
SQLTask task = new SQLTask();
task.setName("adhoc_sql_task_1");
task.setQuery("select count(*) from aa;");
// 優先度 5 でジョブを送信します。
// 優先度の値:0 (最高) から 9 (最低)。
Instance instance = odps.instances().create(task, 5);
// ジョブのステータスを監視するために LogView の URL を出力します (任意)。
LogView logView = new LogView(odps);
System.out.println(logView.generateLogView(instance, 24));
// ジョブが完了するまで待機します (任意)。
instance.waitForSuccess();
}
}詳細については、「Java SDK の概要」をご参照ください。
方法 4:DataWorks ベースライン管理
定期的なパイプラインとそのすべてのアップストリームジョブを SLA ウィンドウ内で完了させる必要がある場合、この方法を使用します。ベースライン管理は、パイプライン内のすべてのジョブの優先度を一度に設定するため、各ジョブを個別に設定する必要はありません。
DataWorks のベースライン優先度は、式 MaxCompute 優先度 = 9 - DataWorks ベースライン優先度 に基づいて、対応する MaxCompute のジョブ優先度に変換されます。一般的な優先度マッピングを次の表に示します。
DataWorks ベースライン優先度 | MaxCompute ジョブの優先度 | 注釈 |
8 (DataWorks で最高) | 1 | 実用上の最高優先度 |
7 | 2 | |
5 | 4 | |
3 | 6 | |
1 (デフォルト) | 8 | DataWorks ワークフローのデフォルト |
ベースラインなし (アドホック) | 9 | DataWorks アドホッククエリのデフォルト |
換算式:MaxCompute 優先度 = 9 − DataWorks ベースライン優先度
詳細については、「ベースライン管理」をご参照ください。
DataWorks のアドホッククエリにはデフォルトでベースラインがないため、送信される MaxCompute ジョブは最も低い優先度 (9) を使用します。DataWorks のワークフローにはデフォルトでベースライン優先度 1 が設定されているため、そのジョブは優先度 8 を使用します。
方法 5:DataWorks ノード設定
DataWorks ノードでアドホッククエリの優先度を直接設定してください:
set odps.instance.priority = <value>;
-- は 0 (最高) から 9 (最低) までの優先度の値です。 ジョブの優先度の表示
特定のジョブの優先度を確認するには、Logview 2.0 でジョブを開き、[JSON Summary] タブに移動して、odps.instance.priority パラメーターを見つけてください。

Logview ページに表示される優先度は正確ではありません。優先度が無効になっているプロジェクトの場合、意図しないキューのジャンプを防ぐために、システムは 9 以外の優先度の値を XML で 9 に変換します。正確な優先度情報については、常に [JSON Summary] タブを使用してください。