このトピックでは、MaxCompute サブスクリプションリソースのジョブ優先度機能について説明します。また、ジョブ優先度を有効化、設定、表示する方法についても説明します。
背景情報
MaxCompute のサブスクリプション計算リソースは限られているため、データ開発中に重要なジョブに対してシステムがリソースを優先的に割り当てる必要があります。たとえば、特定のデータを 06:00 までに生成する必要がある場合、このデータを生成するワークフローは、実行時に計算リソースをプリエンプトできる必要があります。
この要件は、サブスクリプション計算リソースを使用するプロジェクトのジョブ優先度を設定することで満たすことができます。これにより、優先度の高いジョブが最初に計算リソースを受け取ることが保証されます。優先度の高いジョブが開始されると、優先度の低いジョブの計算リソースをプリエンプトできます。
優先度の概要
MaxCompute の各ジョブには優先度があります。優先度の値の範囲は 0 から 9 です。値が小さいほど優先度が高くなります。優先度の高いジョブは、優先度の低いジョブよりも先に計算リソースを取得します。
注意:
MaxCompute は、サブスクリプション計算リソースを使用するプロジェクトに対してのみ、ジョブ優先度の設定をサポートしています。
プロジェクトでジョブ優先度機能が有効になっていない場合、ジョブのデフォルトの優先度は 9 です。PAI アルゴリズムジョブの場合、デフォルトの優先度は 1 です。
優先度の有効化
プロジェクトレベルでの優先度の有効化
プロジェクトオーナーまたは Super_Administrator ロールを持つユーザーのみが、次のコマンドを実行して優先度機能を有効にできます。
setproject odps.instance.priority.enable=true;優先度機能を有効にすると、サブスクリプション計算リソースを使用するプロジェクト内のすべてのジョブの優先度がすぐに有効になります。ただし、不適切な優先度を設定すると、ジョブキューが乱れる可能性があります。
Information Schema で既存のジョブの優先度を確認してください。必要に応じて、優先度が 9 でないジョブの優先度を 9 にリセットしてから、優先度機能を有効にしてください。
クォータレベルでの優先度の有効化
優先度機能を有効にすると、このクォータで実行されるジョブの優先度が有効になります。これは、プロジェクトレベルで優先度を有効にすることと同じです。
前提条件
サブスクリプション Standard Edition クォータを購入済みであること。
クォータテンプレートとクォータプランを作成済みであること。詳細については、「クォータの設定」をご参照ください。
操作手順
MaxCompute コンソールにログインし、左上のコーナーでリージョンを選択します。
左側のナビゲーションウィンドウで、を選択します。
クォータ管理 ページで、対象のクォータを見つけ、操作 列の クォータ設定 をクリックします。
クォータ設定 ページで、基本設定 タブを選択し、基本設定の編集 をクリックします。
対象のレベル 2 クォータに対して 優先度を開く オプションを選択します。
説明レベル 2 クォータの データ型 が インタラクティブ に設定されている場合、デフォルトでは [優先度を有効にする] パラメーターは使用できません。
決定 をクリックします。
ジョブ優先度の確認
ジョブ優先度の分布を表示します。
コマンド例:
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 の 3 つの優先度が表示されています。優先度が 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 を通じて送信されていないジョブの場合:返された結果を使用してオーナーとコードを特定します。コードから優先度設定を削除して、デフォルトの優先度 9 に戻します。
優先度の設定
ジョブの優先度は、次の方法で設定できます。
方法 1:MaxCompute クライアントを実行し、プロジェクトスペースに入り、ジョブの優先度を設定します。
この方法は、一時的なクエリジョブの優先度を設定するためによく使用されます。コマンド例:
SET odps.instance.priority=values; -- values の値の範囲は 0 から 9 です。方法 2:MaxCompute クライアントを実行し、プロジェクトスペースに入り、SQL 文をパラメーターとして渡してジョブの優先度を設定します。
この方法は、一時的なクエリジョブの優先度を設定するためによく使用されます。コマンド例:
bin/odpscmd --config=xxx --project=xxx --instance-priority=x -e "<sql>"方法 3: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 { // Alibaba Cloud アカウントの AccessKey は、すべての API にアクセスできる権限を持つため、高いセキュリティリスクを伴います。 // API 呼び出しや日常の O&M には、RAM ユーザーを作成して使用することを推奨します。RAM コンソールにログインして RAM ユーザーを作成してください。 // この例では、AccessKey ID と AccessKey Secret を環境変数に保存する方法を示しています。必要に応じて、設定ファイルに保存することもできます。 // セキュリティリスクにつながる可能性があるため、AccessKey ID と AccessKey Secret をコードにハードコーディングしないでください。 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 を出力してインスタンスの実行ステータスを確認します。このステップはオプションです。 System.out.println(logView.generateLogView(instance, 24)); // インスタンスが完了するのを待ちます。このステップはオプションです。 instance.waitForSuccess(); } }方法 4:DataWorks のベースライン管理機能を使用してジョブの優先度を設定します。
この方法は、定期ジョブとその上流ジョブがデータを生成する際に優先されるようにするためによく使用されます。ベースライン管理機能を使用すると、各ジョブを個別に処理することなく、データリンク内のすべてのジョブの優先度を一元的に設定できます。DataWorks のベースライン管理機能の詳細については、「ベースライン管理」をご参照ください。
DataWorks のベースライン優先度は 1、3、5、7、または 8 です。値が大きいほど優先度が高くなります。DataWorks のベースライン管理機能を使用して MaxCompute のジョブ優先度を設定する場合、MaxCompute のジョブ優先度は「9 - DataWorks のベースライン優先度」として計算されます。
説明DataWorks の一時的なクエリでは、デフォルトでベースラインは設定されません。開始された MaxCompute ジョブの優先度は最も低い 9 になります。
DataWorks ワークフローの場合、デフォルトのベースライン優先度は 1 です。開始された MaxCompute ジョブの優先度は 8 になります。
方法 5:DataWorks ノードで直接ジョブの優先度を設定します。
この方法は、一時的なクエリジョブの優先度を設定するためによく使用されます。コマンド例:
set odps.instance.priority=x; -- x は優先度の値です。
優先度の表示
Logview 2.0 ページで、[Json Summary] タブをクリックします。odps.instance.priority パラメーターでジョブの優先度を表示できます。Logview 2.0 の操作の詳細については、「Logview 2.0 を使用してジョブの実行情報を表示する」をご参照ください。
Logview ページの XML 形式で表示される優先度は正確ではありません。従量課金方式を使用するプロジェクトの場合、システムはジョブの優先度を 9 に変更します。この変更は、サブスクリプション計算リソースを使用しているが優先度機能が有効になっていないプロジェクトにも適用されます。これは、XML で設定された優先度値が 9 でない場合でも発生します。この変更により、不公平なキューイングが防止されます。