Este tópico descreve o recurso de prioridade de jobs no MaxCompute e explica como ativar, definir e visualizar prioridades de jobs.
Contexto
O MaxCompute possui recursos de computação limitados. Durante o desenvolvimento de dados, o sistema precisa priorizar jobs críticos para garantir que eles obtenham os recursos necessários. Por exemplo, se determinados dados precisam estar disponíveis até as 6h da manhã, a série de jobs — ou workflow — responsável por gerar esses dados deve conseguir reivindicar recursos de computação antes dos demais jobs.
Defina prioridades de jobs no nível do projeto para atender a esse requisito. Jobs com maior prioridade recebem recursos de computação primeiro. Quando um job de alta prioridade é iniciado, ele pode preemptar recursos de jobs com prioridade inferior.
Visão geral de prioridades
Todo job no MaxCompute possui um valor de prioridade de 0 a 9. Números menores indicam maior prioridade. Jobs com maior prioridade recebem recursos de computação antes dos jobs com menor prioridade.
Quando o recurso de prioridade de jobs está desativado, a prioridade padrão de todos os jobs em um projeto é 9. Para jobs de algoritmo do PAI, a prioridade padrão é 1.
Ativar prioridade
Ativar prioridade no nível do projeto
Somente o proprietário do projeto ou um usuário com a função Super_Administrator pode execute o seguinte comando para ativar o recurso de prioridade.
setproject odps.instance.priority.enable=true;
Após ativar o recurso de prioridade, todos os jobs do projeto passam a usar prioridade imediatamente. No entanto, se as prioridades forem configuradas incorretamente, os jobs podem entrar em fila de maneira imprevisível.
Antes de ativar o recurso de prioridade, verifique as prioridades dos jobs existentes usando o Information Schema. Em seguida, redefina para 9 todas as prioridades que não sejam 9, conforme necessário. Só então ative o recurso de prioridade.
Ativar prioridade no nível de cota
Após ativar o recurso de prioridade, os jobs executados nessa cota passam a usar prioridade. O funcionamento é equivalente ao de ativar a prioridade no nível do projeto.
Antes de ativar a prioridade, certifique-se de ter criado um modelo de cota e um plano de cota. Para mais informações, consulte Configure quotas.
Procedimento
Faça login no MaxCompute console e selecione uma região no canto superior esquerdo.
No painel de navegação à esquerda, escolha .
Na página Quotas, clique em Quota Configuration na coluna Actions da cota desejada.
Na página Quota Configuration, selecione a aba Basic Configurations e clique em Edit Basic Configurations.
-
Marque a caixa de seleção Enable Priority para a cota de segundo nível desejada.
NotaQuando o Type da cota de segundo nível for Interactive, o parâmetro Enable Priority fica indisponível por padrão.
Clique em OK.
Verificar prioridades de jobs
-
Estatísticas de distribuição de prioridade de jobs
Exemplo de comando:
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 is the date partition. GROUP BY get_json_object( REPLACE(settings, '.', '_') ,'$.odps_instance_priority' ) ,task_type ORDER BY cnt DESC LIMIT 100 ;O retorno é o seguinte:
+----------+-----------+------------+ | priority | task_type | cnt | +----------+-----------+------------+ | 9 | SQL | 4 | | NULL | SQL | 1 | | 2 | SQL | 1 | +----------+-----------+------------+Este exemplo exibe prioridades NULL, 2 e 9. Identifique os jobs com prioridade 2 ou NULL. O valor NULL geralmente indica uma tarefa DDL, que pode ser ignorada.
-
Localize os jobs com valores de prioridade diferentes de 9.
Exemplo de comando:
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: A partição de data, como 20200517.
priority: Um valor de prioridade diferente de 9, como 2.
O resultado retornado é o seguinte:
+---------+------------+-----------+-----------+----------+ | 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: O ID do nó de agendamento do DataWorks. Se este campo estiver ausente, o job não foi enviado pelo DataWorks. Use os campos owner_name e user_agent para identificar a origem.
SKYNET_ONDUTY: Indica um job periódico.
-
Revise as prioridades dos jobs.
Jobs enviados pelo DataWorks: se o job possuir uma baseline, verifique se ela é razoável. Caso contrário, exclua a baseline. Para mais informações, consulte Baseline management.
Jobs não enviados pelo DataWorks: use os resultados da consulta para localizar o proprietário e o código. Remova a configuração de prioridade do código para restaurar a prioridade padrão de 9.
Definir prioridade
A prioridade de jobs pode ser definida das seguintes formas:
-
Método 1: execute o cliente MaxCompute, acesse seu projeto e defina a prioridade do job.
Indicado para consultas ad hoc. Exemplo de comando:
SET odps.instance.priority=values; -- values is an integer from 0 to 9. -
Método 2: execute o cliente MaxCompute, acesse seu projeto e passe a instrução SQL como parâmetro para definir a prioridade do job.
Indicado para consultas ad hoc. Exemplo de comando:
bin/odpscmd --config=xxx --project=xxx --instance-priority=x -e "<sql>" -
Método 3: defina a prioridade do job usando o Java SDK.
Use este método para construir lógica de prioridade personalizada. Para mais informações, consulte Java SDK overview. Exemplo de código:
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 { // An Alibaba Cloud AccessKey gives full API access and poses a high security risk. We strongly recommend that you create and use a RAM user instead. To create a RAM user, log on to the RAM console. // In this example, the AccessKey ID and AccessKey secret are stored in environment variables. You can also store them in a configuration file based on your needs. // Never store the AccessKey ID and AccessKey secret in your code. That could expose your credentials. Account account = new AliyunAccount(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); Odps odps = new Odps(account); // Public cloud endpoint. 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 is the job priority. Instance instance = odps.instances().create(task, 5); LogView logView = new LogView(odps); // Print the LogView URL to check the instance status. Optional. System.out.println(logView.generateLogView(instance, 24)); // Wait for the instance to complete. Optional. instance.waitForSuccess(); } } -
Método 4: defina a prioridade do job por meio do gerenciamento de baselines do DataWorks.
Recomendado quando é necessário garantir a entrega pontual de um job periódico e de seus jobs upstream. O gerenciamento de baselines permite definir prioridades para todos os jobs de um pipeline de dados de uma só vez, sem precisar configurar cada job individualmente. Para mais informações sobre o gerenciamento de baselines do DataWorks, consulte Baseline management.
No DataWorks, as prioridades de baseline são 1, 3, 5, 7 ou 8. Números maiores indicam maior prioridade. Ao definir a prioridade de um job MaxCompute por meio do gerenciamento de baselines do DataWorks, a prioridade do job no MaxCompute equivale a 9 menos a prioridade de baseline do DataWorks.
NotaPor padrão, as consultas ad hoc no DataWorks não possuem baseline. Portanto, a menor prioridade para os jobs MaxCompute iniciados por elas é 9.
Os workflows do DataWorks têm prioridade de baseline padrão igual a 1. Portanto, a menor prioridade para os jobs MaxCompute iniciados por eles é 8.
-
Método 5: defina a prioridade do job diretamente em um nó do DataWorks.
Indicado para consultas ad hoc. Exemplo de comando:
set odps.instance.priority=x; -- x is the priority value.
Visualizar prioridade
No Logview 2.0, acesse a aba Json Summary e localize o parâmetro odps.instance.priority para visualizar a prioridade do job. Para mais operações no Logview 2.0, consulte View job execution details using Logview 2.0. 
A prioridade exibida em XML na página do Logview não é precisa. Para projetos com prioridade desativada, o sistema altera qualquer valor de prioridade diferente de 9 para 9 no XML, evitando filas injustas.