Cloud Batch — Primeiros passos

Bruno Patrocinio
google-cloud-brasil
8 min readApr 6, 2023

Introdução

Para esse e outros tutoriais do Google Cloud, você pode criar uma conta e receber US$ 300 em créditos para treinar! Saiba mais neste guia.

Ao criarmos aplicações, muitas vezes precisamos executar processos fora do ciclo de request/response dos usuários.

Podem ser processos que precisam ser executados de tempos em tempos (cron-jobs) ou até mesmo processos que são executados baseados em algum tipo de evento (batch-jobs).

Por exemplo: um redimensionamento de uma imagem/vídeo ou outras tarefas mais complexas sem afetar o tempo de resposta do usuário.

Lidar com este tipo de cenário pode, às vezes, envolver muitas tecnologias e integrações, deixando a arquitetura mais complexa, com cada vez mais componentes, aumentando os pontos onde podemos ter falhas.

Este artigo é parte de uma série onde abordaremos algumas maneiras de simplificar estes processos utilizando o novo serviço do Google Cloud: o Cloud Batch

Cloud Batch

O que é?

Serviço totalmente gerenciado para agendar, enfileirar e executar jobs em lote na infraestrutura do Google.

Cloud Batch no console do Google Cloud

Quais são suas principais características?

  • Suporte a scripts e cargas de trabalho conteinerizadas.
  • Provisionamento e escalonamento automático da capacidade, eliminando a necessidade de gerenciar soluções de terceiros.
  • Integração nativa ao Google Cloud para executar, escalonar e monitorar sua carga de trabalho.
  • Definição prioridades para os processamentos e estabelecimento de estratégias de repetição automáticas.
  • Redução dos custos de computação de cargas de trabalho com máquinas Spot

Quais são seus componentes?

  • Job: Um processamento que roda uma lista de ações — chamadas de tasks — sem nenhuma interação com o usuário. Por exemplo um shell script, um cálculo complexo de várias partes ou até mesmo a execução de um container.
  • Task: São as ações definidas como parte do Job, que são executadas sequencialmente ou em paralelo, dependendo das definições aplicadas.
  • Resource: A infraestrutura necessária para executar um Job. VMs do Compute Engine conforme especificações do Job. Podemos também adicionar GPUs, SSD e até mesmo mapear um Bucket do Cloud Storage como disco. Além disso, se você quer que as tarefas sejam executadas sequencialmente em uma VM ou simultaneamente em várias VMs.

Mas afinal, como posso utilizar o Cloud Batch?

Vamos lá! Hora de colocar em prática!

A partir de agora você irá criar um Batch job para transcodificar alguns vídeos armazenados dentro de um Bucket do Cloud Storage.

Iremos executar todos os passos utilizando o próprio Cloud Shell dentro do console do Google Cloud.

Para ativá-lo, basta clicar no ícone do cloud shell no canto superior direito.

Icone para ativar o cloud shell

Após o shell ser disponibilizado, a primeira atividade a fazer é criar um novo projeto, pois ao final desse tutorial, e se quisermos, podemos remover todos os recursos de uma só vez.

Para criar um novo projeto vamos utilizar o seguinte comando:

gcloud projects create [PROJECT_ID]

Substitua o [PROJECT_ID] por um de sua preferência, ele será o mesmo utilizado pelo resto deste artigo.

Para alterar o projeto default do gcloud, execute:

gcloud config set project [PROJECT_ID]

Um ponto importante: Garanta que o billing está ativo para o projeto. Saiba como verificar se o billing está ativo no projeto

Ativando a API do Batch

Precisamos ativar a API do Batch quando formos utilizá-la pela primeira vez em um projeto:

gcloud services enable batch.googleapis.com

Preparando o bucket no Cloud Storage

Vamos criar um novo bucket onde iremos armazenar os arquivos de origem a serem transcodificados e o script que será executado. Altere [BUCKET_NAME] para um nome de sua preferência.

gcloud storage buckets create gs://[BUCKET_NAME]

Os arquivos e scripts que vamos utilizar a partir de agora, estão neste repositório:

https://github.com/GoogleCloudPlatform/batch-samples

Vamos copiá-los para dentro do cloud shell e logo após vamos transferir para o bucket que acabamos de criar.

git clone https://github.com/GoogleCloudPlatform/batch-samples
cd transcoding

gsutil cp -R transcode.sh input gs://[BUCKET_NAME]

Seu bucket estará parecido com esta imagem, um arquivo .sh na raiz e uma pasta de nome input com 3 arquivos .mp4 que serão convertidos:

Arquivos copiados para dentro do bucket no Cloud Storage

O arquivo .sh tem o seguinte conteúdo para converter os vídeos:

sudo apt-get -y update
sudo apt-get -y install ffmpeg
dir=/mnt/disks/share
infile=$dir/input/video-$BATCH_TASK_INDEX.mp4
outfile=$dir/output/video-$BATCH_TASK_INDEX.webm
vopts=-c:v libvpx-vp9 -b:v 1800k -minrate 1500 -maxrate 1610
mkdir -p $dir/output
ffmpeg -i $infile $vopts -an $outfile

Definindo o Job

Vamos criar o job que irá encodar os arquivos de vídeo utilizando o codec VP9.

Iremos utilizar as seguintes especificações para esta task:

  • Vamos executar bash /mnt/disks/share/transcode.sh como tarefa
  • Cada tarefa exigirá 2 vCPU e 2GiB de memória
  • O máximo de tentativas será definido em duas.
  • O tempo de duração máximo será de 600 segundos
  • Vamos montar o [BUCKET_NAME] como um disco em /mnt/disks/share
  • Serão 3 tasks com esta especificação
  • Batch deverá executar no máximo duas tasks simultaneamente
  • A política de alocação estabelece que será utilizada uma máquina spot n2d-standard-4 para executar as tasks.

Nosso arquivo job.json* ficará assim:

{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "bash /mnt/disks/share/transcode.sh"
}
}
],
"computeResource": {
"cpuMilli": 2000,
"memoryMib": 2048
},
"volumes": [
{
"gcs": {
"remotePath": "[BUCKET_NAME]"
},
"mountPath": "/mnt/disks/share"
}
],
"maxRetryCount": 2,
"maxRunDuration": "600s"
},
"taskCount": 3,
"parallelism": 2
}
],
"allocationPolicy": {
"instances": [
{
"policy": {
"machineType": "n2d-standard-4",
"provisioningModel": "SPOT"
}
}
]
},
"labels": {
"department": "creative",
"env": "testing"
},
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}

* O arquivo já está no cloud shell, lembre-se de alterar o [BUCKET_NAME]

Enviando o Job

O seguinte comando irá enviar o job para o Batch, com o nome de transcoding utilizando as configurações que definimos no job.json

gcloud beta batch jobs submit transcode - location=us-central1 - config=job.json

O output do comando será algo parecido com este:

Job transcode-16b8b942-435e-4269-9ce1-52e0 was successfully submitted.
allocationPolicy:
instances:
- policy:
machineType: n2d-standard-4
provisioningModel: SPOT
labels:
batch-job-id: transcode
location:
allowedLocations:
- regions/us-central1
- zones/us-central1-a
- zones/us-central1-b
- zones/us-central1-c
- zones/us-central1-f
serviceAccount:
email: XX@developer.gserviceaccount.com
createTime: '2023-03-30T14:33:18.666888066Z'
labels:
department: creative
env: testing
logsPolicy:
destination: CLOUD_LOGGING
name: projects/project/locations/us-central1/jobs/transcode
status:
runDuration: 0s
state: QUEUED
taskGroups:
- name: projects/123/locations/us-central1/jobs/transcode/taskGroups/group0
parallelism: '2'
taskCount: '3'
taskSpec:
computeResource:
cpuMilli: '2000'
memoryMib: '2048'
maxRetryCount: 2
maxRunDuration: 600s
runnables:
- script:
text: bash /mnt/disks/share/transcode.sh
volumes:
- gcs:
remotePath: bucket
mountPath: /mnt/disks/share
uid: transcode-16b8b942-435e-4269-9ce1-52e0
updateTime: '2023-03-30T14:33:18.666888066Z'

O Job será exibido desta forma na console:

Job transcode no console do Google Cloud

Verificando o status do job

Podemos verificar o status do job de duas formas, uma é via o shell com o comando batch jobs describe

gcloud beta batch jobs describe transcode - location=us-central1

Se o state for como SCHEDULED, significa que o Batch está preparando os recursos para rodar o job.

Em alguns momentos o state mudará para RUNNING pois o Batch já terá terminando de inicializar a máquina virtual e irá executar as tasks que foram definidas no job.

allocationPolicy:
instances:
- policy:
machineType: n2d-standard-4
provisioningModel: SPOT
labels:
batch-job-id: transcode
location:
allowedLocations:
- regions/us-central1
- zones/us-central1-a
- zones/us-central1-b
- zones/us-central1-c
- zones/us-central1-f
serviceAccount:
email: compute@developer.gserviceaccount.com
createTime: '2023-03-31T12:11:35.226927424Z'
labels:
department: creative
env: testing
logsPolicy:
destination: CLOUD_LOGGING
name: projects/project/locations/us-central1/jobs/transcode
status:
runDuration: 235.604296628s
state: RUNNING
statusEvents:
- description: Job state is set from QUEUED to SCHEDULED for job projects/locations/us-central1/jobs/transcode.
eventTime: '2023-03-31T12:11:40.098677619Z'
type: STATUS_CHANGED
- description: Job state is set from SCHEDULED to RUNNING for job projects/locations/us-central1/jobs/transcode.
eventTime: '2023-03-31T12:13:23.389759311Z'
type: STATUS_CHANGED
taskGroups:
group0:
counts:
RUNNING: '1'
SUCCEEDED: '2'
instances:
- bootDisk:
image: projects/batch-custom-image/global/images/family/batch-debian-11-official
sizeGb: '30'
type: pd-ssd
machineType: n2d-standard-4
provisioningModel: SPOT
taskPack: '2'
taskGroups:
- name: projects/locations/us-central1/jobs/transcode/taskGroups/group0
parallelism: '2'
taskCount: '3'
taskSpec:
computeResource:
cpuMilli: '2000'
memoryMib: '2048'
maxRetryCount: 2
maxRunDuration: 600s
runnables:
- script:
text: bash /mnt/disks/share/transcode.sh
volumes:
- gcs:
remotePath: bucket
mountPath: /mnt/disks/share
uid: transcode-0c37b862-147a-4578-a742-17f0
updateTime: '2023-03-31T12:13:23.389759311Z'

Outra forma de visualizar o state é no próprio console do Batch, conforme a figura abaixo:

A coluna status é alterada conforme a etapa do Job

Verificando os log com o Cloud Logging

O job deve ser finalizado após cerca de 5 minutos, e nós conseguiremos ver o progresso olhando os logs no Cloud Logging.

Abra o Cloud Logging Console e inspecione os logs. Será exibido o output das tarefas e também o histórico de operação do Compute Engine gerenciado pelo Batch.

Será exibido algo mais ou menos assim:

Cloud logging exibindo todos os logs das atividades executadas

Via linha de comando, podemos também verificar se o job já foi finalizado:

gcloud beta batch jobs describe transcode - location=us-central1

O status ficará assim após o job ser completo corretamente:

status:
runDuration: 269.970424891s
state: SUCCEEDED
statusEvents:
- description: Job state is set from QUEUED to SCHEDULED for job projects/locations/us-central1/jobs/transcode.
eventTime: '2023-03-31T12:11:40.098677619Z'
type: STATUS_CHANGED
- description: Job state is set from SCHEDULED to RUNNING for job projects/locations/us-central1/jobs/transcode.
eventTime: '2023-03-31T12:13:23.389759311Z'
type: STATUS_CHANGED
- description: Job state is set from RUNNING to SUCCEEDED for job projects/locations/us-central1/jobs/transcode.
eventTime: '2023-03-31T12:17:53.360184202Z'
type: STATUS_CHANGED

Verificando os arquivos processados

Após processar os vídeos, o job armazenou os arquivos no mesmo Cloud Storage bucket. Para listar os objetos, podemos utilizar o seguinte comando:

gsutil ls -lR gs://[BUCKET_NAME]/output

Será exibido os arquivos de vídeo que foram encodados:

gs://[BUCKET_NAME]/output/:
0 2022-07-11T21:30:49Z gs://[BUCKET_NAME]/output/
832968 2022-07-11T21:34:20Z gs://[BUCKET_NAME]/output/video-0.webm
382292 2022-07-11T21:32:07Z gs://[BUCKET_NAME]/output/video-1.webm
469656 2022-07-11T21:34:27Z gs://[BUCKET_NAME]/output/video-2.webm
TOTAL: 4 objects, 1684916 bytes (1.61 MiB)

Também é possível visualizar os arquivos via Console

Deletando um job

Para deletar o job basta executar o seguinte comando:

gcloud beta batch jobs delete transcode - location=us-central1

Limpando tudo

O Batch automaticamente deleta as instâncias que criou para executar os jobs automaticamente, porém você ainda pode ser cobrado pelos arquivos que estiverem armazenados no Cloud Storage.

Por este motivo, iremos deletar o projeto para evitar quaisquer custos adicionais.

gcloud projects delete [PROJECT_ID]

Recap

Então é isso pessoal! Neste post você aprendeu como definir e executar um job no Batch. Parabéns!!!

Convido vocês a substituir algum processo assíncrono nos seus ambientes de testes pelo Cloud Batch, para testá-lo na prática e ver como ele pode te ajudar no dia-a-dia.

Nos próximos posts desta série iremos abordar ainda:

  • Como executar containers
  • Como adicionar GPU a um job
  • Como utilizar o Cloud Batch para HPC
  • Como agendar uma execução de job
  • Como orquestrar jobs via eventos como Cloud Workflows
  • Como provisionar tudo isso via Infra as a Code

Um abraço e até láaaaa!

--

--