Flujo de trabajo con Cloud Functions

Antes de comenzar

Si aún no lo hiciste, configura un proyecto de Google Cloud y dos (2) depósitos de Cloud Storage.

Configura tu proyecto

  1. Accede a tu Cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. En la página de selección de proyectos de Cloud Console, selecciona o crea un proyecto de Cloud.

    Ir a la página Selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud. Obtén información sobre cómo confirmar que tienes habilitada la facturación para tu proyecto.

  4. Habilita las API de Dataproc, Compute Engine, Cloud Storage, and Cloud Functions .

    Habilita las API

  5. Instala e inicializa el SDK de Cloud.

Crea o usa dos depósitos (2) de Cloud Storage en tu proyecto

Necesitarás dos depósitos de Cloud Storage en tu proyecto: uno para los archivos de entrada y otro para los de salida.

  1. En Cloud Console ve a la página Navegador de Cloud Storage.

    Ir a la página Navegador de Cloud Storage

  2. Haz clic en Crear depósito.
  3. En el diálogo Crear depósito, especifica los siguientes atributos:
  4. Haz clic en Crear.

Crea una plantilla de flujo de trabajo

Copia y ejecuta los comandos enumerados a continuación en una ventana de terminal local o en Cloud Shell para crear y definir una plantilla de flujo de trabajo.

Notas:

  • Los comandos especifican la región “us-central1”. Puedes especificar una región diferente o borrar la marca --region si ya ejecutaste gcloud config set compute/region para configurar la propiedad de región.
  • La secuencia "-- " (guion guion espacio) pasa argumentos al archivo jar. El comando wordcount input_bucket output_dir ejecutará la aplicación de conteo de palabras del archivo jar en los archivos de texto contenidos en el input_bucket de Cloud Storage y, luego, enviará los archivos de conteo de palabras a un output_bucket. Parametriza el argumento del depósito de entrada de conteo de palabras para permitir que la función proporcione este argumento.

  1. Crea la plantilla de flujo de trabajo.

    gcloud dataproc workflow-templates create wordcount-template \
        --region=us-central1
    

  2. Agrega el trabajo de conteo de palabras a la plantilla de flujo de trabajo.
    1. Especifica tu output-bucket-name antes de ejecutar el comando (tu función proporcionará el depósito de entrada). Después de insertar el nombre del depósito de salida, el argumento del depósito de salida debería decir lo siguiente: gs://your-output-bucket/wordcount-output".
    2. El ID del paso "conteo" es obligatorio y, además, identifica el trabajo hadoop agregado.

    gcloud dataproc workflow-templates add-job hadoop \
        --workflow-template=wordcount-template \
        --step-id=count \
        --jar=file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar \
        --region=us-central1 \
        -- wordcount gs://input-bucket gs://output-bucket-name/wordcount-output
    

  3. Usa un clúster administrado de nodo único para ejecutar el flujo de trabajo. Dataproc creará el clúster, ejecutará el flujo de trabajo y, luego, borrará el clúster cuando se complete el flujo de trabajo.

    gcloud dataproc workflow-templates set-managed-cluster wordcount-template \
        --cluster-name=wordcount \
        --single-node \
        --region=us-central1
    

  4. Haga clic en el nombre de wordcount-template en la página Flujos de trabajo de Dataproc para abrir la página Detalles de la plantilla de flujo de trabajo. Confirme los atributos de la plantilla de conteo de palabras.

Parametriza la plantilla de flujo de trabajo.

Parametriza la variable del depósito de entrada que se pasará a la plantilla de flujo de trabajo.

  1. Exporta la plantilla de flujo de trabajo a un archivo de texto wordcount.yaml para la parametrización.
    gcloud dataproc workflow-templates export wordcount-template \
        --destination=wordcount.yaml \
        --region=us-central1
    
  2. Con un editor de texto, abre wordcount.yaml y, luego, agrega un bloque de parameters al final del archivo YAML para que el INPUT_BUCKET_URI de Cloud Storage se pueda pasar como args[1] al conteo de palabras.

    A continuación, se muestra un archivo YAML exportado de muestra. Puedes actualizar uno de estos dos enfoques para actualizar tu plantilla:

    1. Copia y pega todo el archivo para reemplazar tu wordcount.yaml exportado después de reemplazar your-output_bucket por el nombre de tu depósito de salida.
    2. Copia y pega solo la sección parameters al final del archivo wordcount.yaml exportado.
    .
    jobs:
    - hadoopJob:
        args:
        - wordcount
        - gs://input-bucket
        - gs://your-output-bucket/wordcount-output
        mainJarFileUri: file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar
      stepId: count
    placement:
      managedCluster:
        clusterName: wordcount
        config:
          softwareConfig:
            properties:
              dataproc:dataproc.allow.zero.workers: 'true'
    parameters:
    - name: INPUT_BUCKET_URI
      description: wordcount input bucket URI
      fields:
      - jobs['count'].hadoopJob.args[1]
    
  3. Importa el archivo de texto wordcount.yaml parametrizado. Escribe "Y"es ("S"i) cuando se te pida que reemplaces la plantilla.
    gcloud dataproc workflow-templates import  wordcount-template \
        --source=wordcount.yaml \
        --region=us-central1
    

Crea una función de Cloud Functions

  1. Abre la página Cloud Functions en Cloud Console y haz clic en CREAR FUNCIÓN.

  2. En la página Crear función, ingresa o selecciona la siguiente información:

    1. Nombre: Recuento de palabras.
    2. Memoria asignada: Mantén la selección predeterminada.
    3. Trigger:
      • Cloud Storage
      • Tipo de evento: Finalizar/Crear.
      • Depósito: selecciona tu depósito de entrada (consulta Crea un depósito de Cloud Storage en tu proyecto). Cuando se agregue un archivo a este depósito, la función activará el flujo de trabajo. El flujo de trabajo ejecutará la aplicación de recuento de palabras, que procesará todos los archivos de texto en el depósito.
    4. Código de origen:

      • Editor directo
      • Entorno de ejecución: Node.js 8
      • Pestaña INDEX.JS: Reemplaza el fragmento de código predeterminado por el siguiente código y, luego, edita la línea const projectId para proporcionar -your-project-id- (sin un "-" al principio ni al final).
      const dataproc = require('@google-cloud/dataproc').v1;
      
      exports.startWorkflow = (data) => {
       const projectId = '-your-project-id-'
       const region = 'us-central1'
       const workflowTemplate = 'wordcount-template'
      
      const client = new dataproc.WorkflowTemplateServiceClient({
         apiEndpoint: `${region}-dataproc.googleapis.com`,
      });
      
      const file = data;
      console.log("Event: ", file);
      
      const inputBucketUri = `gs://${file.bucket}/${file.name}`;
      
      const request = {
        name: client.workflowTemplatePath(projectId, region, workflowTemplate),
        parameters: {"INPUT_BUCKET_URI": inputBucketUri}
      };
      
      client.instantiateWorkflowTemplate(request)
        .then(responses => {
          console.log("Launched Dataproc Workflow:", responses[1]);
        })
        .catch(err => {
          console.error(err);
        });
      };
      
      • Pestaña PACKAGE.JSON: Reemplaza el fragmento de código predeterminado por el siguiente código.
      {
        "name": "dataproc-workflow",
        "version": "1.0.0",
        "dependencies":{ "@google-cloud/dataproc": ">=1.0.0"}
      }
      
      • Función que se ejecutará: Insert: "startWorkflow".
    5. Haga clic en CREAR.

Prueba la función

  1. Copia el archivo público rose.txt en tu depósito para activar la función. Inserta your-input-bucket-name (el depósito que se usa para activar la función) en el comando.

    gsutil cp gs://pub/shakespeare/rose.txt gs://your-input-bucket-name
    

  2. Espera 30 segundos y ejecuta el siguiente comando para verificar que la función se haya completado con éxito.

    gcloud functions logs read wordcount
    
    ...
    Function execution took 1348 ms, finished with status: 'ok'
    

  3. Para ver los registros de la función desde la página de lista Funciones en Cloud Console, haz clic en el nombre de la función wordcount y, luego, en "VER REGISTROS" en la página Detalles de la función.

  4. Puedes ver la carpeta wordcount-output en tu depósito de salida desde la página Navegador de Storage en Cloud Console.

  5. Una vez que se completa el flujo de trabajo, los detalles del trabajo se conservan en Cloud Console. Haz clic en el trabajo count... que se muestra en la página Trabajos de Dataproc para ver los detalles del trabajo de flujo de trabajo.

Realiza una limpieza

El flujo de trabajo en este instructivo borra su clúster administrado cuando se completa el flujo de trabajo. Para evitar costos recurrentes, puedes borrar otros recursos asociados con este instructivo.

Borra un proyecto

  1. En Cloud Console, ve a la página Administrar recursos.

    Ir a la página Administrar recursos

  2. En la lista de proyectos, selecciona el proyecto que deseas borrar y haz clic en Borrar .
  3. En el cuadro de diálogo, escribe el ID del proyecto y haz clic en Cerrar para borrar el proyecto.

Borra depósitos de Cloud Storage

  1. En Cloud Console, ve a la página Navegador de Cloud Storage.

    Ir a la página Navegador de Cloud Storage

  2. Haz clic en la casilla de verificación del depósito que quieras borrar.
  3. Para borrar el depósito, haz clic en Borrar .

Borra la plantilla de flujo de trabajo

gcloud dataproc workflow-templates delete wordcount-template \
    --region=us-central1

Borra tu función de Cloud Functions

Abre la página Cloud Functions en Cloud Console, selecciona la casilla a la izquierda de la función wordcount y haz clic en BORRAR.

Qué sigue