Crear y ejecutar un trabajo que use volúmenes de almacenamiento

En este documento se explica cómo crear y ejecutar un trabajo por lotes que use uno o varios volúmenes de almacenamiento externo. Entre las opciones de almacenamiento externo se incluyen discos persistentes nuevos o ya creados, SSDs locales nuevos, segmentos de Cloud Storage ya creados y un sistema de archivos de red (NFS) ya creado, como un recurso compartido de archivos de Filestore.

Independientemente de si añades volúmenes de almacenamiento externo, cada VM de Compute Engine de un trabajo tiene un disco de arranque, que proporciona almacenamiento para la imagen y las instrucciones del sistema operativo del trabajo. Para obtener información sobre cómo configurar el disco de arranque de un trabajo, consulta la descripción general del entorno del SO de la VM.

Antes de empezar

  1. Si no has usado Batch antes, consulta el artículo Empezar a usar Batch y habilita Batch completando los requisitos previos para proyectos y usuarios.
  2. Para obtener los permisos que necesitas para crear un trabajo, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos:

    Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.

    También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.

Crear un trabajo que use volúmenes de almacenamiento

De forma opcional, un trabajo puede usar uno o varios volúmenes de almacenamiento externo de cada uno de los siguientes tipos. Para obtener más información sobre todos los tipos de volúmenes de almacenamiento, así como las diferencias y restricciones de cada uno, consulta la documentación sobre las opciones de almacenamiento de las VMs de Compute Engine.

Para permitir que un trabajo use cada volumen de almacenamiento, inclúyelo en la definición del trabajo y especifica su ruta de montaje (mountPath) en los elementos ejecutables. Para saber cómo crear un trabajo que use volúmenes de almacenamiento, consulta una o varias de las siguientes secciones:

Usar un disco persistente

Un trabajo que usa discos persistentes tiene las siguientes restricciones:

  • Todos los discos persistentes: consulte las restricciones de todos los discos persistentes.

  • Discos persistentes nuevos o ya creados: cada disco persistente de una tarea puede ser nuevo (definido y creado con la tarea) o ya creado (en tu proyecto y especificado en la tarea). Para usar un disco persistente, debe formatearse y montarse en las VMs del trabajo, que deben estar en la misma ubicación que el disco persistente. Batch monta los discos persistentes que incluyas en una tarea y formatea los discos persistentes nuevos, pero debes formatear y desmontar los discos persistentes que quieras que use una tarea.

    Las opciones de ubicación, opciones de formato y opciones de montaje varían entre los discos persistentes nuevos y los que ya existen, tal como se describe en la siguiente tabla:

    Nuevos discos persistentes Discos persistentes disponibles
    Opciones de formato

    El disco persistente se formatea automáticamente con un ext4sistema de archivos.

    Debes formatear el disco persistente para usar un sistema de archivos ext4 antes de usarlo en un trabajo.

    Opciones de montaje

    Se admiten todas las opciones.

    Se admiten todas las opciones excepto la escritura. Esto se debe a las restricciones del modo de varios escritores.

    Debes desasociar el disco persistente de las VMs a las que esté asociado antes de usarlo en una tarea.

    Opciones de ubicación

    Solo puedes crear discos persistentes zonales.

    Puedes seleccionar cualquier ubicación para tu trabajo. Los discos persistentes se crean en la zona en la que se ejecuta tu proyecto.

    Puedes seleccionar discos persistentes regionales y de zona.


    Debes definir la ubicación de la tarea (o, si se especifica, solo las ubicaciones permitidas de la tarea) en solo las ubicaciones que contengan todos los discos persistentes de la tarea. Por ejemplo, en el caso de un disco persistente zonal, la ubicación de la tarea debe ser la zona del disco. En el caso de un disco persistente regional, la ubicación de la tarea debe ser la región del disco o, si se especifican zonas, una o ambas zonas específicas en las que se encuentre el disco persistente regional.

  • Plantillas de instancia: si quieres usar una plantilla de instancia de VM al crear este trabajo, debes adjuntar los discos persistentes de este trabajo a la plantilla de instancia. De lo contrario, si no quieres usar una plantilla de instancia, debes adjuntar los discos persistentes directamente en la definición del trabajo.

Puedes crear un trabajo que use un disco persistente mediante laGoogle Cloud consola, la CLI de gcloud, la API de Batch, C++, Go, Java, Node.js o Python.

Consola

En el siguiente ejemplo se usa la Google Cloud consola para crear un trabajo que ejecuta una secuencia de comandos para leer un archivo de un disco persistente zonal que se encuentra en la zona us-central1-a. La secuencia de comandos de ejemplo da por hecho que el trabajo tiene un disco persistente zonal que contiene un archivo de texto llamado example.txt en el directorio raíz.

Opcional: Crea un disco persistente de zona de ejemplo

Si quieres crear un disco persistente zonal que puedas usar para ejecutar el script de ejemplo, haz lo siguiente antes de crear el trabajo:

  1. Adjunta un disco persistente nuevo y vacío llamado example-disk a una VM de Linux en la zona us-central1-a y, a continuación, ejecuta comandos en la VM para formatear y montar el disco. Para obtener instrucciones, consulta Añadir un disco persistente a tu máquina virtual.

    No te desconectes de la VM todavía.

  2. Para crear example.txt en el disco persistente, ejecuta los siguientes comandos en la VM:

    1. Para cambiar el directorio de trabajo actual al directorio raíz del disco persistente, escribe el siguiente comando:

      cd VM_MOUNT_PATH
      

      Sustituye VM_MOUNT_PATH por la ruta del directorio en el que se ha montado el disco persistente en esta VM en el paso anterior (por ejemplo, /mnt/disks/example-disk).

    2. Pulsa Enter.

    3. Para crear y definir un archivo llamado example.txt, escribe el siguiente comando:

      cat > example.txt
      
    4. Pulsa Enter.

    5. Escribe el contenido del archivo. Por ejemplo, escribe Hello world!.

    6. Para guardar el archivo, pulsa Ctrl+D (o Command+D en macOS).

    Cuando hayas terminado, puedes desconectarte de la VM.

  3. Desvincula el disco persistente de la VM.

    • Si ya no necesitas la VM, puedes eliminarla, lo que desconectará automáticamente el disco persistente.

    • De lo contrario, desvincula el disco persistente. Para obtener instrucciones, consulta Desvincular y volver a vincular discos de arranque y desvincula el disco persistente example-disk en lugar del disco de arranque de la VM.

Crea un trabajo que use el disco persistente zonal

Para crear un trabajo que use discos persistentes zonales con laGoogle Cloud consola, sigue estos pasos:

  1. En la Google Cloud consola, ve a la página Lista de tareas.

    Ir a la lista de tareas

  2. Haz clic en Crear. Se abrirá la página Crear tarea por lotes. En el panel de la izquierda, se selecciona la página Detalles de la tarea.

  3. Configura la página Detalles del empleo:

    1. Opcional: En el campo Nombre del trabajo, personaliza el nombre del trabajo.

      Por ejemplo, escribe example-disk-job.

    2. Configura la sección Detalles de la tarea:

      1. En la ventana Nuevo ejecutable, añade al menos una secuencia de comandos o un contenedor para que se ejecute este trabajo.

        Por ejemplo, para ejecutar una secuencia de comandos que imprima el contenido de un archivo llamado example.txt que se encuentre en el directorio raíz del disco persistente que usa este trabajo, haz lo siguiente:

        1. Seleccione la casilla Secuencia de comandos. Aparecerá un cuadro de texto.

        2. En el cuadro de texto, introduce la siguiente secuencia de comandos:

          echo "Here is the content of the example.txt file in the persistent disk."
          cat MOUNT_PATH/example.txt
          

          Sustituye MOUNT_PATH por la ruta a la que quieras montar el disco persistente en las VMs de este trabajo (por ejemplo, /mnt/disks/example-disk).

        3. Haz clic en Listo.

      2. En el campo Número de tareas, introduce el número de tareas de este trabajo.

        Por ejemplo, introduce 1 (valor predeterminado).

      3. En el campo Paralelismo, introduce el número de tareas que se van a ejecutar simultáneamente.

        Por ejemplo, introduce 1 (valor predeterminado).

  4. Configura la página Especificaciones de recursos:

    1. En el panel de la izquierda, haga clic en Especificaciones de recursos. Se abrirá la página Especificaciones de los recursos.

    2. Selecciona la ubicación de este trabajo. Para usar un disco persistente zonal, las VMs de un trabajo deben estar en la misma zona.

      1. En el campo Región, selecciona una región.

        Por ejemplo, para usar el disco persistente zonal de ejemplo, selecciona us-central1 (Iowa) (opción predeterminada).

      2. En el campo Zona, selecciona una zona.

        Por ejemplo, selecciona us-central1-a (Iowa).

  5. Configura la página Configuraciones adicionales:

    1. En el panel de la izquierda, haz clic en Configuraciones adicionales. Se abrirá la página Configuraciones adicionales.

    2. Para cada disco persistente zonal que quieras montar en esta tarea, haz lo siguiente:

      1. En la sección Volumen de almacenamiento, haz clic en Añadir nuevo volumen. Aparecerá la ventana Nuevo volumen.

      2. En la ventana Nuevo volumen, haz lo siguiente:

        1. En la sección Tipo de volumen, selecciona Disco persistente (opción predeterminada).

        2. En la lista Disco, selecciona un disco persistente zonal que quieras montar en este trabajo. El disco debe estar en la misma zona que este trabajo.

          Por ejemplo, selecciona el disco persistente zonal que has preparado, que se encuentra en la zona us-central1-a y contiene el archivo example.txt.

        3. Opcional: Si quieres cambiar el nombre de este disco persistente de zona, haz lo siguiente:

          1. Selecciona Personalizar el nombre del dispositivo.

          2. En el campo Nombre del dispositivo, introduce el nuevo nombre del disco.

        4. En el campo Ruta de montaje, introduce la ruta de montaje (MOUNT_PATH) de este disco persistente:

          Por ejemplo, introduce lo siguiente:

          /mnt/disks/EXISTING_PERSISTENT_DISK_NAME
          

          Sustituye EXISTING_PERSISTENT_DISK_NAME por el nombre del disco. Si has cambiado el nombre del disco persistente zonal, usa el nuevo nombre.

          Por ejemplo, sustituya EXISTING_PERSISTENT_DISK_NAME por example-disk.

        5. Haz clic en Listo.

  6. Opcional: Configura los otros campos de este trabajo.

  7. Opcional: Para revisar la configuración del trabajo, en el panel de la izquierda, haz clic en Vista previa.

  8. Haz clic en Crear.

En la página Detalles de la tarea se muestra la tarea que has creado.

gcloud

Con la CLI de gcloud, en el siguiente ejemplo se crea un trabajo que adjunta y monta un disco persistente y un disco persistente nuevos. El trabajo tiene 3 tareas que ejecutan una secuencia de comandos para crear un archivo en el nuevo disco persistente llamado output_task_TASK_INDEX.txt donde TASK_INDEX es el índice de cada tarea: 0, 1 y 2.

Para crear un trabajo que use discos persistentes con la CLI de gcloud, usa el comando gcloud batch jobs submit. En el archivo de configuración JSON del trabajo, especifica los discos persistentes en el campo instances y monta el disco persistente en el campo volumes.

  1. Crea un archivo JSON.

    • Si no usas una plantilla de instancia para este trabajo, crea un archivo JSON con el siguiente contenido:

      {
          "allocationPolicy": {
              "instances": [
                  {
                      "policy": {
                          "disks": [
                              {
                                  "deviceName": "EXISTING_PERSISTENT_DISK_NAME",
                                  "existingDisk": "projects/PROJECT_ID/EXISTING_PERSISTENT_DISK_LOCATION/disks/EXISTING_PERSISTENT_DISK_NAME"
                              },
                              {
                                  "newDisk": {
                                      "sizeGb": NEW_PERSISTENT_DISK_SIZE,
                                      "type": "NEW_PERSISTENT_DISK_TYPE"
                                  },
                                  "deviceName": "NEW_PERSISTENT_DISK_NAME"
                              }
                          ]
                      }
                  }
              ],
              "location": {
                  "allowedLocations": [
                      "EXISTING_PERSISTENT_DISK_LOCATION"
                  ]
              }
          },
          "taskGroups": [
              {
                  "taskSpec": {
                      "runnables": [
                          {
                              "script": {
                                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}. >> /mnt/disks/NEW_PERSISTENT_DISK_NAME/output_task_${BATCH_TASK_INDEX}.txt"
                              }
                          }
                      ],
                      "volumes": [
                          {
                              "deviceName": "NEW_PERSISTENT_DISK_NAME",
                              "mountPath": "/mnt/disks/NEW_PERSISTENT_DISK_NAME",
                              "mountOptions": "rw,async"
                          },
                          {
      
                              "deviceName": "EXISTING_PERSISTENT_DISK_NAME",
                              "mountPath": "/mnt/disks/EXISTING_PERSISTENT_DISK_NAME"
                          }
                      ]
                  },
                  "taskCount":3
              }
          ],
          "logsPolicy": {
              "destination": "CLOUD_LOGGING"
          }
      }
      

      Haz los cambios siguientes:

      • PROJECT_ID: el ID de proyecto de tu proyecto.
      • EXISTING_PERSISTENT_DISK_NAME: el nombre de un disco persistente.
      • EXISTING_PERSISTENT_DISK_LOCATION: la ubicación de un disco persistente. En el caso de los discos persistentes zonales, la ubicación de la tarea debe ser la zona del disco. En el caso de los discos persistentes regionales, la ubicación de la tarea debe ser la región del disco o, si se especifican zonas, una o ambas zonas concretas en las que se encuentre el disco persistente regional. Si no especificas ningún disco persistente, puedes seleccionar cualquier ubicación. Más información sobre el campo allowedLocations
      • NEW_PERSISTENT_DISK_SIZE: tamaño del nuevo disco persistente en GB. Los tamaños permitidos dependen del tipo de disco persistente, pero el mínimo suele ser de 10 GB (10) y el máximo, de 64 TB (64000).
      • NEW_PERSISTENT_DISK_TYPE: el tipo de disco del nuevo disco persistente, que puede ser pd-standard, pd-balanced, pd-ssd o pd-extreme. El tipo de disco predeterminado para los discos persistentes que no son de arranque es pd-standard.
      • NEW_PERSISTENT_DISK_NAME: el nombre del nuevo disco persistente.
    • Si utilizas una plantilla de instancia de VM para este trabajo, crea un archivo JSON como se ha indicado anteriormente, pero sustituye el campo instances por lo siguiente:

      "instances": [
          {
              "instanceTemplate": "INSTANCE_TEMPLATE_NAME"
          }
      ],
      

      donde INSTANCE_TEMPLATE_NAME es el nombre de la plantilla de instancia de este trabajo. En el caso de las tareas que usan discos persistentes, esta plantilla de instancia debe definir y adjuntar los discos persistentes que quieras que use la tarea. En este ejemplo, la plantilla debe definir y adjuntar un nuevo disco persistente llamado NEW_PERSISTENT_DISK_NAME y adjuntar un disco persistente llamado EXISTING_PERSISTENT_DISK_NAME.

  2. Ejecuta el siguiente comando:

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    Haz los cambios siguientes:

    • JOB_NAME: el nombre del puesto.

    • LOCATION: la ubicación del puesto.

    • JSON_CONFIGURATION_FILE: la ruta de un archivo JSON con los detalles de configuración del trabajo.

API

En el siguiente ejemplo se usa la API por lotes para crear un trabajo que adjunta y monta un disco persistente y un disco persistente nuevo. El trabajo tiene 3 tareas que ejecutan una secuencia de comandos para crear un archivo en el nuevo disco persistente llamado output_task_TASK_INDEX.txt, donde TASK_INDEX es el índice de cada tarea: 0, 1 y 2.

Para crear un trabajo que use discos persistentes con la API Batch, usa el método jobs.create. En la solicitud, especifica los discos persistentes en el campo instances y monta el disco persistente en el campo volumes.

  • Si no utilizas una plantilla de instancia para este trabajo, haz la siguiente solicitud:

    POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
    
    {
        "allocationPolicy": {
            "instances": [
                {
                    "policy": {
                        "disks": [
                            {
                                "deviceName": "EXISTING_PERSISTENT_DISK_NAME",
                                "existingDisk": "projects/PROJECT_ID/EXISTING_PERSISTENT_DISK_LOCATION/disks/EXISTING_PERSISTENT_DISK_NAME"
                            },
                            {
                                "newDisk": {
                                    "sizeGb": NEW_PERSISTENT_DISK_SIZE,
                                    "type": "NEW_PERSISTENT_DISK_TYPE"
                                },
                                "deviceName": "NEW_PERSISTENT_DISK_NAME"
                            }
                        ]
                    }
                }
            ],
            "location": {
                "allowedLocations": [
                    "EXISTING_PERSISTENT_DISK_LOCATION"
                ]
            }
        },
        "taskGroups": [
            {
                "taskSpec": {
                    "runnables": [
                        {
                            "script": {
                                "text": "echo Hello world from task ${BATCH_TASK_INDEX}. >> /mnt/disks/NEW_PERSISTENT_DISK_NAME/output_task_${BATCH_TASK_INDEX}.txt"
                            }
                        }
                    ],
                    "volumes": [
                        {
                            "deviceName": "NEW_PERSISTENT_DISK_NAME",
                            "mountPath": "/mnt/disks/NEW_PERSISTENT_DISK_NAME",
                            "mountOptions": "rw,async"
                        },
                        {
    
                            "deviceName": "EXISTING_PERSISTENT_DISK_NAME",
                            "mountPath": "/mnt/disks/EXISTING_PERSISTENT_DISK_NAME"
                        }
                    ]
                },
                "taskCount":3
            }
        ],
        "logsPolicy": {
            "destination": "CLOUD_LOGGING"
        }
    }
    

    Haz los cambios siguientes:

    • PROJECT_ID: el ID de proyecto de tu proyecto.
    • LOCATION: la ubicación del puesto.
    • JOB_NAME: el nombre del puesto.
    • EXISTING_PERSISTENT_DISK_NAME: el nombre de un disco persistente.
    • EXISTING_PERSISTENT_DISK_LOCATION: la ubicación de un disco persistente. En el caso de los discos persistentes zonales, la ubicación de la tarea debe ser la zona del disco. En el caso de los discos persistentes regionales, la ubicación de la tarea debe ser la región del disco o, si se especifican zonas, una o ambas zonas concretas en las que se encuentre el disco persistente regional. Si no especificas ningún disco persistente, puedes seleccionar cualquier ubicación. Más información sobre el campo allowedLocations
    • NEW_PERSISTENT_DISK_SIZE: tamaño del nuevo disco persistente en GB. Los tamaños permitidos dependen del tipo de disco persistente, pero el mínimo suele ser de 10 GB (10) y el máximo, de 64 TB (64000).
    • NEW_PERSISTENT_DISK_TYPE: el tipo de disco del nuevo disco persistente, que puede ser pd-standard, pd-balanced, pd-ssd o pd-extreme. El tipo de disco predeterminado para los discos persistentes que no son de arranque es pd-standard.
    • NEW_PERSISTENT_DISK_NAME: el nombre del nuevo disco persistente.
  • Si utilizas una plantilla de instancia de VM para este trabajo, crea un archivo JSON como se ha indicado anteriormente, pero sustituye el campo instances por lo siguiente:

    "instances": [
        {
            "instanceTemplate": "INSTANCE_TEMPLATE_NAME"
        }
    ],
    ...
    

    Donde INSTANCE_TEMPLATE_NAME es el nombre de la plantilla de instancia de este trabajo. En el caso de las tareas que usan discos persistentes, esta plantilla de instancia debe definir y adjuntar los discos persistentes que quieras que use la tarea. En este ejemplo, la plantilla debe definir y adjuntar un nuevo disco persistente llamado NEW_PERSISTENT_DISK_NAME y adjuntar un disco persistente llamado EXISTING_PERSISTENT_DISK_NAME.

C++

Para crear un trabajo por lotes que use discos persistentes nuevos o ya creados con las bibliotecas de cliente de Cloud para C++, usa la función CreateJob e incluye lo siguiente:

  • Para asociar discos persistentes a las VMs de un trabajo, incluye una de las siguientes opciones:
    • Si no usas una plantilla de instancia de VM para este trabajo, usa el método set_remote_path.
    • Si usas una plantilla de instancia de VM para esta tarea, utiliza el método set_instance_template.
  • Para montar los discos persistentes en el trabajo, usa el campo volumes con los campos deviceName y mountPath. En el caso de los discos persistentes nuevos, también debes usar el campo mountOptions para habilitar la escritura.

Para ver un ejemplo de código de un caso de uso similar, consulta Usar un segmento de Cloud Storage.

Go

Para crear un trabajo por lotes que use discos persistentes nuevos o actuales con las bibliotecas de cliente de Cloud para Go, usa la función CreateJob e incluye lo siguiente:

import (
	"context"
	"fmt"
	"io"

	batch "cloud.google.com/go/batch/apiv1"
	"cloud.google.com/go/batch/apiv1/batchpb"
	durationpb "google.golang.org/protobuf/types/known/durationpb"
)

// Creates and runs a job with persistent disk
func createJobWithPD(w io.Writer, projectID, jobName, pdName string) error {
	// jobName := job-name
	// pdName := disk-name
	ctx := context.Background()
	batchClient, err := batch.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("batchClient error: %w", err)
	}
	defer batchClient.Close()

	runn := &batchpb.Runnable{
		Executable: &batchpb.Runnable_Script_{
			Script: &batchpb.Runnable_Script{
				Command: &batchpb.Runnable_Script_Text{
					Text: "echo Hello world from script 1 for task ${BATCH_TASK_INDEX}",
				},
			},
		},
	}
	volume := &batchpb.Volume{
		MountPath: fmt.Sprintf("/mnt/disks/%v", pdName),
		Source: &batchpb.Volume_DeviceName{
			DeviceName: pdName,
		},
	}

	// The disk type of the new persistent disk, either pd-standard,
	// pd-balanced, pd-ssd, or pd-extreme. For Batch jobs, the default is pd-balanced
	disk := &batchpb.AllocationPolicy_Disk{
		Type:   "pd-balanced",
		SizeGb: 10,
	}

	taskSpec := &batchpb.TaskSpec{
		ComputeResource: &batchpb.ComputeResource{
			// CpuMilli is milliseconds per cpu-second. This means the task requires 1 CPU.
			CpuMilli:  1000,
			MemoryMib: 16,
		},
		MaxRunDuration: &durationpb.Duration{
			Seconds: 3600,
		},
		MaxRetryCount: 2,
		Runnables:     []*batchpb.Runnable{runn},
		Volumes:       []*batchpb.Volume{volume},
	}

	taskGroups := []*batchpb.TaskGroup{
		{
			TaskCount: 4,
			TaskSpec:  taskSpec,
		},
	}

	labels := map[string]string{"env": "testing", "type": "container"}

	// Policies are used to define on what kind of virtual machines the tasks will run on.
	// Read more about local disks here: https://cloud.google.com/compute/docs/disks/persistent-disks
	allocationPolicy := &batchpb.AllocationPolicy{
		Instances: []*batchpb.AllocationPolicy_InstancePolicyOrTemplate{{
			PolicyTemplate: &batchpb.AllocationPolicy_InstancePolicyOrTemplate_Policy{
				Policy: &batchpb.AllocationPolicy_InstancePolicy{
					MachineType: "n1-standard-1",
					Disks: []*batchpb.AllocationPolicy_AttachedDisk{
						{
							Attached: &batchpb.AllocationPolicy_AttachedDisk_NewDisk{
								NewDisk: disk,
							},
							DeviceName: pdName,
						},
					},
				},
			},
		}},
	}

	// We use Cloud Logging as it's an out of the box available option
	logsPolicy := &batchpb.LogsPolicy{
		Destination: batchpb.LogsPolicy_CLOUD_LOGGING,
	}

	job := &batchpb.Job{
		Name:             jobName,
		TaskGroups:       taskGroups,
		AllocationPolicy: allocationPolicy,
		Labels:           labels,
		LogsPolicy:       logsPolicy,
	}

	request := &batchpb.CreateJobRequest{
		Parent: fmt.Sprintf("projects/%s/locations/%s", projectID, "us-central1"),
		JobId:  jobName,
		Job:    job,
	}

	created_job, err := batchClient.CreateJob(ctx, request)
	if err != nil {
		return fmt.Errorf("unable to create job: %w", err)
	}

	fmt.Fprintf(w, "Job created: %v\n", created_job)
	return nil
}

Java

Para crear un trabajo de Batch que use discos persistentes nuevos o ya creados con las bibliotecas de cliente de Cloud para Java, usa la clase CreateJobRequest e incluye lo siguiente:

  • Para asociar discos persistentes a las VMs de un trabajo, incluye una de las siguientes opciones:
    • Si no usas una plantilla de instancia de VM para este trabajo, incluye el método setDisks.
    • Si vas a usar una plantilla de instancia de VM para este trabajo, incluye el método setInstanceTemplate.
  • Para montar los discos persistentes en el trabajo, usa la clase Volume con los métodos setDeviceName y setMountPath. En el caso de los discos persistentes nuevos, también debes usar el método setMountOptions para habilitar la escritura.

Por ejemplo, usa el siguiente código de muestra:


import com.google.cloud.batch.v1.AllocationPolicy;
import com.google.cloud.batch.v1.AllocationPolicy.AttachedDisk;
import com.google.cloud.batch.v1.AllocationPolicy.Disk;
import com.google.cloud.batch.v1.AllocationPolicy.InstancePolicy;
import com.google.cloud.batch.v1.AllocationPolicy.InstancePolicyOrTemplate;
import com.google.cloud.batch.v1.AllocationPolicy.LocationPolicy;
import com.google.cloud.batch.v1.BatchServiceClient;
import com.google.cloud.batch.v1.CreateJobRequest;
import com.google.cloud.batch.v1.Job;
import com.google.cloud.batch.v1.LogsPolicy;
import com.google.cloud.batch.v1.Runnable;
import com.google.cloud.batch.v1.Runnable.Script;
import com.google.cloud.batch.v1.TaskGroup;
import com.google.cloud.batch.v1.TaskSpec;
import com.google.cloud.batch.v1.Volume;
import com.google.common.collect.Lists;
import com.google.protobuf.Duration;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreatePersistentDiskJob {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Google Cloud project you want to use.
    String projectId = "YOUR_PROJECT_ID";
    // Name of the region you want to use to run the job. Regions that are
    // available for Batch are listed on: https://cloud.google.com/batch/docs/get-started#locations
    String region = "europe-central2";
    // The name of the job that will be created.
    // It needs to be unique for each project and region pair.
    String jobName = "JOB_NAME";
    // The size of the new persistent disk in GB.
    // The allowed sizes depend on the type of persistent disk,
    // but the minimum is often 10 GB (10) and the maximum is often 64 TB (64000).
    int diskSize = 10;
    // The name of the new persistent disk.
    String newPersistentDiskName = "DISK-NAME";
    // The name of an existing persistent disk.
    String existingPersistentDiskName = "EXISTING-DISK-NAME";
    // The location of an existing persistent disk. For more info :
    // https://cloud.google.com/batch/docs/create-run-job-storage#gcloud
    String location = "regions/us-central1";
    // The disk type of the new persistent disk, either pd-standard,
    // pd-balanced, pd-ssd, or pd-extreme. For Batch jobs, the default is pd-balanced.
    String newDiskType = "pd-balanced";

    createPersistentDiskJob(projectId, region, jobName, newPersistentDiskName,
            diskSize, existingPersistentDiskName, location, newDiskType);
  }

  // Creates a job that attaches and mounts an existing persistent disk and a new persistent disk
  public static Job createPersistentDiskJob(String projectId, String region, String jobName,
                                            String newPersistentDiskName, int diskSize,
                                            String existingPersistentDiskName,
                                            String location, String newDiskType)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (BatchServiceClient batchServiceClient = BatchServiceClient.create()) {
      // Define what will be done as part of the job.
      String text = "echo Hello world from task ${BATCH_TASK_INDEX}. "
              + ">> /mnt/disks/NEW_PERSISTENT_DISK_NAME/output_task_${BATCH_TASK_INDEX}.txt";
      Runnable runnable =
          Runnable.newBuilder()
              .setScript(
                  Script.newBuilder()
                      .setText(text)
                      // You can also run a script from a file. Just remember, that needs to be a
                      // script that's already on the VM that will be running the job.
                      // Using setText() and setPath() is mutually exclusive.
                      // .setPath("/tmp/test.sh")
                      .build())
              .build();

      TaskSpec task = TaskSpec.newBuilder()
              // Jobs can be divided into tasks. In this case, we have only one task.
              .addAllVolumes(volumes(newPersistentDiskName, existingPersistentDiskName))
              .addRunnables(runnable)
              .setMaxRetryCount(2)
              .setMaxRunDuration(Duration.newBuilder().setSeconds(3600).build())
              .build();

      // Tasks are grouped inside a job using TaskGroups.
      // Currently, it's possible to have only one task group.
      TaskGroup taskGroup = TaskGroup.newBuilder()
          .setTaskCount(3)
          .setParallelism(1)
          .setTaskSpec(task)
          .build();

      // Policies are used to define the type of virtual machines the tasks will run on.
      InstancePolicy policy = InstancePolicy.newBuilder()
              .addAllDisks(attachedDisks(newPersistentDiskName, diskSize, newDiskType,
                  projectId, location, existingPersistentDiskName))
              .build();

      AllocationPolicy allocationPolicy =
          AllocationPolicy.newBuilder()
              .addInstances(
                  InstancePolicyOrTemplate.newBuilder()
                      .setPolicy(policy))
                  .setLocation(LocationPolicy.newBuilder().addAllowedLocations(location))
              .build();

      Job job =
          Job.newBuilder()
              .addTaskGroups(taskGroup)
              .setAllocationPolicy(allocationPolicy)
              .putLabels("env", "testing")
              .putLabels("type", "script")
              // We use Cloud Logging as it's an out-of-the-box option.
              .setLogsPolicy(
                  LogsPolicy.newBuilder().setDestination(LogsPolicy.Destination.CLOUD_LOGGING))
              .build();

      CreateJobRequest createJobRequest =
          CreateJobRequest.newBuilder()
              // The job's parent is the region in which the job will run.
              .setParent(String.format("projects/%s/locations/%s", projectId, region))
              .setJob(job)
              .setJobId(jobName)
              .build();

      Job result =
          batchServiceClient
              .createJobCallable()
              .futureCall(createJobRequest)
              .get(5, TimeUnit.MINUTES);

      System.out.printf("Successfully created the job: %s", result.getName());

      return result;
    }
  }

  // Creates link to existing disk and creates configuration for new disk
  private static Iterable<AttachedDisk> attachedDisks(String newPersistentDiskName, int diskSize,
                                                      String newDiskType, String projectId,
                                                      String existingPersistentDiskLocation,
                                                      String existingPersistentDiskName) {
    AttachedDisk newDisk = AttachedDisk.newBuilder()
            .setDeviceName(newPersistentDiskName)
            .setNewDisk(Disk.newBuilder().setSizeGb(diskSize).setType(newDiskType))
            .build();

    String diskPath = String.format("projects/%s/%s/disks/%s", projectId,
            existingPersistentDiskLocation, existingPersistentDiskName);

    AttachedDisk existingDisk = AttachedDisk.newBuilder()
            .setDeviceName(existingPersistentDiskName)
            .setExistingDisk(diskPath)
            .build();

    return Lists.newArrayList(existingDisk, newDisk);
  }

  // Describes a volume and parameters for it to be mounted to a VM.
  private static Iterable<Volume> volumes(String newPersistentDiskName,
                                          String existingPersistentDiskName) {
    Volume newVolume = Volume.newBuilder()
            .setDeviceName(newPersistentDiskName)
            .setMountPath("/mnt/disks/" + newPersistentDiskName)
            .addMountOptions("rw")
            .addMountOptions("async")
            .build();

    Volume existingVolume = Volume.newBuilder()
            .setDeviceName(existingPersistentDiskName)
            .setMountPath("/mnt/disks/" + existingPersistentDiskName)
            .build();

    return Lists.newArrayList(newVolume, existingVolume);
  }
}

Node.js

Para crear un trabajo por lotes que use discos persistentes nuevos o ya creados con las bibliotecas de cliente de Cloud para Node.js, usa el método createJob e incluye lo siguiente:

  • Para asociar discos persistentes a las VMs de un trabajo, incluye una de las siguientes opciones:
  • Para montar los discos persistentes en la tarea, usa la clase Volume con las propiedades deviceName y mountPath. En el caso de los discos persistentes nuevos, también debes usar la propiedad mountOptions para habilitar la escritura.
// Imports the Batch library
const batchLib = require('@google-cloud/batch');
const batch = batchLib.protos.google.cloud.batch.v1;

// Instantiates a client
const batchClient = new batchLib.v1.BatchServiceClient();

/**
 * TODO(developer): Update these variables before running the sample.
 */
// Project ID or project number of the Google Cloud project you want to use.
const projectId = await batchClient.getProjectId();
// The name of the job that will be created.
// It needs to be unique for each project and region pair.
const jobName = 'batch-create-persistent-disk-job';
// Name of the region you want to use to run the job. Regions that are
// available for Batch are listed on: https://cloud.google.com/batch/docs/get-started#locations
const region = 'europe-central2';
// The name of an existing persistent disk.
const existingPersistentDiskName = 'existing-persistent-disk-name';
// The name of the new persistent disk.
const newPersistentDiskName = 'new-persistent-disk-name';
// The size of the new persistent disk in GB.
// The allowed sizes depend on the type of persistent disk,
// but the minimum is often 10 GB (10) and the maximum is often 64 TB (64000).
const diskSize = 10;
// The location of an existing persistent disk. For more info :
// https://cloud.google.com/batch/docs/create-run-job-storage#gcloud
const location = 'regions/us-central1';
// The disk type of the new persistent disk, either pd-standard,
// pd-balanced, pd-ssd, or pd-extreme. For Batch jobs, the default is pd-balanced.
const newDiskType = 'pd-balanced';

// Define what will be done as part of the job.
const runnable = new batch.Runnable({
  script: new batch.Runnable.Script({
    commands: [
      '-c',
      'echo Hello world! This is task ${BATCH_TASK_INDEX}.' +
        '>> /mnt/disks/NEW_PERSISTENT_DISK_NAME/output_task_${BATCH_TASK_INDEX}.txt',
    ],
  }),
});

// Define volumes and their parameters to be mounted to a VM.
const newVolume = new batch.Volume({
  deviceName: newPersistentDiskName,
  mountPath: `/mnt/disks/${newPersistentDiskName}`,
  mountOptions: ['rw', 'async'],
});

const existingVolume = new batch.Volume({
  deviceName: existingPersistentDiskName,
  mountPath: `/mnt/disks/${existingPersistentDiskName}`,
});

const task = new batch.TaskSpec({
  runnables: [runnable],
  volumes: [newVolume, existingVolume],
  maxRetryCount: 2,
  maxRunDuration: {seconds: 3600},
});

// Tasks are grouped inside a job using TaskGroups.
const group = new batch.TaskGroup({
  taskCount: 3,
  taskSpec: task,
});

const newDisk = new batch.AllocationPolicy.Disk({
  type: newDiskType,
  sizeGb: diskSize,
});

// Policies are used to define on what kind of virtual machines the tasks will run on.
// Read more about local disks here: https://cloud.google.com/compute/docs/disks/persistent-disks
const instancePolicy = new batch.AllocationPolicy.InstancePolicy({
  disks: [
    // Create configuration for new disk
    new batch.AllocationPolicy.AttachedDisk({
      deviceName: newPersistentDiskName,
      newDisk,
    }),
    // Create link to existing disk
    new batch.AllocationPolicy.AttachedDisk({
      existingDisk: `projects/${projectId}/${location}/disks/${existingPersistentDiskName}`,
      deviceName: existingPersistentDiskName,
    }),
  ],
});

const locationPolicy = new batch.AllocationPolicy.LocationPolicy({
  allowedLocations: [location],
});

const allocationPolicy = new batch.AllocationPolicy.InstancePolicyOrTemplate({
  instances: [{policy: instancePolicy}],
  location: locationPolicy,
});

const job = new batch.Job({
  name: jobName,
  taskGroups: [group],
  labels: {env: 'testing', type: 'script'},
  allocationPolicy,
  // We use Cloud Logging as it's an option available out of the box
  logsPolicy: new batch.LogsPolicy({
    destination: batch.LogsPolicy.Destination.CLOUD_LOGGING,
  }),
});
// The job's parent is the project and region in which the job will run
const parent = `projects/${projectId}/locations/${region}`;

async function callCreateBatchPersistentDiskJob() {
  // Construct request
  const request = {
    parent,
    jobId: jobName,
    job,
  };

  // Run request
  const [response] = await batchClient.createJob(request);
  console.log(JSON.stringify(response));
}

await callCreateBatchPersistentDiskJob();

Python

Para crear un trabajo por lotes que use discos persistentes nuevos o ya creados con las bibliotecas de cliente de Cloud para Python, usa la función CreateJob e incluye lo siguiente:

  • Para asociar discos persistentes a las VMs de un trabajo, incluye una de las siguientes opciones:
    • Si no usas una plantilla de instancia de VM para este trabajo, incluye la clase AttachedDisk.
    • Si vas a usar una plantilla de instancia de VM para este trabajo, incluye el atributo instance_template.
  • Para montar los discos persistentes en el trabajo, usa la clase Volume con los atributos device_name y mount_path. En el caso de los discos persistentes nuevos, también debes usar el atributo mount_options para habilitar la escritura.

Por ejemplo, usa el siguiente código de muestra:

from google.cloud import batch_v1


def create_with_pd_job(
    project_id: str,
    region: str,
    job_name: str,
    disk_name: str,
    zone: str,
    existing_disk_name=None,
) -> batch_v1.Job:
    """
    This method shows how to create a sample Batch Job that will run
    a simple command on Cloud Compute instances with mounted persistent disk.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        region: name of the region you want to use to run the job. Regions that are
            available for Batch are listed on: https://cloud.google.com/batch/docs/get-started#locations
        job_name: the name of the job that will be created.
            It needs to be unique for each project and region pair.
        disk_name: name of the disk to be mounted for your Job.
        existing_disk_name(optional): existing disk name, which you want to attach to a job

    Returns:
        A job object representing the job created.
    """
    client = batch_v1.BatchServiceClient()

    # Define what will be done as part of the job.
    task = batch_v1.TaskSpec()
    runnable = batch_v1.Runnable()
    runnable.script = batch_v1.Runnable.Script()
    runnable.script.text = (
        "echo Hello world from task ${BATCH_TASK_INDEX}. >> /mnt/disks/"
        + disk_name
        + "/output_task_${BATCH_TASK_INDEX}.txt"
    )
    task.runnables = [runnable]
    task.max_retry_count = 2
    task.max_run_duration = "3600s"

    volume = batch_v1.Volume()
    volume.device_name = disk_name
    volume.mount_path = f"/mnt/disks/{disk_name}"
    task.volumes = [volume]

    if existing_disk_name:
        volume2 = batch_v1.Volume()
        volume2.device_name = existing_disk_name
        volume2.mount_path = f"/mnt/disks/{existing_disk_name}"
        task.volumes.append(volume2)

    # Tasks are grouped inside a job using TaskGroups.
    # Currently, it's possible to have only one task group.
    group = batch_v1.TaskGroup()
    group.task_count = 4
    group.task_spec = task

    disk = batch_v1.AllocationPolicy.Disk()
    # The disk type of the new persistent disk, either pd-standard,
    # pd-balanced, pd-ssd, or pd-extreme. For Batch jobs, the default is pd-balanced
    disk.type_ = "pd-balanced"
    disk.size_gb = 10

    # Policies are used to define on what kind of virtual machines the tasks will run on.
    # Read more about local disks here: https://cloud.google.com/compute/docs/disks/persistent-disks
    policy = batch_v1.AllocationPolicy.InstancePolicy()
    policy.machine_type = "n1-standard-1"

    attached_disk = batch_v1.AllocationPolicy.AttachedDisk()
    attached_disk.new_disk = disk
    attached_disk.device_name = disk_name
    policy.disks = [attached_disk]

    if existing_disk_name:
        attached_disk2 = batch_v1.AllocationPolicy.AttachedDisk()
        attached_disk2.existing_disk = (
            f"projects/{project_id}/zones/{zone}/disks/{existing_disk_name}"
        )
        attached_disk2.device_name = existing_disk_name
        policy.disks.append(attached_disk2)

    instances = batch_v1.AllocationPolicy.InstancePolicyOrTemplate()
    instances.policy = policy

    allocation_policy = batch_v1.AllocationPolicy()
    allocation_policy.instances = [instances]

    location = batch_v1.AllocationPolicy.LocationPolicy()
    location.allowed_locations = [f"zones/{zone}"]
    allocation_policy.location = location

    job = batch_v1.Job()
    job.task_groups = [group]
    job.allocation_policy = allocation_policy
    job.labels = {"env": "testing", "type": "script"}

    create_request = batch_v1.CreateJobRequest()
    create_request.job = job
    create_request.job_id = job_name
    # The job's parent is the region in which the job will run
    create_request.parent = f"projects/{project_id}/locations/{region}"

    return client.create_job(create_request)

Usar un SSD local

Un trabajo que usa SSDs locales tiene las siguientes restricciones:

Puedes crear un trabajo que use un SSD local con la CLI de gcloud, la API Batch, Java o Python. En el siguiente ejemplo se describe cómo crear un trabajo que cree, adjunte y monte un SSD local. El trabajo también tiene 3 tareas que ejecutan una secuencia de comandos para crear un archivo en el SSD local llamado output_task_TASK_INDEX.txt, donde TASK_INDEX es el índice de cada tarea: 0, 1 y 2.

gcloud

Para crear un trabajo que use SSDs locales con la CLI de gcloud, usa el comando gcloud batch jobs submit. En el archivo de configuración JSON del trabajo, crea y adjunta los SSDs locales en el campo instances y monta los SSDs locales en el campo volumes.

  1. Crea un archivo JSON.

    • Si no usas una plantilla de instancia para este trabajo, crea un archivo JSON con el siguiente contenido:

      {
          "allocationPolicy": {
              "instances": [
                  {
                      "policy": {
                          "machineType": MACHINE_TYPE,
                          "disks": [
                              {
                                  "newDisk": {
                                      "sizeGb": LOCAL_SSD_SIZE,
                                      "type": "local-ssd"
                                  },
                                  "deviceName": "LOCAL_SSD_NAME"
                              }
                          ]
                      }
                  }
              ]
          },
          "taskGroups": [
              {
                  "taskSpec": {
                      "runnables": [
                          {
                              "script": {
                                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}. >> /mnt/disks/LOCAL_SSD_NAME/output_task_${BATCH_TASK_INDEX}.txt"
                              }
                          }
                      ],
                      "volumes": [
                          {
                              "deviceName": "LOCAL_SSD_NAME",
                              "mountPath": "/mnt/disks/LOCAL_SSD_NAME",
                              "mountOptions": "rw,async"
                          }
                      ]
                  },
                  "taskCount":3
              }
          ],
          "logsPolicy": {
              "destination": "CLOUD_LOGGING"
          }
      }
      

      Haz los cambios siguientes:

      • MACHINE_TYPE: el tipo de máquina, que puede ser predefinido o personalizado, de las VMs del trabajo. El número permitido de SSDs locales depende del tipo de máquina de las VMs de tu trabajo.
      • LOCAL_SSD_NAME: nombre de una SSD local creada para este trabajo.
      • LOCAL_SSD_SIZE: tamaño de todos los SSD locales en GB. Cada SSD local tiene 375 GB, por lo que este valor debe ser un múltiplo de 375 GB. Por ejemplo, si tienes 2 SSD locales, asigna el valor 750 GB.
    • Si utilizas una plantilla de instancia de VM para este trabajo, crea un archivo JSON como se ha indicado anteriormente, pero sustituye el campo instances por lo siguiente:

      "instances": [
          {
              "instanceTemplate": "INSTANCE_TEMPLATE_NAME"
          }
      ],
      

      donde INSTANCE_TEMPLATE_NAME es el nombre de la plantilla de instancia de este trabajo. En el caso de los trabajos que usan SSDs locales, esta plantilla de instancia debe definir y adjuntar los SSDs locales que quieras que use el trabajo. En este ejemplo, la plantilla debe definir y adjuntar un SSD local llamado LOCAL_SSD_NAME.

  2. Ejecuta el siguiente comando:

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    Haz los cambios siguientes:

    • JOB_NAME: el nombre del puesto.
    • LOCATION: la ubicación del puesto.
    • JSON_CONFIGURATION_FILE: la ruta de un archivo JSON con los detalles de configuración del trabajo.

API

Para crear un trabajo que use SSDs locales con la API Batch, usa el método jobs.create. En la solicitud, crea y adjunta los SSD locales en el campo instances y monta los SSD locales en el campo volumes.

  • Si no utilizas una plantilla de instancia para este trabajo, haz la siguiente solicitud:

    POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
    
    {
        "allocationPolicy": {
            "instances": [
                {
                    "policy": {
                        "machineType": MACHINE_TYPE,
                        "disks": [
                            {
                                "newDisk": {
                                    "sizeGb": LOCAL_SSD_SIZE,
                                    "type": "local-ssd"
                                },
                                "deviceName": "LOCAL_SSD_NAME"
                            }
                        ]
                    }
                }
            ]
        },
        "taskGroups": [
            {
                "taskSpec": {
                    "runnables": [
                        {
                            "script": {
                                "text": "echo Hello world from task ${BATCH_TASK_INDEX}. >> /mnt/disks/LOCAL_SSD_NAME/output_task_${BATCH_TASK_INDEX}.txt"
                            }
                        }
                    ],
                    "volumes": [
                        {
                            "deviceName": "LOCAL_SSD_NAME",
                            "mountPath": "/mnt/disks/LOCAL_SSD_NAME",
                            "mountOptions": "rw,async"
                        }
                    ]
                },
                "taskCount":3
            }
        ],
        "logsPolicy": {
            "destination": "CLOUD_LOGGING"
        }
    }
    

    Haz los cambios siguientes:

    • PROJECT_ID: el ID de proyecto de tu proyecto.
    • LOCATION: la ubicación del puesto.
    • JOB_NAME: el nombre del puesto.
    • MACHINE_TYPE: el tipo de máquina, que puede ser predefinido o personalizado, de las VMs del trabajo. El número permitido de SSDs locales depende del tipo de máquina de las VMs de tu trabajo.
    • LOCAL_SSD_NAME: nombre de una SSD local creada para este trabajo.
    • LOCAL_SSD_SIZE: tamaño de todos los SSD locales en GB. Cada SSD local tiene 375 GB, por lo que este valor debe ser un múltiplo de 375 GB. Por ejemplo, si tienes 2 SSD locales, asigna el valor 750 GB.
  • Si utilizas una plantilla de instancia de VM para este trabajo, crea un archivo JSON como se ha indicado anteriormente, pero sustituye el campo instances por lo siguiente:

    "instances": [
        {
            "instanceTemplate": "INSTANCE_TEMPLATE_NAME"
        }
    ],
    ...
    

    Donde INSTANCE_TEMPLATE_NAME es el nombre de la plantilla de instancia de este trabajo. En el caso de los trabajos que usan SSDs locales, esta plantilla de instancia debe definir y adjuntar los SSDs locales que quieras que use el trabajo. En este ejemplo, la plantilla debe definir y adjuntar un SSD local llamado LOCAL_SSD_NAME.

Go

import (
	"context"
	"fmt"
	"io"

	batch "cloud.google.com/go/batch/apiv1"
	"cloud.google.com/go/batch/apiv1/batchpb"
	durationpb "google.golang.org/protobuf/types/known/durationpb"
)

// Creates and runs a job with local SSD
// Note: local SSD does not guarantee Local SSD data persistence.
// More details here: https://cloud.google.com/compute/docs/disks/local-ssd#data_persistence
func createJobWithSSD(w io.Writer, projectID, jobName, ssdName string) error {
	// jobName := job-name
	// ssdName := disk-name
	ctx := context.Background()
	batchClient, err := batch.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("batchClient error: %w", err)
	}
	defer batchClient.Close()

	runn := &batchpb.Runnable{
		Executable: &batchpb.Runnable_Script_{
			Script: &batchpb.Runnable_Script{
				Command: &batchpb.Runnable_Script_Text{
					Text: "echo Hello world from script 1 for task ${BATCH_TASK_INDEX}",
				},
			},
		},
	}
	volume := &batchpb.Volume{
		MountPath: fmt.Sprintf("/mnt/disks/%v", ssdName),
		Source: &batchpb.Volume_DeviceName{
			DeviceName: ssdName,
		},
	}

	// The size of all the local SSDs in GB. Each local SSD is 375 GB,
	// so this value must be a multiple of 375 GB.
	// For example, for 2 local SSDs, set this value to 750 GB.
	disk := &batchpb.AllocationPolicy_Disk{
		Type:   "local-ssd",
		SizeGb: 375,
	}

	taskSpec := &batchpb.TaskSpec{
		ComputeResource: &batchpb.ComputeResource{
			// CpuMilli is milliseconds per cpu-second. This means the task requires 1 CPU.
			CpuMilli:  1000,
			MemoryMib: 16,
		},
		MaxRunDuration: &durationpb.Duration{
			Seconds: 3600,
		},
		MaxRetryCount: 2,
		Runnables:     []*batchpb.Runnable{runn},
		Volumes:       []*batchpb.Volume{volume},
	}

	taskGroups := []*batchpb.TaskGroup{
		{
			TaskCount: 4,
			TaskSpec:  taskSpec,
		},
	}

	labels := map[string]string{"env": "testing", "type": "container"}

	allocationPolicy := &batchpb.AllocationPolicy{
		Instances: []*batchpb.AllocationPolicy_InstancePolicyOrTemplate{{
			PolicyTemplate: &batchpb.AllocationPolicy_InstancePolicyOrTemplate_Policy{
				Policy: &batchpb.AllocationPolicy_InstancePolicy{
					// The allowed number of local SSDs depends on the machine type for your job's VMs.
					// In this case, we tell the system to use "n1-standard-1" machine type, which require to attach local ssd manually.
					// Read more about local disks here: https://cloud.google.com/compute/docs/disks/local-ssd#lssd_disk_options
					MachineType: "n1-standard-1",
					Disks: []*batchpb.AllocationPolicy_AttachedDisk{
						{
							Attached: &batchpb.AllocationPolicy_AttachedDisk_NewDisk{
								NewDisk: disk,
							},
							DeviceName: ssdName,
						},
					},
				},
			},
		}},
	}

	// We use Cloud Logging as it's an out of the box available option
	logsPolicy := &batchpb.LogsPolicy{
		Destination: batchpb.LogsPolicy_CLOUD_LOGGING,
	}

	job := &batchpb.Job{
		Name:             jobName,
		TaskGroups:       taskGroups,
		AllocationPolicy: allocationPolicy,
		Labels:           labels,
		LogsPolicy:       logsPolicy,
	}

	request := &batchpb.CreateJobRequest{
		Parent: fmt.Sprintf("projects/%s/locations/%s", projectID, "us-central1"),
		JobId:  jobName,
		Job:    job,
	}

	created_job, err := batchClient.CreateJob(ctx, request)
	if err != nil {
		return fmt.Errorf("unable to create job: %w", err)
	}

	fmt.Fprintf(w, "Job created: %v\n", created_job)
	return nil
}

Java


import com.google.cloud.batch.v1.AllocationPolicy;
import com.google.cloud.batch.v1.AllocationPolicy.AttachedDisk;
import com.google.cloud.batch.v1.AllocationPolicy.Disk;
import com.google.cloud.batch.v1.AllocationPolicy.InstancePolicy;
import com.google.cloud.batch.v1.AllocationPolicy.InstancePolicyOrTemplate;
import com.google.cloud.batch.v1.BatchServiceClient;
import com.google.cloud.batch.v1.CreateJobRequest;
import com.google.cloud.batch.v1.Job;
import com.google.cloud.batch.v1.LogsPolicy;
import com.google.cloud.batch.v1.Runnable;
import com.google.cloud.batch.v1.Runnable.Script;
import com.google.cloud.batch.v1.TaskGroup;
import com.google.cloud.batch.v1.TaskSpec;
import com.google.cloud.batch.v1.Volume;
import com.google.protobuf.Duration;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateLocalSsdJob {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Google Cloud project you want to use.
    String projectId = "YOUR_PROJECT_ID";
    // Name of the region you want to use to run the job. Regions that are
    // available for Batch are listed on: https://cloud.google.com/batch/docs/get-started#locations
    String region = "europe-central2";
    // The name of the job that will be created.
    // It needs to be unique for each project and region pair.
    String jobName = "JOB_NAME";
    // The name of a local SSD created for this job.
    String localSsdName = "SSD-NAME";
    // The machine type, which can be predefined or custom, of the job's VMs.
    // The allowed number of local SSDs depends on the machine type
    // for your job's VMs are listed on: https://cloud.google.com/compute/docs/disks#localssds
    String machineType = "c3d-standard-8-lssd";
    // The size of all the local SSDs in GB. Each local SSD is 375 GB,
    // so this value must be a multiple of 375 GB.
    // For example, for 2 local SSDs, set this value to 750 GB.
    int ssdSize = 375;

    createLocalSsdJob(projectId, region, jobName, localSsdName, ssdSize, machineType);
  }

  // Create a job that uses local SSDs
  public static Job createLocalSsdJob(String projectId, String region, String jobName,
                                      String localSsdName, int ssdSize, String machineType)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (BatchServiceClient batchServiceClient = BatchServiceClient.create()) {
      // Define what will be done as part of the job.
      Runnable runnable =
          Runnable.newBuilder()
              .setScript(
                  Script.newBuilder()
                      .setText(
                          "echo Hello world! This is task ${BATCH_TASK_INDEX}. "
                                  + "This job has a total of ${BATCH_TASK_COUNT} tasks.")
                      // You can also run a script from a file. Just remember, that needs to be a
                      // script that's already on the VM that will be running the job.
                      // Using setText() and setPath() is mutually exclusive.
                      // .setPath("/tmp/test.sh")
                      .build())
              .build();

      Volume volume = Volume.newBuilder()
          .setDeviceName(localSsdName)
          .setMountPath("/mnt/disks/" + localSsdName)
          .addMountOptions("rw")
          .addMountOptions("async")
          .build();

      TaskSpec task = TaskSpec.newBuilder()
          // Jobs can be divided into tasks. In this case, we have only one task.
          .addVolumes(volume)
          .addRunnables(runnable)
          .setMaxRetryCount(2)
          .setMaxRunDuration(Duration.newBuilder().setSeconds(3600).build())
          .build();

      // Tasks are grouped inside a job using TaskGroups.
      // Currently, it's possible to have only one task group.
      TaskGroup taskGroup = TaskGroup.newBuilder()
          .setTaskCount(3)
          .setParallelism(1)
          .setTaskSpec(task)
          .build();

      // Policies are used to define on what kind of virtual machines the tasks will run on.
      InstancePolicy policy = InstancePolicy.newBuilder()
          .setMachineType(machineType)
          .addDisks(AttachedDisk.newBuilder()
              .setDeviceName(localSsdName)
              // For example, local SSD uses type "local-ssd".
              // Persistent disks and boot disks use "pd-balanced", "pd-extreme", "pd-ssd"
              // or "pd-standard".
              .setNewDisk(Disk.newBuilder().setSizeGb(ssdSize).setType("local-ssd")))
          .build();

      AllocationPolicy allocationPolicy =
          AllocationPolicy.newBuilder()
              .addInstances(
                  InstancePolicyOrTemplate.newBuilder()
                      .setPolicy(policy)
                      .build())
              .build();

      Job job =
          Job.newBuilder()
              .addTaskGroups(taskGroup)
              .setAllocationPolicy(allocationPolicy)
              .putLabels("env", "testing")
              .putLabels("type", "script")
              // We use Cloud Logging as it's an out of the box available option.
              .setLogsPolicy(
                  LogsPolicy.newBuilder().setDestination(LogsPolicy.Destination.CLOUD_LOGGING))
              .build();

      CreateJobRequest createJobRequest =
          CreateJobRequest.newBuilder()
              // The job's parent is the region in which the job will run.
              .setParent(String.format("projects/%s/locations/%s", projectId, region))
              .setJob(job)
              .setJobId(jobName)
              .build();

      Job result =
          batchServiceClient
              .createJobCallable()
              .futureCall(createJobRequest)
              .get(5, TimeUnit.MINUTES);

      System.out.printf("Successfully created the job: %s", result.getName());

      return result;
    }
  }
}

Node.js

// Imports the Batch library
const batchLib = require('@google-cloud/batch');
const batch = batchLib.protos.google.cloud.batch.v1;

// Instantiates a client
const batchClient = new batchLib.v1.BatchServiceClient();

/**
 * TODO(developer): Update these variables before running the sample.
 */
// Project ID or project number of the Google Cloud project you want to use.
const projectId = await batchClient.getProjectId();
// Name of the region you want to use to run the job. Regions that are
// available for Batch are listed on: https://cloud.google.com/batch/docs/get-started#locations
const region = 'europe-central2';
// The name of the job that will be created.
// It needs to be unique for each project and region pair.
const jobName = 'batch-local-ssd-job';
// The name of a local SSD created for this job.
const localSsdName = 'ssd-name';
// The machine type, which can be predefined or custom, of the job's VMs.
// The allowed number of local SSDs depends on the machine type
// for your job's VMs are listed on: https://cloud.google.com/compute/docs/disks#localssds
const machineType = 'c3d-standard-8-lssd';
// The size of all the local SSDs in GB. Each local SSD is 375 GB,
// so this value must be a multiple of 375 GB.
// For example, for 2 local SSDs, set this value to 750 GB.
const ssdSize = 375;

// Define what will be done as part of the job.
const runnable = new batch.Runnable({
  script: new batch.Runnable.Script({
    commands: [
      '-c',
      'echo Hello world! This is task ${BATCH_TASK_INDEX}. This job has a total of ${BATCH_TASK_COUNT} tasks.',
    ],
  }),
});

const task = new batch.TaskSpec({
  runnables: [runnable],
  maxRetryCount: 2,
  maxRunDuration: {seconds: 3600},
});

// Tasks are grouped inside a job using TaskGroups.
const group = new batch.TaskGroup({
  taskCount: 3,
  taskSpec: task,
});

// Policies are used to define on what kind of virtual machines the tasks will run on.
const instancePolicy = new batch.AllocationPolicy.InstancePolicy({
  machineType,
  disks: [
    new batch.AllocationPolicy.AttachedDisk({
      deviceName: localSsdName,
      // For example, local SSD uses type "local-ssd".
      // Persistent disks and boot disks use "pd-balanced", "pd-extreme", "pd-ssd"
      // or "pd-standard".
      newDisk: new batch.AllocationPolicy.AttachedDisk({
        type: 'local-ssd',
        sizeGb: ssdSize,
      }),
    }),
  ],
});

const allocationPolicy = new batch.AllocationPolicy.InstancePolicyOrTemplate({
  instances: [{policy: instancePolicy}],
});

const job = new batch.Job({
  name: jobName,
  taskGroups: [group],
  labels: {env: 'testing', type: 'script'},
  allocationPolicy,
  // We use Cloud Logging as it's an option available out of the box
  logsPolicy: new batch.LogsPolicy({
    destination: batch.LogsPolicy.Destination.CLOUD_LOGGING,
  }),
});
// The job's parent is the project and region in which the job will run
const parent = `projects/${projectId}/locations/${region}`;

async function callCreateBatchGPUJob() {
  // Construct request
  const request = {
    parent,
    jobId: jobName,
    job,
  };

  // Run request
  const [response] = await batchClient.createJob(request);
  console.log(JSON.stringify(response));
}

await callCreateBatchGPUJob();

Python

from google.cloud import batch_v1


def create_local_ssd_job(
    project_id: str, region: str, job_name: str, ssd_name: str
) -> batch_v1.Job:
    """
    This method shows how to create a sample Batch Job that will run
    a simple command on Cloud Compute instances with mounted local SSD.
    Note: local SSD does not guarantee Local SSD data persistence.
    More details here: https://cloud.google.com/compute/docs/disks/local-ssd#data_persistence

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        region: name of the region you want to use to run the job. Regions that are
            available for Batch are listed on: https://cloud.google.com/batch/docs/get-started#locations
        job_name: the name of the job that will be created.
            It needs to be unique for each project and region pair.
        ssd_name: name of the local ssd to be mounted for your Job.

    Returns:
        A job object representing the job created.
    """
    client = batch_v1.BatchServiceClient()

    # Define what will be done as part of the job.
    task = batch_v1.TaskSpec()
    runnable = batch_v1.Runnable()
    runnable.script = batch_v1.Runnable.Script()
    runnable.script.text = "echo Hello world! This is task ${BATCH_TASK_INDEX}. This job has a total of ${BATCH_TASK_COUNT} tasks."
    task.runnables = [runnable]
    task.max_retry_count = 2
    task.max_run_duration = "3600s"

    volume = batch_v1.Volume()
    volume.device_name = ssd_name
    volume.mount_path = f"/mnt/disks/{ssd_name}"
    task.volumes = [volume]

    # Tasks are grouped inside a job using TaskGroups.
    # Currently, it's possible to have only one task group.
    group = batch_v1.TaskGroup()
    group.task_count = 4
    group.task_spec = task

    disk = batch_v1.AllocationPolicy.Disk()
    disk.type_ = "local-ssd"
    # The size of all the local SSDs in GB. Each local SSD is 375 GB,
    # so this value must be a multiple of 375 GB.
    # For example, for 2 local SSDs, set this value to 750 GB.
    disk.size_gb = 375
    assert disk.size_gb % 375 == 0

    # Policies are used to define on what kind of virtual machines the tasks will run on.
    # The allowed number of local SSDs depends on the machine type for your job's VMs.
    # In this case, we tell the system to use "n1-standard-1" machine type, which require to attach local ssd manually.
    # Read more about local disks here: https://cloud.google.com/compute/docs/disks/local-ssd#lssd_disk_options
    policy = batch_v1.AllocationPolicy.InstancePolicy()
    policy.machine_type = "n1-standard-1"

    attached_disk = batch_v1.AllocationPolicy.AttachedDisk()
    attached_disk.new_disk = disk
    attached_disk.device_name = ssd_name
    policy.disks = [attached_disk]

    instances = batch_v1.AllocationPolicy.InstancePolicyOrTemplate()
    instances.policy = policy

    allocation_policy = batch_v1.AllocationPolicy()
    allocation_policy.instances = [instances]

    job = batch_v1.Job()
    job.task_groups = [group]
    job.allocation_policy = allocation_policy
    job.labels = {"env": "testing", "type": "script"}
    # We use Cloud Logging as it's an out of the box available option
    job.logs_policy = batch_v1.LogsPolicy()
    job.logs_policy.destination = batch_v1.LogsPolicy.Destination.CLOUD_LOGGING

    create_request = batch_v1.CreateJobRequest()
    create_request.job = job
    create_request.job_id = job_name
    # The job's parent is the region in which the job will run
    create_request.parent = f"projects/{project_id}/locations/{region}"

    return client.create_job(create_request)

Usar un segmento de Cloud Storage

Para crear un trabajo que use un segmento de Cloud Storage, selecciona uno de los siguientes métodos:

  • Recomendación: monta un contenedor directamente en las VMs de tu trabajo especificando el contenedor en la definición del trabajo, tal como se muestra en esta sección. Cuando se ejecuta el trabajo, el segmento se monta automáticamente en las VMs del trabajo mediante Cloud Storage FUSE.
  • Crea un trabajo con tareas que accedan directamente a un segmento de Cloud Storage mediante la CLI de gcloud o las bibliotecas de cliente de la API de Cloud Storage. Para saber cómo acceder a un segmento de Cloud Storage directamente desde una VM, consulta la documentación de Compute Engine sobre cómo escribir y leer datos de segmentos de Cloud Storage.

Antes de crear un trabajo que use un contenedor, crea uno o identifica uno que ya tengas. Para obtener más información, consulta los artículos Crear segmentos y Listar segmentos.

Puedes crear un trabajo que use un segmento de Cloud Storage con laGoogle Cloud consola, la CLI de gcloud, la API Batch, C++, Go, Java, Node.js o Python.

En el siguiente ejemplo se describe cómo crear un trabajo que monte un segmento de Cloud Storage. El trabajo también tiene 3 tareas que ejecutan una secuencia de comandos para crear un archivo en el contenedor llamado output_task_TASK_INDEX.txt donde TASK_INDEX es el índice de cada tarea: 0, 1 y 2.

Consola

Para crear un trabajo que use un segmento de Cloud Storage con laGoogle Cloud consola, sigue estos pasos:

  1. En la Google Cloud consola, ve a la página Lista de tareas.

    Ir a la lista de tareas

  2. Haz clic en Crear. Se abrirá la página Crear tarea por lotes. En el panel de la izquierda, se selecciona la página Detalles de la tarea.

  3. Configura la página Detalles del empleo:

    1. Opcional: En el campo Nombre del trabajo, personaliza el nombre del trabajo.

      Por ejemplo, escribe example-bucket-job.

    2. Configura la sección Detalles de la tarea:

      1. En la ventana Nuevo ejecutable, añade al menos una secuencia de comandos o un contenedor para que se ejecute este trabajo.

        Por ejemplo, haz lo siguiente:

        1. Seleccione la casilla Secuencia de comandos. Aparecerá un cuadro de texto.

        2. En el cuadro de texto, introduce la siguiente secuencia de comandos:

          echo Hello world from task ${BATCH_TASK_INDEX}. >> MOUNT_PATH/output_task_${BATCH_TASK_INDEX}.txt
          

          Sustituye MOUNT_PATH por la ruta de montaje que usan los elementos ejecutables de este trabajo para acceder a un segmento de Cloud Storage. La ruta debe empezar por /mnt/disks/ seguido del directorio o la ruta que elija. Por ejemplo, si quieres representar este contenedor con un directorio llamado my-bucket, define la ruta de montaje como /mnt/disks/my-bucket.

        3. Haz clic en Listo.

      2. En el campo Número de tareas, introduce el número de tareas de este trabajo.

        Por ejemplo, escribe 3.

      3. En el campo Paralelismo, introduce el número de tareas que se van a ejecutar simultáneamente.

        Por ejemplo, introduce 1 (valor predeterminado).

  4. Configura la página Configuraciones adicionales:

    1. En el panel de la izquierda, haz clic en Configuraciones adicionales. Se abrirá la página Configuraciones adicionales.

    2. Para cada segmento de Cloud Storage que quieras montar en este trabajo, haz lo siguiente:

      1. En la sección Volumen de almacenamiento, haz clic en Añadir nuevo volumen. Aparecerá la ventana Nuevo volumen.

      2. En la ventana Nuevo volumen, haz lo siguiente:

        1. En la sección Tipo de volumen, selecciona Segmento de Cloud Storage.

        2. En el campo Storage Bucket name (Nombre del segmento de almacenamiento), introduce el nombre de un segmento.

          Por ejemplo, introduzca el segmento que haya especificado en el elemento ejecutable de este trabajo.

        3. En el campo Ruta de montaje, introduce la ruta de montaje del contenedor (MOUNT_PATH), que has especificado en el archivo ejecutable.

        4. Haz clic en Listo.

  5. Opcional: Configura los otros campos de este trabajo.

  6. Opcional: Para revisar la configuración del trabajo, en el panel de la izquierda, haz clic en Vista previa.

  7. Haz clic en Crear.

En la página Detalles de la tarea se muestra la tarea que has creado.

gcloud

Para crear un trabajo que use un segmento de Cloud Storage con la CLI de gcloud, usa el comando gcloud batch jobs submit. En el archivo de configuración JSON del trabajo, monta el segmento en el campo volumes.

Por ejemplo, para crear una tarea que genere archivos en Cloud Storage, haz lo siguiente:

  1. Crea un archivo JSON con el siguiente contenido:

    {
        "taskGroups": [
            {
                "taskSpec": {
                    "runnables": [
                        {
                            "script": {
                                "text": "echo Hello world from task ${BATCH_TASK_INDEX}. >> MOUNT_PATH/output_task_${BATCH_TASK_INDEX}.txt"
                            }
                        }
                    ],
                    "volumes": [
                        {
                            "gcs": {
                                "remotePath": "BUCKET_PATH"
                            },
                            "mountPath": "MOUNT_PATH"
                        }
                    ]
                },
                "taskCount": 3
            }
        ],
        "logsPolicy": {
            "destination": "CLOUD_LOGGING"
        }
    }
    

    Haz los cambios siguientes:

    • BUCKET_PATH: la ruta del directorio del segmento al que quieres que acceda este trabajo, que debe empezar por el nombre del segmento. Por ejemplo, en el caso de un segmento llamado BUCKET_NAME, la ruta BUCKET_NAME representa el directorio raíz del segmento y la ruta BUCKET_NAME/subdirectory representa el subdirectorio subdirectory.
    • MOUNT_PATH: la ruta de montaje que usan los elementos ejecutables del trabajo para acceder a este contenedor. La ruta debe empezar por /mnt/disks/ seguido del directorio o la ruta que elija. Por ejemplo, si quieres representar este segmento con un directorio llamado my-bucket, define la ruta de montaje como /mnt/disks/my-bucket.
  2. Ejecuta el siguiente comando:

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    Haz los cambios siguientes:

    • JOB_NAME: el nombre del puesto.
    • LOCATION: la ubicación del puesto.
    • JSON_CONFIGURATION_FILE: la ruta de un archivo JSON con los detalles de configuración del trabajo.

API

Para crear un trabajo que utilice un segmento de Cloud Storage con la API Batch, usa el método jobs.create y monta el segmento en el campo volumes.

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}. >> MOUNT_PATH/output_task_${BATCH_TASK_INDEX}.txt"
                        }
                    }
                ],
                "volumes": [
                    {
                        "gcs": {
                            "remotePath": "BUCKET_PATH"
                        },
                        "mountPath": "MOUNT_PATH"
                    }
                ]
            },
            "taskCount": 3
        }
    ],
    "logsPolicy": {
            "destination": "CLOUD_LOGGING"
    }
}

Haz los cambios siguientes:

  • PROJECT_ID: el ID de proyecto de tu proyecto.
  • LOCATION: la ubicación del puesto.
  • JOB_NAME: el nombre del puesto.
  • BUCKET_PATH: la ruta del directorio del contenedor al que quieres que acceda este trabajo, que debe empezar por el nombre del contenedor. Por ejemplo, en el caso de un segmento llamado BUCKET_NAME, la ruta BUCKET_NAME representa el directorio raíz del segmento y la ruta BUCKET_NAME/subdirectory representa el subdirectorio subdirectory.
  • MOUNT_PATH: la ruta de montaje que usan los elementos ejecutables del trabajo para acceder a este contenedor. La ruta debe empezar por /mnt/disks/ seguido del directorio o la ruta que elija. Por ejemplo, si quieres representar este contenedor con un directorio llamado my-bucket, define la ruta de montaje como /mnt/disks/my-bucket.

C++

C++

Para obtener más información, consulta la documentación de referencia de la API Batch C++.

Para autenticarte en Batch, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

#include "google/cloud/batch/v1/batch_client.h"

  [](std::string const& project_id, std::string const& location_id,
     std::string const& job_id, std::string const& bucket_name) {
    // Initialize the request; start with the fields that depend on the sample
    // input.
    google::cloud::batch::v1::CreateJobRequest request;
    request.set_parent("projects/" + project_id + "/locations/" + location_id);
    request.set_job_id(job_id);
    // Most of the job description is fixed in this example; use a string to
    // initialize it, and then override the GCS remote path.
    auto constexpr kText = R"pb(
      task_groups {
        task_count: 4
        task_spec {
          compute_resource { cpu_milli: 500 memory_mib: 16 }
          max_retry_count: 2
          max_run_duration { seconds: 3600 }
          runnables {
            script {
              text: "echo Hello world from task ${BATCH_TASK_INDEX}. >> /mnt/share/output_task_${BATCH_TASK_INDEX}.txt"
            }
          }
          volumes { mount_path: "/mnt/share" }
        }
      }
      allocation_policy {
        instances {
          policy { machine_type: "e2-standard-4" provisioning_model: STANDARD }
        }
      }
      labels { key: "env" value: "testing" }
      labels { key: "type" value: "script" }
      logs_policy { destination: CLOUD_LOGGING }
    )pb";
    auto* job = request.mutable_job();
    if (!google::protobuf::TextFormat::ParseFromString(kText, job)) {
      throw std::runtime_error("Error parsing Job description");
    }
    job->mutable_task_groups(0)
        ->mutable_task_spec()
        ->mutable_volumes(0)
        ->mutable_gcs()
        ->set_remote_path(bucket_name);
    // Create a client and issue the request.
    auto client = google::cloud::batch_v1::BatchServiceClient(
        google::cloud::batch_v1::MakeBatchServiceConnection());
    auto response = client.CreateJob(request);
    if (!response) throw std::move(response).status();
    std::cout << "Job : " << response->DebugString() << "\n";
  }

Go

Go

Para obtener más información, consulta la documentación de referencia de la API Batch Go.

Para autenticarte en Batch, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

import (
	"context"
	"fmt"
	"io"

	batch "cloud.google.com/go/batch/apiv1"
	"cloud.google.com/go/batch/apiv1/batchpb"
	durationpb "google.golang.org/protobuf/types/known/durationpb"
)

// Creates and runs a job that executes the specified script
func createScriptJobWithBucket(w io.Writer, projectID, region, jobName, bucketName string) error {
	// projectID := "your_project_id"
	// region := "us-central1"
	// jobName := "some-job"
	// jobName := "some-bucket"

	ctx := context.Background()
	batchClient, err := batch.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("NewClient: %w", err)
	}
	defer batchClient.Close()

	// Define what will be done as part of the job.
	command := &batchpb.Runnable_Script_Text{
		Text: "echo Hello world from task ${BATCH_TASK_INDEX}. >> /mnt/share/output_task_${BATCH_TASK_INDEX}.txt",
	}

	// Specify the Google Cloud Storage bucket to mount
	volume := &batchpb.Volume{
		Source: &batchpb.Volume_Gcs{
			Gcs: &batchpb.GCS{
				RemotePath: bucketName,
			},
		},
		MountPath:    "/mnt/share",
		MountOptions: []string{},
	}

	// We can specify what resources are requested by each task.
	resources := &batchpb.ComputeResource{
		// CpuMilli is milliseconds per cpu-second. This means the task requires 50% of a single CPUs.
		CpuMilli:  500,
		MemoryMib: 16,
	}

	taskSpec := &batchpb.TaskSpec{
		Runnables: []*batchpb.Runnable{{
			Executable: &batchpb.Runnable_Script_{
				Script: &batchpb.Runnable_Script{Command: command},
			},
		}},
		ComputeResource: resources,
		MaxRunDuration: &durationpb.Duration{
			Seconds: 3600,
		},
		MaxRetryCount: 2,
		Volumes:       []*batchpb.Volume{volume},
	}

	// Tasks are grouped inside a job using TaskGroups.
	taskGroups := []*batchpb.TaskGroup{
		{
			TaskCount: 4,
			TaskSpec:  taskSpec,
		},
	}

	// Policies are used to define on what kind of virtual machines the tasks will run on.
	// In this case, we tell the system to use "e2-standard-4" machine type.
	// Read more about machine types here: https://cloud.google.com/compute/docs/machine-types
	allocationPolicy := &batchpb.AllocationPolicy{
		Instances: []*batchpb.AllocationPolicy_InstancePolicyOrTemplate{{
			PolicyTemplate: &batchpb.AllocationPolicy_InstancePolicyOrTemplate_Policy{
				Policy: &batchpb.AllocationPolicy_InstancePolicy{
					MachineType: "e2-standard-4",
				},
			},
		}},
	}

	// We use Cloud Logging as it's an out of the box available option
	logsPolicy := &batchpb.LogsPolicy{
		Destination: batchpb.LogsPolicy_CLOUD_LOGGING,
	}

	jobLabels := map[string]string{"env": "testing", "type": "script"}

	// The job's parent is the region in which the job will run
	parent := fmt.Sprintf("projects/%s/locations/%s", projectID, region)

	job := batchpb.Job{
		TaskGroups:       taskGroups,
		AllocationPolicy: allocationPolicy,
		Labels:           jobLabels,
		LogsPolicy:       logsPolicy,
	}

	req := &batchpb.CreateJobRequest{
		Parent: parent,
		JobId:  jobName,
		Job:    &job,
	}

	created_job, err := batchClient.CreateJob(ctx, req)
	if err != nil {
		return fmt.Errorf("unable to create job: %w", err)
	}

	fmt.Fprintf(w, "Job created: %v\n", created_job)

	return nil
}

Java

Java

Para obtener más información, consulta la documentación de referencia de la API Batch Java.

Para autenticarte en Batch, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

import com.google.cloud.batch.v1.AllocationPolicy;
import com.google.cloud.batch.v1.AllocationPolicy.InstancePolicy;
import com.google.cloud.batch.v1.AllocationPolicy.InstancePolicyOrTemplate;
import com.google.cloud.batch.v1.BatchServiceClient;
import com.google.cloud.batch.v1.ComputeResource;
import com.google.cloud.batch.v1.CreateJobRequest;
import com.google.cloud.batch.v1.GCS;
import com.google.cloud.batch.v1.Job;
import com.google.cloud.batch.v1.LogsPolicy;
import com.google.cloud.batch.v1.LogsPolicy.Destination;
import com.google.cloud.batch.v1.Runnable;
import com.google.cloud.batch.v1.Runnable.Script;
import com.google.cloud.batch.v1.TaskGroup;
import com.google.cloud.batch.v1.TaskSpec;
import com.google.cloud.batch.v1.Volume;
import com.google.protobuf.Duration;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateWithMountedBucket {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Cloud project you want to use.
    String projectId = "YOUR_PROJECT_ID";

    // Name of the region you want to use to run the job. Regions that are
    // available for Batch are listed on: https://cloud.google.com/batch/docs/get-started#locations
    String region = "europe-central2";

    // The name of the job that will be created.
    // It needs to be unique for each project and region pair.
    String jobName = "JOB_NAME";

    // Name of the bucket to be mounted for your Job.
    String bucketName = "BUCKET_NAME";

    createScriptJobWithBucket(projectId, region, jobName, bucketName);
  }

  // This method shows how to create a sample Batch Job that will run
  // a simple command on Cloud Compute instances.
  public static void createScriptJobWithBucket(String projectId, String region, String jobName,
      String bucketName)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `batchServiceClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (BatchServiceClient batchServiceClient = BatchServiceClient.create()) {

      // Define what will be done as part of the job.
      Runnable runnable =
          Runnable.newBuilder()
              .setScript(
                  Script.newBuilder()
                      .setText(
                          "echo Hello world from task ${BATCH_TASK_INDEX}. >> "
                              + "/mnt/share/output_task_${BATCH_TASK_INDEX}.txt")
                      // You can also run a script from a file. Just remember, that needs to be a
                      // script that's already on the VM that will be running the job.
                      // Using setText() and setPath() is mutually exclusive.
                      // .setPath("/tmp/test.sh")
                      .build())
              .build();

      Volume volume = Volume.newBuilder()
          .setGcs(GCS.newBuilder()
              .setRemotePath(bucketName)
              .build())
          .setMountPath("/mnt/share")
          .build();

      // We can specify what resources are requested by each task.
      ComputeResource computeResource =
          ComputeResource.newBuilder()
              // In milliseconds per cpu-second. This means the task requires 50% of a single CPUs.
              .setCpuMilli(500)
              // In MiB.
              .setMemoryMib(16)
              .build();

      TaskSpec task =
          TaskSpec.newBuilder()
              // Jobs can be divided into tasks. In this case, we have only one task.
              .addRunnables(runnable)
              .addVolumes(volume)
              .setComputeResource(computeResource)
              .setMaxRetryCount(2)
              .setMaxRunDuration(Duration.newBuilder().setSeconds(3600).build())
              .build();

      // Tasks are grouped inside a job using TaskGroups.
      // Currently, it's possible to have only one task group.
      TaskGroup taskGroup = TaskGroup.newBuilder().setTaskCount(4).setTaskSpec(task).build();

      // Policies are used to define on what kind of virtual machines the tasks will run on.
      // In this case, we tell the system to use "e2-standard-4" machine type.
      // Read more about machine types here: https://cloud.google.com/compute/docs/machine-types
      InstancePolicy instancePolicy =
          InstancePolicy.newBuilder().setMachineType("e2-standard-4").build();

      AllocationPolicy allocationPolicy =
          AllocationPolicy.newBuilder()
              .addInstances(InstancePolicyOrTemplate.newBuilder().setPolicy(instancePolicy).build())
              .build();

      Job job =
          Job.newBuilder()
              .addTaskGroups(taskGroup)
              .setAllocationPolicy(allocationPolicy)
              .putLabels("env", "testing")
              .putLabels("type", "script")
              .putLabels("mount", "bucket")
              // We use Cloud Logging as it's an out of the box available option.
              .setLogsPolicy(
                  LogsPolicy.newBuilder().setDestination(Destination.CLOUD_LOGGING).build())
              .build();

      CreateJobRequest createJobRequest =
          CreateJobRequest.newBuilder()
              // The job's parent is the region in which the job will run.
              .setParent(String.format("projects/%s/locations/%s", projectId, region))
              .setJob(job)
              .setJobId(jobName)
              .build();

      Job result =
          batchServiceClient
              .createJobCallable()
              .futureCall(createJobRequest)
              .get(5, TimeUnit.MINUTES);

      System.out.printf("Successfully created the job: %s", result.getName());
    }
  }
}

Node.js

Node.js

Para obtener más información, consulta la documentación de referencia de la API Batch Node.js.

Para autenticarte en Batch, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

/**
 * TODO(developer): Uncomment and replace these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
/**
 * The region you want to the job to run in. The regions that support Batch are listed here:
 * https://cloud.google.com/batch/docs/get-started#locations
 */
// const region = 'us-central-1';
/**
 * The name of the job that will be created.
 * It needs to be unique for each project and region pair.
 */
// const jobName = 'YOUR_JOB_NAME';
/**
 * The name of the bucket to be mounted.
 */
// const bucketName = 'YOUR_BUCKET_NAME';

// Imports the Batch library
const batchLib = require('@google-cloud/batch');
const batch = batchLib.protos.google.cloud.batch.v1;

// Instantiates a client
const batchClient = new batchLib.v1.BatchServiceClient();

// Define what will be done as part of the job.
const task = new batch.TaskSpec();
const runnable = new batch.Runnable();
runnable.script = new batch.Runnable.Script();
runnable.script.text =
  'echo Hello world from task ${BATCH_TASK_INDEX}. >> /mnt/share/output_task_${BATCH_TASK_INDEX}.txt';
// You can also run a script from a file. Just remember, that needs to be a script that's
// already on the VM that will be running the job. Using runnable.script.text and runnable.script.path is mutually
// exclusive.
// runnable.script.path = '/tmp/test.sh'
task.runnables = [runnable];

const gcsBucket = new batch.GCS();
gcsBucket.remotePath = bucketName;
const gcsVolume = new batch.Volume();
gcsVolume.gcs = gcsBucket;
gcsVolume.mountPath = '/mnt/share';
task.volumes = [gcsVolume];

// We can specify what resources are requested by each task.
const resources = new batch.ComputeResource();
resources.cpuMilli = 2000; // in milliseconds per cpu-second. This means the task requires 2 whole CPUs.
resources.memoryMib = 16;
task.computeResource = resources;

task.maxRetryCount = 2;
task.maxRunDuration = {seconds: 3600};

// Tasks are grouped inside a job using TaskGroups.
const group = new batch.TaskGroup();
group.taskCount = 4;
group.taskSpec = task;

// Policies are used to define on what kind of virtual machines the tasks will run on.
// In this case, we tell the system to use "e2-standard-4" machine type.
// Read more about machine types here: https://cloud.google.com/compute/docs/machine-types
const allocationPolicy = new batch.AllocationPolicy();
const policy = new batch.AllocationPolicy.InstancePolicy();
policy.machineType = 'e2-standard-4';
const instances = new batch.AllocationPolicy.InstancePolicyOrTemplate();
instances.policy = policy;
allocationPolicy.instances = [instances];

const job = new batch.Job();
job.name = jobName;
job.taskGroups = [group];
job.allocationPolicy = allocationPolicy;
job.labels = {env: 'testing', type: 'script'};
// We use Cloud Logging as it's an option available out of the box
job.logsPolicy = new batch.LogsPolicy();
job.logsPolicy.destination = batch.LogsPolicy.Destination.CLOUD_LOGGING;

// The job's parent is the project and region in which the job will run
const parent = `projects/${projectId}/locations/${region}`;

async function callCreateJob() {
  // Construct request
  const request = {
    parent,
    jobId: jobName,
    job,
  };

  // Run request
  const response = await batchClient.createJob(request);
  console.log(response);
}

await callCreateJob();

Python

Python

Para obtener más información, consulta la documentación de referencia de la API Batch Python.

Para autenticarte en Batch, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

from google.cloud import batch_v1


def create_script_job_with_bucket(
    project_id: str, region: str, job_name: str, bucket_name: str
) -> batch_v1.Job:
    """
    This method shows how to create a sample Batch Job that will run
    a simple command on Cloud Compute instances.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        region: name of the region you want to use to run the job. Regions that are
            available for Batch are listed on: https://cloud.google.com/batch/docs/get-started#locations
        job_name: the name of the job that will be created.
            It needs to be unique for each project and region pair.
        bucket_name: name of the bucket to be mounted for your Job.

    Returns:
        A job object representing the job created.
    """
    client = batch_v1.BatchServiceClient()

    # Define what will be done as part of the job.
    task = batch_v1.TaskSpec()
    runnable = batch_v1.Runnable()
    runnable.script = batch_v1.Runnable.Script()
    runnable.script.text = "echo Hello world from task ${BATCH_TASK_INDEX}. >> /mnt/share/output_task_${BATCH_TASK_INDEX}.txt"
    task.runnables = [runnable]

    gcs_bucket = batch_v1.GCS()
    gcs_bucket.remote_path = bucket_name
    gcs_volume = batch_v1.Volume()
    gcs_volume.gcs = gcs_bucket
    gcs_volume.mount_path = "/mnt/share"
    task.volumes = [gcs_volume]

    # We can specify what resources are requested by each task.
    resources = batch_v1.ComputeResource()
    resources.cpu_milli = 500  # in milliseconds per cpu-second. This means the task requires 50% of a single CPUs.
    resources.memory_mib = 16
    task.compute_resource = resources

    task.max_retry_count = 2
    task.max_run_duration = "3600s"

    # Tasks are grouped inside a job using TaskGroups.
    # Currently, it's possible to have only one task group.
    group = batch_v1.TaskGroup()
    group.task_count = 4
    group.task_spec = task

    # Policies are used to define on what kind of virtual machines the tasks will run on.
    # In this case, we tell the system to use "e2-standard-4" machine type.
    # Read more about machine types here: https://cloud.google.com/compute/docs/machine-types
    allocation_policy = batch_v1.AllocationPolicy()
    policy = batch_v1.AllocationPolicy.InstancePolicy()
    policy.machine_type = "e2-standard-4"
    instances = batch_v1.AllocationPolicy.InstancePolicyOrTemplate()
    instances.policy = policy
    allocation_policy.instances = [instances]

    job = batch_v1.Job()
    job.task_groups = [group]
    job.allocation_policy = allocation_policy
    job.labels = {"env": "testing", "type": "script", "mount": "bucket"}
    # We use Cloud Logging as it's an out of the box available option
    job.logs_policy = batch_v1.LogsPolicy()
    job.logs_policy.destination = batch_v1.LogsPolicy.Destination.CLOUD_LOGGING

    create_request = batch_v1.CreateJobRequest()
    create_request.job = job
    create_request.job_id = job_name
    # The job's parent is the region in which the job will run
    create_request.parent = f"projects/{project_id}/locations/{region}"

    return client.create_job(create_request)

Usar un sistema de archivos de red

Puedes crear un trabajo que utilice un sistema de archivos de red (NFS) ya creado, como un recurso compartido de archivos de Filestore, mediante la consola de Google Cloud , la CLI de gcloud o la API Batch.

Antes de crear un trabajo que utilice un NFS, asegúrese de que el cortafuegos de su red esté configurado correctamente para permitir el tráfico entre las VMs de su trabajo y el NFS. Para obtener más información, consulta Configurar reglas de cortafuegos para Filestore.

En el siguiente ejemplo se describe cómo crear un trabajo que especifique y monte un NFS. El trabajo también tiene 3 tareas que ejecutan una secuencia de comandos para crear un archivo en el NFS llamado output_task_TASK_INDEX.txt, donde TASK_INDEX es el índice de cada tarea: 0, 1 y 2.

Consola

Para crear un trabajo que use un NFS con la Google Cloud consola, haz lo siguiente:

  1. En la Google Cloud consola, ve a la página Lista de tareas.

    Ir a la lista de tareas

  2. Haz clic en Crear. Se abrirá la página Crear tarea por lotes. En el panel de la izquierda, se selecciona la página Detalles de la tarea.

  3. Configura la página Detalles del empleo:

    1. Opcional: En el campo Nombre del trabajo, personaliza el nombre del trabajo.

      Por ejemplo, escribe example-nfs-job.

    2. Configura la sección Detalles de la tarea:

      1. En la ventana Nuevo ejecutable, añade al menos una secuencia de comandos o un contenedor para que se ejecute este trabajo.

        Por ejemplo, haz lo siguiente:

        1. Seleccione la casilla Secuencia de comandos. Aparecerá un cuadro de texto.

        2. En el cuadro de texto, introduce la siguiente secuencia de comandos:

          echo Hello world from task ${BATCH_TASK_INDEX}. >> MOUNT_PATH/output_task_${BATCH_TASK_INDEX}.txt
          

          Sustituye MOUNT_PATH por la ruta de montaje que usa el ejecutable del trabajo para acceder a este NFS. La ruta debe empezar por /mnt/disks/ seguido del directorio o la ruta que elija. Por ejemplo, si quieres representar este NFS con un directorio llamado my-nfs, define la ruta de montaje como /mnt/disks/my-nfs.

        3. Haz clic en Listo.

      2. En el campo Número de tareas, introduce el número de tareas de este trabajo.

        Por ejemplo, escribe 3.

      3. En el campo Paralelismo, introduce el número de tareas que se van a ejecutar simultáneamente.

        Por ejemplo, introduce 1 (valor predeterminado).

  4. Configura la página Configuraciones adicionales:

    1. En el panel de la izquierda, haz clic en Configuraciones adicionales. Se abrirá la página Configuraciones adicionales.

    2. Para cada segmento de Cloud Storage que quieras montar en este trabajo, haz lo siguiente:

      1. En la sección Volumen de almacenamiento, haz clic en Añadir nuevo volumen. Aparecerá la ventana Nuevo volumen.

      2. En la ventana Nuevo volumen, haz lo siguiente:

        1. En la sección Tipo de volumen, selecciona Sistema de archivos de red.

        2. En el campo Servidor de archivos, introduzca la dirección IP del servidor en el que se encuentra el NFS que ha especificado en el elemento ejecutable de este trabajo.

          Por ejemplo, si tu NFS es un sistema de archivos compartido de Filestore, especifica la dirección IP de la instancia de Filestore, que puedes obtener describiendo la instancia de Filestore.

        3. En el campo Ruta remota, introduzca una ruta que pueda acceder al NFS que ha especificado en el paso anterior.

          La ruta del directorio NFS debe empezar por / seguido del directorio raíz de NFS.

        4. En el campo Ruta de montaje, introduce la ruta de montaje de NFS (MOUNT_PATH), que especificaste en el paso anterior.

    3. Haz clic en Listo.

  5. Opcional: Configura los otros campos de este trabajo.

  6. Opcional: Para revisar la configuración del trabajo, en el panel de la izquierda, haz clic en Vista previa.

  7. Haz clic en Crear.

En la página Detalles de la tarea se muestra la tarea que has creado.

gcloud

Para crear un trabajo que use un NFS con la CLI de gcloud, usa el comando gcloud batch jobs submit. En el archivo de configuración JSON del trabajo, monta el NFS en el campo volumes.

  1. Crea un archivo JSON con el siguiente contenido:

    {
        "taskGroups": [
            {
                "taskSpec": {
                    "runnables": [
                        {
                            "script": {
                                "text": "echo Hello world from task ${BATCH_TASK_INDEX}. >> MOUNT_PATH/output_task_${BATCH_TASK_INDEX}.txt"
                            }
                        }
                    ],
                    "volumes": [
                        {
                            "nfs": {
                                "server": "NFS_IP_ADDRESS",
                                "remotePath": "NFS_PATH"
                            },
                            "mountPath": "MOUNT_PATH"
                        }
                    ]
                },
                "taskCount": 3
            }
        ],
        "logsPolicy": {
            "destination": "CLOUD_LOGGING"
        }
    }
    

    Haz los cambios siguientes:

    • NFS_IP_ADDRESS: la dirección IP de NFS. Por ejemplo, si tu NFS es un sistema de archivos compartido de Filestore, especifica la dirección IP de la instancia de Filestore, que puedes obtener describiendo la instancia de Filestore.
    • NFS_PATH: la ruta del directorio NFS al que quieres que acceda este trabajo, que debe empezar por / seguido del directorio raíz de NFS. Por ejemplo, en el caso de un recurso compartido de archivos de Filestore llamado FILE_SHARE_NAME, la ruta /FILE_SHARE_NAME representa el directorio raíz del recurso compartido de archivos y la ruta /FILE_SHARE_NAME/subdirectory representa el subdirectorio subdirectory.
    • MOUNT_PATH: la ruta de montaje que usan los elementos ejecutables del trabajo para acceder a este NFS. La ruta debe empezar por /mnt/disks/ seguido del directorio o la ruta que elija. Por ejemplo, si quieres representar este NFS con un directorio llamado my-nfs, define la ruta de montaje como /mnt/disks/my-nfs.
  2. Ejecuta el siguiente comando:

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    Haz los cambios siguientes:

    • JOB_NAME: el nombre del puesto.
    • LOCATION: la ubicación del puesto.
    • JSON_CONFIGURATION_FILE: la ruta de un archivo JSON con los detalles de configuración del trabajo.

API

Para crear un trabajo que use un NFS mediante la API Batch, usa el método jobs.create y monta el NFS en el campo volumes.

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}. >> MOUNT_PATH/output_task_${BATCH_TASK_INDEX}.txt"
                        }
                    }
                ],
                "volumes": [
                    {
                        "nfs": {
                            "server": "NFS_IP_ADDRESS",
                            "remotePath": "NFS_PATH"
                        },
                        "mountPath": "MOUNT_PATH"
                    }
                ]
            },
            "taskCount": 3
        }
    ],
    "logsPolicy": {
        "destination": "CLOUD_LOGGING"
    }
}

Haz los cambios siguientes:

  • PROJECT_ID: el ID de proyecto de tu proyecto.
  • LOCATION: la ubicación del puesto.
  • JOB_NAME: el nombre del puesto.
  • NFS_IP_ADDRESS: la dirección IP del sistema de archivos de red. Por ejemplo, si tu NFS es un sistema de archivos compartido de Filestore, especifica la dirección IP de la instancia de Filestore, que puedes obtener describiendo la instancia de Filestore.
  • NFS_PATH: la ruta del directorio NFS al que quieres que acceda este trabajo, que debe empezar por / seguido del directorio raíz de NFS. Por ejemplo, en el caso de un recurso compartido de archivos de Filestore llamado FILE_SHARE_NAME, la ruta /FILE_SHARE_NAME representa el directorio raíz del recurso compartido de archivos y la ruta /FILE_SHARE_NAME/subdirectory representa un subdirectorio.
  • MOUNT_PATH: la ruta de montaje que usan los elementos ejecutables del trabajo para acceder a este NFS. La ruta debe empezar por /mnt/disks/ seguido del directorio o la ruta que elija. Por ejemplo, si quieres representar este NFS con un directorio llamado my-nfs, define la ruta de montaje como /mnt/disks/my-nfs.

Java


import com.google.cloud.batch.v1.AllocationPolicy;
import com.google.cloud.batch.v1.BatchServiceClient;
import com.google.cloud.batch.v1.ComputeResource;
import com.google.cloud.batch.v1.CreateJobRequest;
import com.google.cloud.batch.v1.Job;
import com.google.cloud.batch.v1.LogsPolicy;
import com.google.cloud.batch.v1.NFS;
import com.google.cloud.batch.v1.Runnable;
import com.google.cloud.batch.v1.TaskGroup;
import com.google.cloud.batch.v1.TaskSpec;
import com.google.cloud.batch.v1.Volume;
import com.google.protobuf.Duration;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateScriptJobWithNfs {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Cloud project you want to use.
    String projectId = "YOUR_PROJECT_ID";

    // Name of the region you want to use to run the job. Regions that are
    // available for Batch are listed on: https://cloud.google.com/batch/docs/get-started#locations
    String region = "europe-central2";

    // The name of the job that will be created.
    // It needs to be unique for each project and region pair.
    String jobName = "JOB_NAME";

    // The path of the NFS directory that you want this job to access.
    String nfsPath = "NFS_PATH";
    // The IP address of the Network File System.
    String nfsIpAddress = "NFS_IP_ADDRESS";

    createScriptJobWithNfs(projectId, region, jobName, nfsPath, nfsIpAddress);
  }

  // This method shows how to create a batch script job that specifies and mounts a NFS.
  public static Job createScriptJobWithNfs(String projectId, String region, String jobName,
                                            String nfsPath, String nfsIpAddress)
      throws IOException, ExecutionException, InterruptedException, TimeoutException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (BatchServiceClient batchServiceClient = BatchServiceClient.create()) {

      // Define what will be done as part of the job.
      Runnable runnable =
          Runnable.newBuilder()
              .setScript(
                  Runnable.Script.newBuilder()
                      .setText(
                          "echo Hello world from task ${BATCH_TASK_INDEX}. >> "
                              + "/mnt/share/output_task_${BATCH_TASK_INDEX}.txt")
                      // You can also run a script from a file. Just remember, that needs to be a
                      // script that's already on the VM that will be running the job.
                      // Using setText() and setPath() is mutually exclusive.
                      // .setPath("/tmp/test.sh")
                      .build())
              .build();

      // Describes a volume and parameters for it to be mounted to a VM.
      Volume volume = Volume.newBuilder()
          .setNfs(NFS.newBuilder()
              .setServer(nfsIpAddress)
              .setRemotePath(nfsPath)
              .build())
          .setMountPath("/mnt/share")
          .build();

      // We can specify what resources are requested by each task.
      ComputeResource computeResource =
          ComputeResource.newBuilder()
              // In milliseconds per cpu-second. This means the task requires 50% of a single CPUs.
              .setCpuMilli(500)
              // In MiB.
              .setMemoryMib(16)
              .build();

      TaskSpec task =
          TaskSpec.newBuilder()
              // Jobs can be divided into tasks. In this case, we have only one task.
              .addRunnables(runnable)
              .addVolumes(volume)
              .setComputeResource(computeResource)
              .setMaxRetryCount(2)
              .setMaxRunDuration(Duration.newBuilder().setSeconds(3600).build())
              .build();

      // Tasks are grouped inside a job using TaskGroups.
      // Currently, it's possible to have only one task group.
      TaskGroup taskGroup = TaskGroup.newBuilder().setTaskCount(4).setTaskSpec(task).build();

      // Policies are used to define on what kind of virtual machines the tasks will run on.
      // In this case, we tell the system to use "e2-standard-4" machine type.
      // Read more about machine types here:
      // https://cloud.google.com/compute/docs/machine-types
      AllocationPolicy.InstancePolicy instancePolicy =
          AllocationPolicy.InstancePolicy.newBuilder().setMachineType("e2-standard-4").build();

      AllocationPolicy allocationPolicy =
          AllocationPolicy.newBuilder()
              .addInstances(AllocationPolicy.InstancePolicyOrTemplate.newBuilder()
                      .setPolicy(instancePolicy).build())
              .build();

      Job job =
          Job.newBuilder()
              .addTaskGroups(taskGroup)
              .setAllocationPolicy(allocationPolicy)
              .putLabels("env", "testing")
              .putLabels("type", "script")
              .putLabels("mount", "bucket")
              // We use Cloud Logging as it's an out of the box available option.
              .setLogsPolicy(LogsPolicy.newBuilder()
                      .setDestination(LogsPolicy.Destination.CLOUD_LOGGING).build())
              .build();

      CreateJobRequest createJobRequest =
          CreateJobRequest.newBuilder()
              // The job's parent is the region in which the job will run.
              .setParent(String.format("projects/%s/locations/%s", projectId, region))
              .setJob(job)
              .setJobId(jobName)
              .build();

      Job result =
          batchServiceClient
              .createJobCallable()
              .futureCall(createJobRequest)
              .get(5, TimeUnit.MINUTES);

      System.out.printf("Successfully created the job: %s", result.getName());

      return result;
    }
  }
}

Node.js

// Imports the Batch library
const batchLib = require('@google-cloud/batch');
const batch = batchLib.protos.google.cloud.batch.v1;

// Instantiates a client
const batchClient = new batchLib.v1.BatchServiceClient();

/**
 * TODO(developer): Update these variables before running the sample.
 */
// Project ID or project number of the Google Cloud project you want to use.
const projectId = await batchClient.getProjectId();
// Name of the region you want to use to run the job. Regions that are
// available for Batch are listed on: https://cloud.google.com/batch/docs/get-started#locations
const region = 'europe-central2';
// The name of the job that will be created.
// It needs to be unique for each project and region pair.
const jobName = 'batch-nfs-job';
// The path of the NFS directory that you want this job to access.
const nfsPath = '/your_nfs_path';
// The IP address of the Network File System.
const nfsIpAddress = '0.0.0.0';
// The mount path that the job's tasks use to access the NFS.
const mountPath = '/mnt/disks';

// Define what will be done as part of the job.
const runnable = new batch.Runnable({
  script: new batch.Runnable.Script({
    commands: [
      '-c',
      'echo Hello world from task ${BATCH_TASK_INDEX}. >> ' +
        '/mnt/share/output_task_${BATCH_TASK_INDEX}.txt',
    ],
  }),
});

// Define a volume that uses NFS.
const volume = new batch.Volume({
  nfs: new batch.NFS({
    server: nfsIpAddress,
    remotePath: nfsPath,
  }),
  mountPath,
});

// Specify what resources are requested by each task.
const computeResource = new batch.ComputeResource({
  // In milliseconds per cpu-second. This means the task requires 50% of a single CPUs.
  cpuMilli: 500,
  // In MiB.
  memoryMib: 16,
});

const task = new batch.TaskSpec({
  runnables: [runnable],
  volumes: [volume],
  computeResource,
  maxRetryCount: 2,
  maxRunDuration: {seconds: 3600},
});

// Tasks are grouped inside a job using TaskGroups.
const group = new batch.TaskGroup({
  taskCount: 3,
  taskSpec: task,
});

// Policies are used to define on what kind of virtual machines the tasks will run on.
// In this case, we tell the system to use "e2-standard-4" machine type.
// Read more about machine types here: https://cloud.google.com/compute/docs/machine-types
const instancePolicy = new batch.AllocationPolicy.InstancePolicy({
  machineType: 'e2-standard-4',
});

const allocationPolicy = new batch.AllocationPolicy.InstancePolicyOrTemplate({
  instances: [{policy: instancePolicy}],
});

const job = new batch.Job({
  name: jobName,
  taskGroups: [group],
  allocationPolicy,
  labels: {env: 'testing', type: 'script'},
  // We use Cloud Logging as it's an option available out of the box
  logsPolicy: new batch.LogsPolicy({
    destination: batch.LogsPolicy.Destination.CLOUD_LOGGING,
  }),
});

// The job's parent is the project and region in which the job will run
const parent = `projects/${projectId}/locations/${region}`;

async function callCreateBatchNfsJob() {
  // Construct request
  const request = {
    parent,
    jobId: jobName,
    job,
  };

  // Run request
  const [response] = await batchClient.createJob(request);
  console.log(JSON.stringify(response));
}

await callCreateBatchNfsJob();

Python

from google.cloud import batch_v1


def create_job_with_network_file_system(
    project_id: str,
    region: str,
    job_name: str,
    mount_path: str,
    nfs_ip_address: str,
    nfs_path: str,
) -> batch_v1.Job:
    """
    Creates a Batch job with status events that mounts a Network File System (NFS).
    Function mounts an NFS volume using the provided NFS server, IP address and path.

    Args:
        project_id (str): project ID or project number of the Cloud project you want to use.
        region (str): name of the region you want to use to run the job. Regions that are
            available for Batch are listed on: https://cloud.google.com/batch/docs/locations
        job_name (str): the name of the job that will be created.
            It needs to be unique for each project and region pair.
        mount_path (str): The mount path that the job's tasks use to access the NFS.
        nfs_ip_address (str): The IP address of the NFS server (e.g., Filestore instance).
            Documentation on how to create a
            Filestore instance is available here: https://cloud.google.com/filestore/docs/create-instance-gcloud
        nfs_path (str): The path of the NFS directory that the job accesses.
            The path must start with a / followed by the root directory of the NFS.

    Returns:
        batch_v1.Job: The created Batch job object containing configuration details.
    """
    client = batch_v1.BatchServiceClient()

    # Create a runnable with a script that writes a message to a file
    runnable = batch_v1.Runnable()
    runnable.script = batch_v1.Runnable.Script()
    runnable.script.text = f"echo Hello world from task ${{BATCH_TASK_INDEX}}. >> {mount_path}/output_task_${{BATCH_TASK_INDEX}}.txt"

    # Define a volume that uses NFS
    volume = batch_v1.Volume()
    volume.nfs = batch_v1.NFS(server=nfs_ip_address, remote_path=nfs_path)
    volume.mount_path = mount_path

    # Create a task specification and assign the runnable and volume to it
    task = batch_v1.TaskSpec()
    task.runnables = [runnable]
    task.volumes = [volume]

    # Specify what resources are requested by each task.
    resources = batch_v1.ComputeResource()
    resources.cpu_milli = 2000  # in milliseconds per cpu-second. This means the task requires 2 whole CPUs.
    resources.memory_mib = 16  # in MiB
    task.compute_resource = resources

    task.max_retry_count = 2
    task.max_run_duration = "3600s"

    # Create a task group and assign the task specification to it
    group = batch_v1.TaskGroup()
    group.task_count = 1
    group.task_spec = task

    # Policies are used to define on what kind of virtual machines the tasks will run on.
    # In this case, we tell the system to use "e2-standard-4" machine type.
    # Read more about machine types here: https://cloud.google.com/compute/docs/machine-types
    policy = batch_v1.AllocationPolicy.InstancePolicy()
    policy.machine_type = "e2-standard-4"
    instances = batch_v1.AllocationPolicy.InstancePolicyOrTemplate()
    instances.policy = policy
    allocation_policy = batch_v1.AllocationPolicy()
    allocation_policy.instances = [instances]

    # Create the job and assign the task group and allocation policy to it
    job = batch_v1.Job()
    job.task_groups = [group]
    job.allocation_policy = allocation_policy
    job.labels = {"env": "testing", "type": "container"}
    # We use Cloud Logging as it's an out of the box available option
    job.logs_policy = batch_v1.LogsPolicy()
    job.logs_policy.destination = batch_v1.LogsPolicy.Destination.CLOUD_LOGGING

    # Create the job request and set the job and job ID
    create_request = batch_v1.CreateJobRequest()
    create_request.job = job
    create_request.job_id = job_name
    # The job's parent is the region in which the job will run
    create_request.parent = f"projects/{project_id}/locations/{region}"

    return client.create_job(create_request)

Siguientes pasos