Detén una canalización de Dataflow en ejecución

Para detener un trabajo de Dataflow, puedes usar la consola de Google Cloud, Cloud Shell, una terminal local instalada con Google Cloud CLI o la API de REST de Dataflow

Puedes detener un trabajo de Dataflow de una de las siguientes tres maneras:

  • Cancelar un trabajo. Este método se aplica a las canalizaciones de transmisión y por lotes. Cancelar un trabajo hace que el servicio de Dataflow deje de procesar todos los datos, incluidos los datos almacenados en búfer. Para obtener más información, consulta Cancela un trabajo.

  • Vaciar un trabajo. Este método solo se aplica a las canalizaciones de transmisión. Vaciar un trabajo permite que el servicio de Dataflow termine de procesar los datos almacenados en búfer y, al mismo tiempo, detiene la transferencia de datos nuevos. Para obtener más información, consulta Desvía un trabajo.

  • Forzar la cancelación de un trabajo. Este método se aplica a las canalizaciones de transmisión y por lotes. Cuando se fuerza la cancelación de un trabajo, el servicio de Dataflow deja de procesar datos de forma inmediata, incluidos los almacenados en búfer. Antes de forzar la cancelación, primero debes intentar una cancelación regular. La cancelación forzada solo está diseñada para trabajos que se detuvieron en el proceso de cancelación regular. Para obtener más información, consulta Fuerza la cancelación de un trabajo.

Cuando cancelas un trabajo, no puedes reiniciarlo. Si no usas plantillas de Flex, puedes clonar la canalización cancelada y, luego, iniciar un trabajo nuevo desde la canalización clonada.

Antes de detener una canalización de transmisión, considera crear una instantánea del trabajo. Las instantáneas de Dataflow guardan el estado de una canalización de transmisión, por lo que puedes iniciar una versión nueva de tu trabajo de Dataflow sin perder el estado. Para obtener más información, consulta Usa instantáneas de Dataflow.

Si tienes una canalización compleja, considera crear una plantilla y ejecutar el trabajo a partir de la plantilla.

No puedes borrar trabajos de Dataflow, pero puedes archivar trabajos completados. Todos los trabajos completados se borran después de un período de retención de 30 días.

Cancela un trabajo de Dataflow

Cuando cancelas un trabajo, el servicio de Dataflow lo detiene de inmediato.

Las siguientes acciones ocurren cuando cancelas un trabajo:

  1. El servicio de Dataflow detiene toda la transferencia y el procesamiento de datos.

  2. El servicio de Dataflow comienza a limpiar los recursos de Google Cloud conectados con tu trabajo.

    Estos recursos podrían incluir el cierre de las instancias de trabajador de Compute Engine y el cierre de conexiones activas a fuentes o receptores de E/S.

Información importante sobre cómo cancelar un trabajo

  • Cancelar un trabajo detiene de inmediato el procesamiento de la canalización.

  • Es posible que pierdas datos en tránsito cuando cancelas un trabajo. Los datos en tránsito se refieren a los datos que ya se leyeron, pero que la canalización aún está procesando.

  • Es posible que los datos escritos desde la canalización en un receptor de salida antes de que canceles el trabajo aún estén disponibles en tu receptor de salida.

  • Si la pérdida de datos no es una preocupación, cancelar tu trabajo garantiza que los recursos de Google Cloud asociados con tu trabajo se cierren lo antes posible.

Vacía un trabajo de Dataflow

Cuando vacías un trabajo, el servicio de Dataflow finaliza el trabajo en su estado actual. Si deseas evitar la pérdida de datos a medida que desactivas las canalizaciones de transmisión, la mejor opción es vaciar el trabajo.

Las siguientes acciones ocurren cuando vacías un trabajo:

  1. El trabajo deja de transferir datos nuevos de las fuentes de entrada poco después de recibir la solicitud de desvío (por lo general, dentro de unos minutos).

  2. El servicio de Dataflow conserva todos los recursos existentes, como las instancias de trabajador, para terminar de procesar y escribir los datos almacenados en búfer en tu canalización.

  3. Cuando se completan todas las operaciones de procesamiento y escritura pendientes, el servicio de Dataflow cierra los recursos de Google Cloud que están asociados con tu trabajo.

Para desviar tu trabajo, Dataflow deja de leer la entrada nueva, marca la fuente con una marca de tiempo de evento infinito y, luego, propaga marcas de tiempo infinitas a través de la canalización. Por lo tanto, las canalizaciones en el proceso de desvío pueden tener una marca de agua infinita.

Información importante sobre el desvío de un trabajo

  • No se admite el vaciado de un trabajo para las canalizaciones por lotes.

  • La canalización continúa incurriendo en el costo de mantener los recursos de Google Cloud asociados hasta que finalice todo el procesamiento y la escritura.

  • Puedes actualizar una canalización que se está vaciando. Si la canalización está atascada, actualizarla con un código que corrige el error que crea el problema permite un desvío exitoso sin pérdida de datos.

  • Puedes cancelar un trabajo que se esté vaciando en este momento.

  • Vaciar un trabajo puede tomar una cantidad significativa de tiempo en completarse, como cuando tu canalización tiene una gran cantidad de datos almacenados en búfer.

  • Si tu canalización de transmisión incluye una Splittable DoFn, debes truncar el resultado antes de ejecutar la opción de vaciado. Para obtener más información para truncar Splittable DoFns, consulta la documentación de Apache Beam.

  • En algunos casos, es posible que un trabajo de Dataflow no pueda completar la operación de vaciado. Puedes consultar los registros de trabajos para determinar la causa raíz y tomar las medidas adecuadas.

Retención de datos

  • La transmisión de Dataflow tolera el reinicio de los trabajadores y no falla los trabajos de transmisión cuando se producen errores. En su lugar, el servicio de Dataflow volverá a intentarlo hasta que realices una acción, como cancelar o reiniciar el trabajo. Cuando vacías el trabajo, Dataflow continúa solucionando, lo que puede provocar que las canalizaciones se detengan. En esta situación, para habilitar un desvío correcto sin pérdida de datos, actualiza la canalización con código que corrija el error que crea el problema.

  • Dataflow no confirma recepción de los mensajes hasta que el servicio de Dataflow los confirma de manera duradera. Por ejemplo, con Kafka, puedes ver este proceso como una transferencia segura de la propiedad del mensaje de Kafka a Dataflow, lo que elimina el riesgo de pérdida de datos.

Trabajos bloqueados

  • El desvío no soluciona las canalizaciones bloqueadas. Si el movimiento de datos está bloqueado, la canalización permanece bloqueada después del comando de desvío. Para abordar una canalización atascada, usa el comando update a fin de actualizar la canalización con código que resuelva el error que crea el problema. También puedes cancelar los trabajos atascados, pero la cancelación de ellos puede provocar la pérdida de datos.

Cronómetros

  • Si el código de tu canalización de transmisión incluye un temporizador de bucle, el trabajo puede ser lento o no se puede desviar. Debido a que el desvío no finaliza hasta que se completen todos los temporizadores, las canalizaciones con temporizadores de bucles infinitos nunca terminan de vaciar.

  • Dataflow espera hasta que todos los temporizadores de tiempo de procesamiento se completen en lugar de activarlos de inmediato, lo que puede provocar desvíos lentos.

Efectos de desviar un trabajo

Cuando vacías una canalización de transmisión, Dataflow cierra de inmediato cualquier ventana en proceso y activa todos los activadores.

El sistema no espera a que finalicen las ventanas pendientes basadas en el tiempo en una operación de vaciado.

Por ejemplo, si tu canalización está a diez minutos de una ventana de dos horas cuando emites el comando Desviar, Dataflow no espera a que termine el resto de la ventana. La ventana se cierra de forma inmediata con resultados parciales. Dataflow hace que las ventanas abiertas se cierren porque avanza la marca de agua de los datos al infinito. Esta función también se puede usar con fuentes de datos personalizadas.

Cuando desvías una canalización que usa una clase de fuente de datos personalizada, Dataflow deja de emitir solicitudes de datos nuevos, avanza la marca de agua de los datos al infinito y llama al método finalize() de tu fuente en el último punto de control.

El desvío puede dar como resultado ventanas llenas de forma parcial. En ese caso, si reinicias la canalización desviada, la misma ventana podría activarse por segunda vez, lo que puede causar problemas con tus datos. Por ejemplo, en el siguiente caso, los archivos podrían tener nombres en conflicto y los datos podrían reemplazarse:

Si desvías una canalización con un sistema de ventanas por hora a las 12:34 p.m., la ventana de 12:00 p.m. a 1:00 p.m. se cierra solo con los datos que se activan en los primeros 34 minutos de la ventana. La canalización no lee datos nuevos después de las 12:34 p.m.

Si reinicias la canalización de inmediato, la ventana de 12:00 p.m. a 1:00 p.m. se vuelve a activar, con solo los datos que se leyeron de 12:35 p.m. a 1:00 p.m. No se envían duplicados, pero si se repite un nombre de archivo, los datos se reemplazan.

En la consola de Google Cloud, puedes ver los detalles de las transformaciones de tu canalización. En el siguiente diagrama, se muestran los efectos de una operación de desvío en proceso. Ten en cuenta que la marca de agua avanzó al valor máximo.

Vista de un paso de una operación de vaciado.

Figura 1. Vista de un paso de una operación de vaciado.

Fuerza la cancelación de un trabajo de Dataflow

Fuerza la cancelación solo cuando no puedas cancelar tu trabajo con otros métodos. La cancelación forzada finaliza el trabajo sin limpiar todos los recursos. Si usas la cancelación forzada, los recursos filtrados podrían acumularse y los recursos filtrados usan tu cuota.

Cuando fuerzas la cancelación de un trabajo, el servicio de Dataflow detiene el trabajo de inmediato y filtra las VM que creó el trabajo de Dataflow. Debes intentar cancelar de forma regular al menos 30 minutos antes de forzarla.

Las siguientes acciones ocurren cuando fuerzas la cancelación de un trabajo:

  • El servicio de Dataflow detiene toda la transferencia y el procesamiento de datos.

Información importante sobre cómo forzar la cancelación de un trabajo

  • Cuando fuerzas la cancelación de un trabajo, se detiene de inmediato el procesamiento de la canalización.

  • La cancelación forzada de un trabajo solo se diseñó para los trabajos bloqueados en el proceso de cancelación normal.

  • Las instancias de trabajador que creó el trabajo de Dataflow no siempre se liberan, lo que puede provocar filtraciones de instancias de trabajador. Las instancias de trabajador filtradas no contribuyen a los costos del trabajo, pero pueden usar tu cuota. Una vez que se completa la cancelación del trabajo, puedes borrar estos recursos.

    En el caso de los trabajos de Dataflow Prime, no puedes ver ni borrar las VM que se filtraron. En la mayoría de los casos, estas VM no crean problemas. Sin embargo, si las VM filtradas causan problemas, como el consumo de la cuota de VM, comunícate con el equipo de asistencia.

Detén un trabajo de Dataflow

Antes de detener un trabajo, debes comprender los efectos de cancelar, desviar o forzar la cancelación de un trabajo.

Console

  1. Ve a la página Trabajos de Dataflow.

    Ir a Trabajos

  2. Haz clic en el trabajo que deseas detener.

    Para detener un trabajo, su estado debe ser En ejecución.

  3. En la página de detalles del trabajo, haz clic en Detener.

  4. Realice una de las acciones siguientes:

    • En una canalización por lotes, haz clic en Cancelar o Forzar cancelación.

    • En una canalización de transmisión, haz clic en Cancelar, Desviar o Forzar cancelación.

  5. Para confirmar tu elección, haz clic en Detener trabajo.

gcloud

Para vaciar o cancelar un trabajo de Dataflow, puedes usar el comando gcloud dataflow jobs en Cloud Shell o en una terminal local instalada con gcloud CLI.

  1. Accede a tu shell.

  2. Enumera los ID de los trabajos de Dataflow que se encuentran en ejecución y, luego, toma nota del ID del trabajo que deseas detener:

    gcloud dataflow jobs list
    

    Si no se configura la marca --region, se muestran los trabajos de Dataflow de todas las regiones disponibles.

  3. Realice una de las acciones siguientes:

    • Para vaciar un trabajo de transmisión, sigue estos pasos:

      gcloud dataflow jobs drain JOB_ID
      

      Reemplaza JOB_ID por el ID de trabajo que copiaste antes.

    • Para cancelar un trabajo por lotes o de transmisión, haz lo siguiente:

      gcloud dataflow jobs cancel JOB_ID
      

      Reemplaza JOB_ID por el ID de trabajo que copiaste antes.

    • Para forzar la cancelación de un trabajo por lotes o de transmisión, haz lo siguiente:

      gcloud dataflow jobs cancel JOB_ID --force
      

      Reemplaza JOB_ID por el ID de trabajo que copiaste antes.

API

Para cancelar o vaciar un trabajo con la API de REST de Dataflow, puedes elegir projects.locations.jobs.update o projects.jobs.update. En el cuerpo de la solicitud, pasa el estado del trabajo requerido en el campo requestedState de la instancia de trabajo de la API elegida.

Importante: Se recomienda usar projects.locations.jobs.update, ya que projects.jobs.update solo permite actualizar el estado de los trabajos que se ejecutan enus-central1.

  • Para cancelar el trabajo, establece su estado en JOB_STATE_CANCELLED.

  • Para desviar el trabajo, establece su estado en JOB_STATE_DRAINED.

  • Para forzar la cancelación del trabajo, establece el estado del trabajo en JOB_STATE_CANCELLED con la etiqueta "force_cancel_job": "true". El cuerpo de la solicitud es el siguiente:

    ​​{
      "requestedState": "JOB_STATE_CANCELLED",
      "labels": {
        "force_cancel_job": "true"
      }
    }
    

Detecta la finalización de un trabajo de Dataflow

Para detectar cuándo se completó la cancelación o el desvío de trabajos, usa uno de los siguientes métodos:

  • Usa un servicio de organización de flujos de trabajo como Cloud Composer para supervisar el trabajo de Dataflow.
  • Ejecuta la canalización de forma síncrona para que las tareas se bloqueen hasta que se complete la canalización. Para obtener más información, consulta Controla los modos de ejecución en la configuración de las opciones de canalización.
  • Usa la herramienta de línea de comandos en Google Cloud CLI para sondear el estado del trabajo. Para obtener una lista de todos los trabajos de Dataflow de su proyecto, ejecute el siguiente comando en su shell o terminal:

    gcloud dataflow jobs list
    

    En el resultado, se muestra el ID del trabajo, el nombre (STATE) y otra información para cada trabajo. Para obtener más información, consulta Usa la interfaz de línea de comandos de Dataflow.

Archiva trabajos de Dataflow

Cuando archivas un trabajo de Dataflow, este se quita de la lista de trabajos en la página Trabajos de Dataflow en la consola. El trabajo se mueve a una lista de trabajos archivados. Solo puedes archivar trabajos completados, que incluyen trabajos en los siguientes estados:

  • JOB_STATE_CANCELLED
  • JOB_STATE_DRAINED
  • JOB_STATE_DONE
  • JOB_STATE_FAILED
  • JOB_STATE_UPDATED

Para obtener más información, consulta Detecta la finalización de un trabajo de Dataflow en este documento. Para obtener información sobre la solución de problemas, consulta Archiva errores de trabajos en “Soluciona errores de Dataflow”.

Todos los trabajos completados se borran después de un período de retención de 30 días.

Archiva un trabajo

Sigue estos pasos para quitar un trabajo completado de la lista de trabajos principales en la página Trabajos de Dataflow.

Consola

  1. En la consola de Google Cloud, ve a la página Trabajos de Dataflow.

    Ir a Trabajos

    Aparecerá una lista de trabajos de Dataflow junto con su estado.

  2. Selecciona un trabajo.

  3. En la página Detalles del trabajo, haz clic en Archivar. Si el trabajo no se completó, la opción Archivar no estará disponible.

API

Para archivar trabajos con la API, usa el campo JobMetadata. En el campo JobMetadata, para userDisplayProperties, usa el par clave-valor "archived":"true".

Tu solicitud a la API también debe incluir el parámetro de búsqueda updateMask.

curl --request PUT \

"https://dataflow.googleapis.com/v1b3/projects/PROJECT_ID/locations/REGION/jobs/JOB_ID/?updateMask=job_metadata.user_display_properties._archived" \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  --data
'{"job_metadata":{"userDisplayProperties":{"archived":"true"}}}' \
  --compressed

Reemplaza lo siguiente:

  • PROJECT_ID: el ID de tu proyecto
  • REGION: una región de Dataflow
  • JOB_ID: el ID de tu trabajo de Dataflow.

Visualiza y restablece trabajos archivados

Sigue estos pasos para ver los trabajos archivados o restablecer los trabajos archivados en la lista de trabajos principales de la página Trabajos de Dataflow.

Consola

  1. En la consola de Google Cloud, ve a la página Trabajos de Dataflow.

    Ir a Trabajos

  2. Haz clic en el botón de activación Archivar. Aparecerá una lista de los trabajos archivados de Dataflow.

  3. Selecciona un trabajo.

  4. Para restablecer el trabajo en la lista de trabajos principales en la página Trabajos de Dataflow, en la página Detalles del trabajo, haz clic en Restablecer.

API

Para restablecer trabajos con la API, usa el campo JobMetadata. En el campo JobMetadata, para userDisplayProperties, usa el par clave-valor "archived":"false".

Tu solicitud a la API también debe incluir el parámetro de búsqueda updateMask.

curl --request PUT \

"https://dataflow.googleapis.com/v1b3/projects/PROJECT_ID/locations/REGION/jobs/JOB_ID/?updateMask=job_metadata.user_display_properties._archived" \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  --data
'{"job_metadata":{"userDisplayProperties":{"archived":"false"}}}' \
  --compressed

Reemplaza lo siguiente:

  • PROJECT_ID: el ID de tu proyecto
  • REGION: una región de Dataflow
  • JOB_ID: el ID de tu trabajo de Dataflow.

¿Qué sigue?