Este documento explica como criar tarefas que são executadas em recursos reservados e como impedir que as tarefas consumam reservas.
As reservas são uma funcionalidade do Compute Engine. Uma reserva oferece um nível de garantia muito elevado na obtenção de capacidade para uma ou mais VMs com a configuração de hardware especificada. Uma reserva de uma VM incorre nos custos dessa VM desde o momento em que cria a reserva até a eliminar. No entanto, enquanto estiver a consumir essa VM, o custo total é equivalente a uma VM sem uma reserva.
Geralmente, as reservas são úteis quando a disponibilidade de capacidade é criticamente importante ou para evitar erros na obtenção de recursos. Especificamente para o Batch, considere usar reservas dedicadas para ajudar a minimizar o tempo de agendamento de tarefas ou tente usar reservas existentes enquanto não estão a ser usadas. Se tiver reservas pouco usadas, como reservas necessárias para descontos de utilização comprometida, pode configurar tarefas para tentar consumi-las enquanto não estão a ser usadas para tentar ajudar a otimizar os custos incorridos. Em alternativa, se quiser priorizar a disponibilidade de recursos para outras cargas de trabalho no seu projeto, pode bloquear explicitamente uma tarefa de consumir reservas.
Para saber mais sobre as reservas, consulte a documentação do Compute Engine sobre reservas.
Antes de começar
- Se nunca usou o Batch, reveja o artigo Comece a usar o Batch e ative o Batch concluindo os pré-requisitos para projetos e utilizadores.
- Certifique-se de que tem as autorizações para criar uma reserva ou ver uma reserva existente que quer que as VMs de uma tarefa consumam conforme necessário.
-
Para receber as autorizações de que precisa para criar uma tarefa, peça ao seu administrador para lhe conceder as seguintes funções de IAM:
-
Editor de tarefas em lote (
roles/batch.jobsEditor
) no projeto -
Utilizador da conta de serviço (
roles/iam.serviceAccountUser
) na conta de serviço da tarefa, que, por predefinição, é a conta de serviço predefinida do Compute Engine
Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.
Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.
-
Editor de tarefas em lote (
Restrições
Além das restrições gerais para reservas, o Batch também tem as seguintes restrições:
- As VMs de uma tarefa não podem consumir reservas partilhadas.
- As VMs de uma tarefa não podem consumir reservas se qualquer uma especificar uma política de posicionamento compacta.
- Se criar uma tarefa através da Google Cloud consola, as respetivas VMs consomem automaticamente as reservas correspondentes. Para consumir uma reserva específica ou impedir que as VMs consumam reservas, tem de definir o campo
reservation
quando cria uma tarefa através da CLI gcloud ou da API Batch.
Requisitos
Esta secção resume os requisitos para que as VMs de uma tarefa consumam uma reserva. Para mais informações acerca de todos os requisitos, consulte os requisitos gerais para reservas na documentação do Compute Engine e o procedimento para planear a sua configuração mais adiante neste documento.
Para que as VMs de uma tarefa sejam geralmente capazes de consumir uma reserva, têm de ser cumpridas todas as condições seguintes:
A tarefa e a reserva têm de especificar propriedades da VM que correspondam exatamente.
Tem de agir em conformidade com todas as restrições neste documento e todos os outros requisitos gerais para reservas.
Para que cada VM de uma tarefa consuma com êxito uma reserva, a reserva tem de ter capacidade não utilizada disponível durante o tempo de execução da VM.
A capacidade não utilizada de uma reserva é a diferença entre o número de VMs e o número de VMs que a consomem atualmente. As VMs tentam consumir reservas sempre que tem capacidade de reserva não utilizada. Assim, uma VM pode começar a consumir uma reserva quando é criada ou mais tarde durante o respetivo tempo de execução. Uma VM não para de consumir uma reserva até que a VM pare de ser executada ou a reserva seja eliminada.
Consoante a capacidade de reserva não utilizada total, nenhuma, algumas ou todas as VMs de uma tarefa podem consumir reservas, e a quantidade de VMs reservadas pode variar ao longo do tempo de execução da tarefa.
Crie e execute uma tarefa que possa consumir VMs reservadas
Planeie a sua configuração. Para se certificar de que o seu trabalho e reserva são compatíveis, conclua os seguintes passos.
Se quiser consumir uma reserva já existente, tem de criar uma tarefa com uma configuração correspondente. Caso contrário, se planear criar uma nova reserva, selecione as opções de configuração que preferir.
Determine as propriedades da reserva. Devido às restrições, o tipo de partilha tem de ser de projeto único, que é a opção predefinida para uma reserva. Determine os valores que quer usar para as seguintes propriedades de reserva:
- Tipo de consumo*
- Número de VMs†
*O tipo de consumo da reserva (especificamente segmentado ou consumido automaticamente) determina que VMs podem consumir a reserva.
†O número de VMs representa a capacidade total de uma reserva. Ao decidir este valor, considere o número de VMs da tarefa.
Determine as propriedades da VM para a tarefa e a reserva. Devido às restrições, nem a tarefa nem a reserva podem especificar uma política de posicionamento compacta, que é a opção predefinida para reservas e tarefas. Determine os valores que quer usar para as seguintes propriedades de VM, que têm de corresponder exatamente à reserva e à tarefa:
- Projeto
- Zona*
- Tipo de máquina†
- Plataforma de CPU mínima† (se aplicável‡)
- Tipo e quantidade de GPU† (se aplicável‡)
- Tipo e quantidade de SSDs locais† (se existirem‡)
- Afinidade de reservas†#
*As VMs de tarefas têm de estar localizadas na mesma zona que as VMs reservadas. Tem de incluir esta zona no campo
allowedLocations[]
do trabalho ou, se omitir o campoallowedLocations[]
, definir a localização do trabalho para a região que contém esta zona.† A tarefa tem de definir todas estas propriedades através dos subcampos
policy
ou de um modelo de instância de VM. Uma tarefa não pode especificar uma combinação de subcampospolicy
e um modelo.‡ Não é possível definir um campo opcional para um recurso e omitir o mesmo para o outro. Defina ou omita o campo opcional para a reserva e a tarefa. Se a tarefa especificar um modelo de instância de VM, isto também se aplica aos campos do modelo especificado.
#O tipo de consumo da reserva determina a afinidade de reserva necessária para as VMs da tarefa, que tem de especificar na tarefa da seguinte forma:
- Se a tarefa estiver a usar um modelo de instância de VM, o modelo tem de configurar a afinidade de reserva, conforme explicado na documentação de reservas.
- Se a tarefa não estiver a usar um modelo e a reserva for especificamente segmentada, especifique o nome da reserva no campo
reservation
da tarefa. - Caso contrário, se a tarefa não estiver a usar um modelo e a reserva for consumida automaticamente, omita o campo
reservation
da tarefa.
Prepare a reserva. Se ainda não o fez, crie a reserva que quer que as VMs da tarefa consumam. Certifique-se de que a reserva tem as propriedades que planeou.
Crie e execute o trabalho. Pode criar e executar uma tarefa que consuma VMs da reserva preparada através da CLI gcloud ou da API Batch:
gcloud
Crie um ficheiro JSON que especifique os detalhes de configuração da tarefa que define os subcampos do recurso de instância de VM (
instances[]
) para corresponderem exatamente às propriedades de VM de uma reserva.Por exemplo, para criar uma tarefa de script básica que consuma VMs de uma reserva, crie um ficheiro JSON com o seguinte conteúdo:
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "echo Hello world from task ${BATCH_TASK_INDEX}" } } ] }, "taskCount": 3 } ], "allocationPolicy": { "instances": [ { VM_RESOURCES } ], }, "logsPolicy": { "destination": "CLOUD_LOGGING" } }
Substitua
VM_RESOURCES
pelos recursos de VM que correspondem à reserva que quer que a tarefa consuma especificando os subcamposinstances[]
que planeou nos passos anteriores.Por exemplo, comece pelo seguinte valor para
VM_RESOURCES
:"installGpuDrivers": INSTALL_GPU_DRIVERS, "policy": { "machineType": "MACHINE_TYPE", "minCpuPlatform": "MIN_CPU_PLATFORM", "accelerators": [ { "type": "GPU_TYPE", "count": GPU_COUNT } ], "disks": [ { "newDisk": { "sizeGb": LOCAL_SSD_SIZE, "type": "local-ssd" }, "deviceName": "LOCAL_SSD_NAME" } ], "reservation": "SPECIFIC_RESERVATION_NAME" }
Para usar este valor, faça todas as seguintes alterações:
Quer usar um modelo de instância?
Sim: substitua o campo
policy
pelo campoinstanceTemplate
e especifique um modelo de instância de VM existente que corresponda à reserva. Por exemplo, veja o exemplo de código para usar um modelo de instância de VM. Se a reserva usar GPUs ou SSDs locais, também tem de configurar o campoinstallGpuDrivers
do trabalho e o campovolumes[]
, respetivamente. Caso contrário, ignore as restantes alterações.Não: substitua
MACHINE_TYPE
pelo mesmo tipo de máquina que a reserva.
A reserva inclui uma plataforma de CPU mínima?
Sim: substitua
MIN_CPU_PLATFORM
pela mesma plataforma de CPU mínima.Não: remova o campo
minCpuPlatform
.
A reserva inclui GPUs?
Sim: substitua
INSTALL_GPU_DRIVERS
,GPU_TYPE
eGPU_COUNT
para corresponder à reserva. Por exemplo, consulte o exemplo de código para usar GPUs.Não: remova o campo
installGpuDrivers
e o campoaccelerators[]
.
A reserva inclui SSDs locais?
Sim: substitua
LOCAL_SSD_SIZE
eLOCAL_SSD_NAME
para corresponder à reserva e monte os SSDs locais adicionando o campovolumes[]
ao trabalho. Por exemplo, consulte o exemplo de código para usar SSDs locais.Não: remova o campo
disks[]
.
A reserva usa o tipo de consumo segmentado especificamente?
Sim: substitua
SPECIFIC_RESERVATION_NAME
pelo nome da reserva.Não: remova o campo
reservation
.
Por exemplo, suponha que está a usar uma reserva consumida automaticamente para
n2-standard-32
VMs que não especifica nenhuma plataforma de CPU mínima, GPUs ou SSDs locais. Além disso, não quer especificar um modelo de instância de VM. Nesse caso, tem de substituirVM_RESOURCES
pelo seguinte valor:"policy": { "machineType": "n2-standard-32" }
Para criar e executar a tarefa, use o comando
gcloud batch jobs submit
:gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILE
Substitua o seguinte:
JOB_NAME
: o nome da tarefa.LOCATION
: a localização do trabalho. A menos que a tarefa especifique o campoallowedLocations[]
, esta tem de ser a região que contém a zona da reserva.JSON_CONFIGURATION_FILE
: o caminho para um ficheiro JSON com os detalhes de configuração da tarefa.
API
Faça um pedido
POST
ao métodojobs.create
que define os subcampos do recurso de instância de VM (instances[]
) para corresponderem exatamente às propriedades de VM de uma reserva.Por exemplo, para criar uma tarefa de script básica que consuma VMs de uma reserva, faça o seguinte pedido:
POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME { "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "echo Hello world from task ${BATCH_TASK_INDEX}" } } ] }, "taskCount": 3 } ], "allocationPolicy": { "instances": [ { VM_RESOURCES } ], }, "logsPolicy": { "destination": "CLOUD_LOGGING" } }
Substitua o seguinte:
PROJECT_ID
: o ID do projeto do seu projeto.LOCATION
: a localização do trabalho. A menos que a tarefa especifique o campoallowedLocations[]
, esta tem de ser a região que contém a zona da reserva.JOB_NAME
: o nome da tarefa.VM_RESOURCES
: os recursos de VM que correspondem à reserva que quer que a tarefa consuma especificando os subcamposinstances[]
que planeou nos passos anteriores.Por exemplo, comece pelo seguinte valor para
VM_RESOURCES
:"installGpuDrivers": INSTALL_GPU_DRIVERS, "policy": { "machineType": "MACHINE_TYPE", "minCpuPlatform": "MIN_CPU_PLATFORM", "accelerators": [ { "type": "GPU_TYPE", "count": GPU_COUNT } ], "disks": [ { "newDisk": { "sizeGb": LOCAL_SSD_SIZE, "type": "local-ssd" }, "deviceName": "LOCAL_SSD_NAME" } ], "reservation": "SPECIFIC_RESERVATION_NAME" }
Para usar este valor, faça todas as seguintes alterações:
Quer usar um modelo de instância?
Sim: substitua o campo
policy
pelo campoinstanceTemplate
e especifique um modelo de instância de VM existente que corresponda à reserva. Por exemplo, veja o exemplo de código para usar um modelo de instância de VM. Se a reserva usar GPUs ou SSDs locais, também tem de configurar o campoinstallGpuDrivers
do trabalho e o campovolumes[]
, respetivamente. Caso contrário, ignore as restantes alterações.Não: substitua
MACHINE_TYPE
pelo mesmo tipo de máquina que a reserva.
A reserva inclui uma plataforma de CPU mínima?
Sim: substitua
MIN_CPU_PLATFORM
pela mesma plataforma de CPU mínima.Não: remova o campo
minCpuPlatform
.
A reserva inclui GPUs?
Sim: substitua
INSTALL_GPU_DRIVERS
,GPU_TYPE
eGPU_COUNT
para corresponder à reserva. Por exemplo, consulte o exemplo de código para usar GPUs.Não: remova o campo
installGpuDrivers
e o campoaccelerators[]
.
A reserva inclui SSDs locais?
Sim: substitua
LOCAL_SSD_SIZE
eLOCAL_SSD_NAME
para corresponder à reserva e monte os SSDs locais adicionando o campovolumes[]
ao trabalho. Por exemplo, consulte o exemplo de código para usar SSDs locais.Não: remova o campo
disks[]
.
A reserva usa o tipo de consumo segmentado especificamente?
Sim: substitua
SPECIFIC_RESERVATION_NAME
pelo nome da reserva.Não: remova o campo
reservation
.
Por exemplo, suponha que está a usar uma reserva consumida automaticamente para
n2-standard-32
VMs que não especifica nenhuma plataforma de CPU mínima, GPUs ou SSDs locais. Além disso, não quer especificar um modelo de instância de VM. Nesse caso, tem de substituirVM_RESOURCES
pelo seguinte valor:"policy": { "machineType": "n2-standard-32" }
Crie e execute uma tarefa que não possa consumir VMs reservadas
Para impedir que uma tarefa consuma reservas, defina o campo reservation
como NO_RESERVATION
. Para mais informações sobre como impedir o consumo de reservas, consulte o artigo
Impeça que as instâncias de computação consumam reservas
na documentação do Compute Engine.
Pode criar e executar uma tarefa que não possa consumir nenhuma VM reservada através da CLI gcloud ou da API Batch.
gcloud
Crie um ficheiro JSON que especifique os detalhes de configuração da tarefa e defina o campo
reservation
comoNO_RESERVATION
.Por exemplo, para criar uma tarefa de script básica que não possa consumir reservas, crie um ficheiro JSON com o seguinte conteúdo:
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "echo Hello world from task ${BATCH_TASK_INDEX}" } } ] }, "taskCount": 3 } ], "allocationPolicy": { "instances": [ { "policy": { "reservation": "NO_RESERVATION" } } ], }, "logsPolicy": { "destination": "CLOUD_LOGGING" } }
Para criar e executar a tarefa, use o comando
gcloud batch jobs submit
:gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILE
Substitua o seguinte:
JOB_NAME
: o nome da tarefa.LOCATION
: a localização do trabalho.JSON_CONFIGURATION_FILE
: o caminho para um ficheiro JSON com os detalhes de configuração da tarefa.
API
Faça um pedido POST
ao método jobs.create
que define o campo reservation
como NO_RESERVATION
.
Por exemplo, para criar uma tarefa de script básica que não possa consumir reservas, faça o seguinte pedido:
POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "echo Hello world from task ${BATCH_TASK_INDEX}"
}
}
]
},
"taskCount": 3
}
],
"allocationPolicy": {
"instances": [
{
"policy": {
"reservation": "NO_RESERVATION"
}
}
],
},
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
Substitua o seguinte:
PROJECT_ID
: o ID do projeto do seu projeto.LOCATION
: a localização do trabalho.JOB_NAME
: o nome da tarefa.
O que se segue?
- Se tiver problemas ao criar ou executar uma tarefa, consulte a secção Resolução de problemas.
- Ver empregos e tarefas.
- Saiba mais sobre as opções de criação de tarefas.