En este documento, se explica cómo crear trabajos que se ejecuten en recursos reservados y cómo evitar que los trabajos consuman reservas.
Las reservas son una función de Compute Engine. Una reserva proporciona un nivel de seguridad muy alto para obtener capacidad para una o más VMs con la configuración de hardware especificada. Una reserva para una VM genera los costos de esa VM desde el momento en que creas la reserva hasta que la borras. Sin embargo, mientras consumes esa VM, el costo total es equivalente al de una VM sin reserva.
En general, las reservas son útiles cuando la disponibilidad de capacidad es fundamental o para evitar errores al obtener recursos. En el caso de Batch específicamente, considera usar reservas dedicadas para minimizar el tiempo de programación de los trabajos o intenta usar las reservas existentes mientras no se estén usando. Si tienes reservas subutilizadas, como las que se requieren para los descuentos por compromiso de uso, puedes configurar trabajos para intentar consumirlas mientras no se usan y, así, optimizar los costos incurridos. Como alternativa, si deseas priorizar la disponibilidad de recursos para otras cargas de trabajo en tu proyecto, puedes bloquear explícitamente un trabajo para que no consuma reservas.
Si deseas obtener más información sobre las reservas, consulta la documentación de Compute Engine sobre las reservas.
Antes de comenzar
- Si nunca usaste Batch, revisa Cómo comenzar a usar Batch y habilita Batch completando los requisitos previos para proyectos y usuarios.
- Asegúrate de tener los permisos para crear una reserva o ver una reserva existente que desees que las VMs de un trabajo consuman según sea necesario.
-
Para obtener los permisos que necesitas para crear un trabajo, pídele a tu administrador que te otorgue los siguientes roles de IAM:
-
Editor de trabajos por lotes (
roles/batch.jobsEditor
) en el proyecto -
Usuario de cuenta de servicio (
roles/iam.serviceAccountUser
) en la cuenta de servicio del trabajo, que, de forma predeterminada, es la cuenta de servicio predeterminada de Compute Engine
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.
-
Editor de trabajos por lotes (
Restricciones
Además de las restricciones generales para las reservas, Batch también tiene las siguientes restricciones:
- Las VMs de un trabajo no pueden consumir reservas compartidas.
- Las VMs de un trabajo no pueden consumir reservas si alguna de ellas especifica una política de posición compacta.
- Si creas un trabajo con la consola de Google Cloud , sus VMs consumen automáticamente las reservas coincidentes. Para consumir una reserva específica o impedir que las VMs consuman reservas, debes definir el campo
reservation
cuando crees un trabajo con gcloud CLI o la API de Batch.
Requisitos
En esta sección, se resumen los requisitos para que las VMs de un trabajo consuman una reserva. Para obtener más información sobre todos los requisitos, consulta los requisitos generales para las reservas en la documentación de Compute Engine y el procedimiento para planificar tu configuración más adelante en este documento.
Para que las VMs de un trabajo sean capaces de consumir una reserva, se deben cumplir todas las siguientes condiciones:
El trabajo y la reserva deben especificar propiedades de VM que coincidan exactamente.
Debes cumplir con todas las restricciones de este documento y todos los demás requisitos generales para las reservas.
Para que cada VM de un trabajo consuma correctamente una reserva, esta debe tener capacidad sin usar disponible durante el tiempo de ejecución de la VM.
La capacidad no utilizada de una reserva es la diferencia entre la cantidad de VM y la cantidad de VMs que la consumen actualmente. Las VMs intentan consumir reservas siempre que tengas capacidad de reserva sin usar. Por lo tanto, una VM puede comenzar a consumir una reserva cuando se crea o más adelante durante su tiempo de ejecución. Una VM no deja de consumir una reserva hasta que deja de ejecutarse o se borra la reserva.
Según la capacidad total de reserva sin usar, es posible que ninguna, algunas o todas las VMs de un trabajo consuman reservas, y la cantidad de VMs reservadas puede variar durante el tiempo de ejecución del trabajo.
Crea y ejecuta un trabajo que pueda consumir VMs reservadas
Planifica tu configuración. Para asegurarte de que tu trabajo y tu reserva sean compatibles, completa los siguientes pasos.
Si deseas consumir una reserva que ya existe, debes crear un trabajo con la configuración correspondiente. De lo contrario, si planeas crear una reserva nueva, selecciona las opciones de configuración que prefieras.
Determina las propiedades de la reserva. Debido a las restricciones, el tipo de recurso compartido debe ser de un solo proyecto, que es la opción predeterminada para una reserva. Determina los valores que deseas usar para las siguientes propiedades de la reserva:
- Tipo de consumo*
- VM VMs†
*El tipo de consumo de la reserva (específicamente orientada o consumida automáticamente) determina qué VMs pueden consumir la reserva.
†El recuento de VMs representa la capacidad total de una reserva. Cuando decidas este valor, ten en cuenta la cantidad de VMs del trabajo.
Determina las propiedades de la VM para el trabajo y la reserva. Debido a las restricciones, ni el trabajo ni la reserva pueden especificar una política de posición compacta, que es la opción predeterminada para las reservas y los trabajos. Determina los valores que deseas usar para las siguientes propiedades de la VM, que deben coincidir exactamente para la reserva y el trabajo:
- Proyecto
- Zona*
- Tipo de máquina†
- Plataforma de CPU mínima† (si corresponde‡)
- Tipo y recuento de GPU† (si hay‡)
- Tipo y recuento de SSD locales† (si corresponde‡)
- Afinidad de reserva†#
*Las VM de trabajo deben estar ubicadas en la misma zona que las VMs reservadas. Debes incluir esta zona en el campo
allowedLocations[]
del trabajo o, si omites el campoallowedLocations[]
, establecer la ubicación del trabajo en la región que contiene esta zona.†El trabajo debe definir todas estas propiedades con los subcampos
policy
o una plantilla de instancias de VM. Un trabajo no puede especificar una combinación de subcampospolicy
y una plantilla.‡ No se puede definir un campo opcional para un recurso y omitirlo del otro. Define u omite el campo opcional tanto para la reserva como para el trabajo. Si el trabajo especifica una plantilla de instancias de VM, esto también se aplica a los campos de la plantilla especificada.
#El tipo de consumo de la reserva determina la afinidad de la reserva requerida para las VMs del trabajo, que debes especificar en el trabajo de la siguiente manera:
- Si el trabajo usa una plantilla de instancias de VM, la plantilla debe configurar la afinidad de la reserva como se explica en la documentación de reservas.
- Si el trabajo no usa una plantilla y la reserva está segmentada de forma específica, especifica el nombre de la reserva en el campo
reservation
del trabajo. - De lo contrario, si el trabajo no usa una plantilla y la reserva se consume automáticamente, omite el campo
reservation
del trabajo.
Prepara la reserva. Si aún no lo hiciste, crea la reserva que deseas que consuman las VMs del trabajo. Asegúrate de que la reserva tenga las propiedades que planeaste.
Crea y ejecuta el trabajo. Puedes crear y ejecutar un trabajo que consuma VMs de la reserva preparada con gcloud CLI o la API de Batch:
gcloud
Crea un archivo JSON que especifique los detalles de configuración del trabajo y establezca los subcampos del recurso de instancia de VM (
instances[]
) para que coincidan exactamente con las propiedades de la VM de una reserva.Por ejemplo, para crear un trabajo de secuencia de comandos básico que consuma VMs de una reserva, crea un archivo JSON con el siguiente contenido:
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "echo Hello world from task ${BATCH_TASK_INDEX}" } } ] }, "taskCount": 3 } ], "allocationPolicy": { "instances": [ { VM_RESOURCES } ], }, "logsPolicy": { "destination": "CLOUD_LOGGING" } }
Reemplaza
VM_RESOURCES
por los recursos de VM que coincidan con la reserva que deseas que consuma el trabajo. Para ello, especifica los subcamposinstances[]
que planificaste en los pasos anteriores.Por ejemplo, comienza con el siguiente 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, realiza todos los siguientes cambios:
¿Quieres usar una plantilla de instancias?
Sí: Reemplaza el campo
policy
por el campoinstanceTemplate
y especifica una plantilla de instancias de VM existente que coincida con la reserva. Por ejemplo, consulta el muestra de código para usar una plantilla de instancias de VM. Si la reserva usa GPUs o SSD locales, también debes configurar los camposinstallGpuDrivers
yvolumes[]
del trabajo, respectivamente. De lo contrario, omite los cambios restantes.No: Reemplaza
MACHINE_TYPE
por el mismo tipo de máquina que la reserva.
¿La reserva incluye una plataforma de CPU mínima?
Sí: Reemplaza
MIN_CPU_PLATFORM
por la misma plataforma de CPU mínima.No: Quita el campo
minCpuPlatform
.
¿La reserva incluye GPUs?
Sí: Reemplaza
INSTALL_GPU_DRIVERS
,GPU_TYPE
yGPU_COUNT
para que coincidan con la reserva. Por ejemplo, consulta el muestra de código para usar GPUs.No: Quita los campos
installGpuDrivers
yaccelerators[]
.
¿La reserva incluye SSD locales?
Sí: Reemplaza
LOCAL_SSD_SIZE
yLOCAL_SSD_NAME
para que coincidan con la reserva, y agrega el campovolumes[]
al trabajo para activar las SSD locales. Por ejemplo, consulta el muestra de código para usar SSD locales.No: Quita el campo
disks[]
.
¿La reserva usa el tipo de consumo con segmentación específica?
Sí: Reemplaza
SPECIFIC_RESERVATION_NAME
por el nombre de la reserva.No: Quita el campo
reservation
.
Por ejemplo, supongamos que usas una reserva consumida automáticamente para VMs de
n2-standard-32
que no especifica ninguna plataforma de CPU mínima, GPU ni SSD locales. Además, no deseas especificar una plantilla de instancias de VM. En ese caso, debes reemplazarVM_RESOURCES
por el siguiente valor:"policy": { "machineType": "n2-standard-32" }
Para crear y ejecutar el trabajo, usa el comando
gcloud batch jobs submit
:gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILE
Reemplaza lo siguiente:
JOB_NAME
: Es el nombre del trabajo.LOCATION
: La ubicación del trabajo. A menos que el trabajo especifique el campoallowedLocations[]
, esta debe ser la región que contiene la zona de la reserva.JSON_CONFIGURATION_FILE
: Es la ruta de acceso a un archivo JSON con los detalles de configuración del trabajo.
API
Realiza una solicitud
POST
al métodojobs.create
que establezca los subcampos del recurso de instancia de VM (instances[]
) para que coincidan exactamente con las propiedades de la VM de una reserva.Por ejemplo, para crear un trabajo de secuencia de comandos básico que consuma VMs de una reserva, realiza la siguiente solicitud:
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" } }
Reemplaza lo siguiente:
PROJECT_ID
: Es el ID del proyecto de tu proyecto.LOCATION
: La ubicación del trabajo. A menos que el trabajo especifique el campoallowedLocations[]
, esta debe ser la región que contiene la zona de la reserva.JOB_NAME
: Es el nombre del trabajo.VM_RESOURCES
: Son los recursos de VM que coinciden con la reserva que deseas que consuma el trabajo. Para ello, especifica los subcamposinstances[]
que planificaste en los pasos anteriores.Por ejemplo, comienza con el siguiente 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, realiza todos los siguientes cambios:
¿Quieres usar una plantilla de instancias?
Sí: Reemplaza el campo
policy
por el campoinstanceTemplate
y especifica una plantilla de instancias de VM existente que coincida con la reserva. Por ejemplo, consulta el muestra de código para usar una plantilla de instancias de VM. Si la reserva usa GPUs o SSD locales, también debes configurar los camposinstallGpuDrivers
yvolumes[]
del trabajo, respectivamente. De lo contrario, omite los cambios restantes.No: Reemplaza
MACHINE_TYPE
por el mismo tipo de máquina que la reserva.
¿La reserva incluye una plataforma de CPU mínima?
Sí: Reemplaza
MIN_CPU_PLATFORM
por la misma plataforma de CPU mínima.No: Quita el campo
minCpuPlatform
.
¿La reserva incluye GPUs?
Sí: Reemplaza
INSTALL_GPU_DRIVERS
,GPU_TYPE
yGPU_COUNT
para que coincidan con la reserva. Por ejemplo, consulta el muestra de código para usar GPUs.No: Quita los campos
installGpuDrivers
yaccelerators[]
.
¿La reserva incluye SSD locales?
Sí: Reemplaza
LOCAL_SSD_SIZE
yLOCAL_SSD_NAME
para que coincidan con la reserva, y agrega el campovolumes[]
al trabajo para activar las SSD locales. Por ejemplo, consulta el muestra de código para usar SSD locales.No: Quita el campo
disks[]
.
¿La reserva usa el tipo de consumo con segmentación específica?
Sí: Reemplaza
SPECIFIC_RESERVATION_NAME
por el nombre de la reserva.No: Quita el campo
reservation
.
Por ejemplo, supongamos que usas una reserva consumida automáticamente para VMs de
n2-standard-32
que no especifica ninguna plataforma de CPU mínima, GPU ni SSD locales. Además, no deseas especificar una plantilla de instancias de VM. En ese caso, debes reemplazarVM_RESOURCES
por el siguiente valor:"policy": { "machineType": "n2-standard-32" }
Crea y ejecuta un trabajo que no pueda consumir VMs reservadas
Para evitar que un trabajo consuma cualquier reserva, establece el campo reservation
en NO_RESERVATION
. Para obtener más información sobre cómo evitar el consumo de reservas, consulta Cómo evitar que las instancias de procesamiento consuman reservas en la documentación de Compute Engine.
Puedes crear y ejecutar un trabajo que no pueda consumir ninguna VM reservada con gcloud CLI o la API de Batch.
gcloud
Crea un archivo JSON que especifique los detalles de configuración del trabajo y establezca el campo
reservation
enNO_RESERVATION
.Por ejemplo, para crear un trabajo de secuencia de comandos básico que no pueda consumir reservas, crea un archivo JSON con el siguiente contenido:
{ "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 crear y ejecutar el trabajo, usa el comando
gcloud batch jobs submit
:gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILE
Reemplaza lo siguiente:
JOB_NAME
: Es el nombre del trabajo.LOCATION
: La ubicación del trabajo.JSON_CONFIGURATION_FILE
: Es la ruta de acceso a un archivo JSON con los detalles de configuración del trabajo.
API
Realiza una solicitud POST
al método jobs.create
que establezca el campo reservation
en NO_RESERVATION
.
Por ejemplo, para crear un trabajo de secuencia de comandos básico que no pueda consumir reservas, realiza la siguiente solicitud:
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"
}
}
Reemplaza lo siguiente:
PROJECT_ID
: Es el ID del proyecto de tu proyecto.LOCATION
: La ubicación del trabajo.JOB_NAME
: Es el nombre del trabajo.
¿Qué sigue?
- Si tienes problemas para crear o ejecutar un trabajo, consulta Solución de problemas.
- Ver trabajos y tareas
- Obtén más información sobre las opciones de creación de trabajos.