Solución de problemas y depuración

En esta página se proporcionan sugerencias para la solución de problemas y estrategias de depuración que pueden resultarle útiles si tiene problemas para compilar o ejecutar su canalización de Dataflow. Esta información puede ayudarte a detectar un error en la canalización, determinar el motivo por el cual falla una ejecución de la canalización y sugerir algunas acciones para corregir el problema.

Dataflow proporciona comentarios en tiempo real sobre su trabajo y hay un conjunto básico de pasos que puede usar para revisar los mensajes de error y los estados, como el progreso de su trabajo.

Para obtener información sobre los errores comunes que puede encontrar al ejecutar su trabajo de Dataflow, consulte la página Guía sobre errores comunes.

Verifica el estado de la canalización

Puede detectar cualquier error en su canalización mediante la interfaz de supervisión de Dataflow.

  1. Ve a Google Cloud Console.
  2. Selecciona tu proyecto de Google Cloud en la lista de proyectos.
  3. Haz clic en el menú en la esquina superior izquierda.
  4. Ve a la sección Macrodatos y haz clic en Dataflow. Aparece una lista de proyectos en ejecución en el panel de la derecha.
  5. Selecciona el trabajo de canalización que deseas ver. Puedes observar rápidamente el estado del trabajo en el campo Estado (Status): “En ejecución” (Running), “Finalizado correctamente” (Succeeded) o “Con errores” (Failed).
Figura 1: Una lista de los trabajos de Cloud Dataflow en Developers Console con trabajos en los estados en ejecución, finalizado de manera correcta y con errores.

Flujo de trabajo básico para solución de problemas

Si uno de tus trabajos de canalización falla, puedes seleccionar el trabajo para ver información más detallada sobre los errores y ejecutar los resultados. Cuando selecciona un trabajo, puede ver gráficos clave de su canalización, el gráfico de ejecución, el panel Job information y un panel para Job Log, Worker legs y informes de errores de trabajo.

Verifica los mensajes de error de un trabajo

Para expandir los registros de trabajo generados por su código de canalización y el servicio de Dataflow, haga clic en .

Puede filtrar los mensajes que aparecen en Registros de trabajos al hacer clic en Cualquier nivel de registro. Para mostrar solo los mensajes de error, haga clic en Filtro y seleccione Errores.

Para expandir un mensaje de error, haz clic en la sección desplegable .

El panel de registros de trabajos, con los informes de errores de trabajo, el filtro de nivel de registro y la expansión de mensajes de error destacados.

También puedes hacer clic en el panel Informe de errores de trabajos. Este panel muestra dónde se produjeron errores a lo largo del cronograma elegido y un recuento de todos los errores registrados.

Panel de informes de errores de trabajos con dos errores informados

Visualiza los registros de pasos para el trabajo

Cuando selecciona un paso en su gráfico de canalización, el panel de registros cambia de mostrar los registros de trabajo generados por el servicio de Dataflow a mostrar registros de las instancias de Compute Engine que ejecutan su canalización.

Se seleccionó un paso de canalización seleccionado con la opción de registros Step Worker.

Cloud Logging combina todos los registros recopilados de las instancias de Compute Engine de tu proyecto en una ubicación. Consulta Registro de mensajes de canalización para obtener más información sobre cómo usar las diversas funciones de registro de Dataflow.

Controla el rechazo automático de la canalización

En algunos casos, el servicio de Dataflow identifica que su canalización puede desencadenar problemas conocidos del SDK. Para evitar que se canalicen canalizaciones que probablemente tengan problemas, Dataflow rechazará automáticamente su canalización y mostrará el siguiente mensaje:

    The workflow was automatically rejected by the service because it may trigger an
    identified bug in the SDK (details below). If you think this identification is
    in error, and would like to override this automated rejection, please re-submit
    this workflow with the following override flag: [OVERRIDE FLAG].
    Bug details: [BUG DETAILS].
    Contact Google Cloud Support for further help.
    Please use this identifier in your communication: [BUG ID].

Si, después de leer las advertencias en los detalles de error vinculados, quieres seguir tratando de ejecutar tu canalización, puedes anular el rechazo automático. Agrega la marca --experiments=<override-flag> y vuelve a enviar tu canalización.

Determina la causa de error de una canalización

Comúnmente, una ejecución con errores de la canalización en Apache Beam puede atribuirse a una de las siguientes causas:

  • Errores de construcción de grafo o canalización. Estos errores ocurren cuando Dataflow se encuentra con un problema para compilar el gráfico de los pasos que componen su canalización, como lo describe su canalización de Apache Beam.
  • Errores en la validación de un trabajo. El servicio de Dataflow valida cualquier trabajo de canalización que inicie. Los errores en el proceso de validación pueden evitar que tu trabajo se cree o ejecute correctamente. Los errores de validación pueden incluir problemas con el depósito de Cloud Storage de tu proyecto de Google Cloud o con los permisos de tu proyecto.
  • Excepciones en el código del trabajador. Estos errores se producen cuando hay errores o errores en el código proporcionado por el usuario que Dataflow distribuye a los trabajadores paralelos, como las instancias DoFn de una transformación ParDo.
  • Canalizaciones de ejecución lenta o falta de resultado. Si tu canalización se ejecuta lentamente o se ejecuta durante un largo período de tiempo sin informar resultados, puedes verificar tus cuotas de fuentes y receptores de datos de transmisión, como Pub/Sub. También hay algunas transformaciones más adecuadas que otras para canalizaciones de transmisión de gran volumen.
  • Errores causados por fallas transitorias en otros servicios de Google Cloud Tu canalización puede fallar debido a una interrupción temporal u otro problema en los servicios de Google Cloud de los que depende Dataflow, como Compute Engine o Cloud Storage.

Detecta errores de construcción de canalización o grafo

Un error de construcción de un gráfico puede ocurrir cuando Dataflow está compilando el gráfico de ejecución para su canalización a partir del código en su programa de Dataflow. Durante el tiempo de construcción del gráfico, Dataflow comprueba si hay operaciones ilegales.

Si Dataflow detecta un error en la construcción del gráfico, tenga en cuenta que no se creará ningún trabajo en el servicio de Dataflow. Por lo tanto, no verá ningún comentario en la interfaz de supervisión de Dataflow. En cambio, verás un mensaje de error similar al siguiente en la ventana de la consola o terminal en la que ejecutas tu canalización de Apache Beam.

Java: SDK 2.x

Por ejemplo, si tu canalización intenta realizar una agregación como GroupByKey en una entrada PCollection de un sistema de ventanas, no activada y no delimitada globalmente, verás un mensaje de error similar al siguiente:

    ...
    ... Exception in thread "main" java.lang.IllegalStateException:
    ... GroupByKey cannot be applied to non-bounded PCollection in the GlobalWindow without a trigger.
    ... Use a Window.into or Window.triggering transform prior to GroupByKey
    ...
    

Python

Por ejemplo, si tu canalización usa sugerencias de tipo y el tipo de argumento en una de las transformaciones no es el esperado, verás un mensaje de error similar al siguiente:

    ... in <module> run()
    ... in run | beam.Map('count', lambda (word, ones): (word, sum(ones))))
    ... in __or__ return self.pipeline.apply(ptransform, self)
    ... in apply transform.type_check_inputs(pvalueish)
    ... in type_check_inputs self.type_check_inputs_or_outputs(pvalueish, 'input')
    ... in type_check_inputs_or_outputs pvalue_.element_type))
    google.cloud.dataflow.typehints.decorators.TypeCheckError: Input type hint violation at group: expected Tuple[TypeVariable[K], TypeVariable[V]], got <type 'str'>
    

Java: SDK 1.x

Si te encuentras con este error, verifica el código de tu canalización para asegurarte de que la operación de tu canalización sea legal.

Detección de errores en una validación de trabajo de Cloud Dataflow

Una vez que el servicio de Dataflow haya recibido el gráfico de su canalización, el servicio intentará validar su trabajo. Esta validación incluye lo siguiente:

  • Asegurarse de que el servicio pueda acceder a tu trabajo relacionado con los depósitos de Cloud Storage para la etapa de pruebas de archivos y el resultado temporal.
  • Comprobando los permisos necesarios en tu proyecto de Google Cloud.
  • Asegurarse de que el servicio pueda acceder a las fuentes de entrada y salida, como los archivos.

Si su trabajo no supera el proceso de validación, verá un mensaje de error en la interfaz de supervisión de Dataflow, así como en la consola o la ventana de terminal si está ejecutando la ejecución de bloqueo. El mensaje de error será similar al siguiente:

Java: SDK 2.x

    INFO: To access the Dataflow monitoring console, please navigate to
      https://console.developers.google.com/project/google.com%3Aclouddfe/dataflow/job/2016-03-08_18_59_25-16868399470801620798
    Submitted job: 2016-03-08_18_59_25-16868399470801620798
    ...
    ... Starting 3 workers...
    ... Executing operation BigQuery-Read+AnonymousParDo+BigQuery-Write
    ... Executing BigQuery import job "dataflow_job_16868399470801619475".
    ... Stopping worker pool...
    ... Workflow failed. Causes: ...BigQuery-Read+AnonymousParDo+BigQuery-Write failed.
    Causes: ... BigQuery getting table "non_existent_table" from dataset "cws_demo" in project "my_project" failed.
    Message: Not found: Table x:cws_demo.non_existent_table HTTP Code: 404
    ... Worker pool stopped.
    ... com.google.cloud.dataflow.sdk.runners.BlockingDataflowPipelineRunner run
    INFO: Job finished with status FAILED
    Exception in thread "main" com.google.cloud.dataflow.sdk.runners.DataflowJobExecutionException:
      Job 2016-03-08_18_59_25-16868399470801620798 failed with status FAILED
        at com.google.cloud.dataflow.sdk.runners.DataflowRunner.run(DataflowRunner.java:155)
        at com.google.cloud.dataflow.sdk.runners.DataflowRunner.run(DataflowRunner.java:56)
        at com.google.cloud.dataflow.sdk.Pipeline.run(Pipeline.java:180)
        at com.google.cloud.dataflow.integration.BigQueryCopyTableExample.main(BigQueryCopyTableExample.java:74)
    

Python

    INFO:root:Created job with id: [2016-03-08_14_12_01-2117248033993412477]
    ... Checking required Cloud APIs are enabled.
    ... Job 2016-03-08_14_12_01-2117248033993412477 is in state JOB_STATE_RUNNING.
    ... Combiner lifting skipped for step group: GroupByKey not followed by a combiner.
    ... Expanding GroupByKey operations into optimizable parts.
    ... Lifting ValueCombiningMappingFns into MergeBucketsMappingFns
    ... Annotating graph with Autotuner information.
    ... Fusing adjacent ParDo, Read, Write, and Flatten operations
    ... Fusing consumer split into read
    ...
    ... Starting 1 workers...
    ...
    ... Executing operation read+split+pair_with_one+group/Reify+group/Write
    ... Executing failure step failure14
    ... Workflow failed.
    Causes: ... read+split+pair_with_one+group/Reify+group/Write failed.
    Causes: ... Unable to view metadata for files: gs://dataflow-samples/shakespeare/missing.txt.
    ... Cleaning up.
    ... Tearing down pending resources...
    INFO:root:Job 2016-03-08_14_12_01-2117248033993412477 is in state JOB_STATE_FAILED.
    

Java: SDK 1.x

Detecta una excepción en un código de trabajador

Mientras se ejecuta tu trabajo, puedes encontrar errores o excepciones en el código del trabajador. Por lo general, estos errores indican que los DoFn s de su código de canalización generaron excepciones no administradas, lo que dio como resultado tareas fallidas en su trabajo de Dataflow.

Las excepciones en el código de usuario (por ejemplo, sus instancias DoFn) se informan en la interfaz de supervisión de Dataflow. Si ejecutas tu canalización con una ejecución de bloqueo, también verás mensajes de error impresos en la ventana de tu consola o terminal, como el siguiente:

Java: SDK 2.x

    INFO: To access the Dataflow monitoring console, please navigate to https://console.developers.google.com/project/example_project/dataflow/job/2017-05-23_14_02_46-1117850763061203461
    Submitted job: 2017-05-23_14_02_46-1117850763061203461
    ...
    ... To cancel the job using the 'gcloud' tool, run: gcloud beta dataflow jobs --project=example_project cancel 2017-05-23_14_02_46-1117850763061203461
    ... Autoscaling is enabled for job 2017-05-23_14_02_46-1117850763061203461.
    ... The number of workers will be between 1 and 15.
    ... Autoscaling was automatically enabled for job 2017-05-23_14_02_46-1117850763061203461.
    ...
    ... Executing operation BigQueryIO.Write/BatchLoads/Create/Read(CreateSource)+BigQueryIO.Write/BatchLoads/GetTempFilePrefix+BigQueryIO.Write/BatchLoads/TempFilePrefixView/BatchViewOverrides.GroupByWindowHashAsKeyAndWindowAsSortKey/ParDo(UseWindowHashAsKeyAndWindowAsSortKey)+BigQueryIO.Write/BatchLoads/TempFilePrefixView/Combine.GloballyAsSingletonView/Combine.globally(Singleton)/WithKeys/AddKeys/Map/ParMultiDo(Anonymous)+BigQueryIO.Write/BatchLoads/TempFilePrefixView/Combine.GloballyAsSingletonView/Combine.globally(Singleton)/Combine.perKey(Singleton)/GroupByKey/Reify+BigQueryIO.Write/BatchLoads/TempFilePrefixView/Combine.GloballyAsSingletonView/Combine.globally(Singleton)/Combine.perKey(Singleton)/GroupByKey/Write+BigQueryIO.Write/BatchLoads/TempFilePrefixView/BatchViewOverrides.GroupByWindowHashAsKeyAndWindowAsSortKey/BatchViewOverrides.GroupByKeyAndSortValuesOnly/Write
    ... Workers have started successfully.
    ...
    ... org.apache.beam.runners.dataflow.util.MonitoringUtil$LoggingHandler process SEVERE: 2017-05-23T21:06:33.711Z: (c14bab21d699a182): java.lang.RuntimeException: org.apache.beam.sdk.util.UserCodeException: java.lang.ArithmeticException: / by zero
            at com.google.cloud.dataflow.worker.runners.worker.GroupAlsoByWindowsParDoFn$1.output(GroupAlsoByWindowsParDoFn.java:146)
            at com.google.cloud.dataflow.worker.runners.worker.GroupAlsoByWindowFnRunner$1.outputWindowedValue(GroupAlsoByWindowFnRunner.java:104)
            at com.google.cloud.dataflow.worker.util.BatchGroupAlsoByWindowAndCombineFn.closeWindow(BatchGroupAlsoByWindowAndCombineFn.java:191)
    ...
    ... Cleaning up.
    ... Stopping worker pool...
    ... Worker pool stopped.
    

Nota: El servicio de Dataflow reintenta tareas fallidas hasta 4 veces en el modo por lotes y una cantidad ilimitada de veces en el modo de transmisión. En modo por lotes, tu trabajo fallará; en modo de transmisión, podría detenerse indefinidamente.

Python

    INFO:root:Job 2016-03-08_14_21_32-8974754969325215880 is in state JOB_STATE_RUNNING.
    ...
    INFO:root:... Expanding GroupByKey operations into optimizable parts.
    INFO:root:... Lifting ValueCombiningMappingFns into MergeBucketsMappingFns
    INFO:root:... Annotating graph with Autotuner information.
    INFO:root:... Fusing adjacent ParDo, Read, Write, and Flatten operations
    ...
    INFO:root:...: Starting 1 workers...
    INFO:root:...: Executing operation group/Create
    INFO:root:...: Value "group/Session" materialized.
    INFO:root:...: Executing operation read+split+pair_with_one+group/Reify+group/Write
    INFO:root:Job 2016-03-08_14_21_32-8974754969325215880 is in state JOB_STATE_RUNNING.
    INFO:root:...: ...: Workers have started successfully.
    INFO:root:Job 2016-03-08_14_21_32-8974754969325215880 is in state JOB_STATE_RUNNING.
    INFO:root:...: Traceback (most recent call last):
      File ".../dataflow_worker/batchworker.py", line 384, in do_work self.current_executor.execute(work_item.map_task)
      ...
      File ".../apache_beam/examples/wordcount.runfiles/py/apache_beam/examples/wordcount.py", line 73, in <lambda>
    ValueError: invalid literal for int() with base 10: 'www'
    

Nota: El servicio de Dataflow reintenta tareas fallidas hasta 4 veces en el modo por lotes y una cantidad ilimitada de veces en el modo de transmisión. En modo por lotes, tu trabajo fallará; en modo de transmisión, podría detenerse indefinidamente.

Java: SDK 1.x

Se recomienda que agregues controladores de excepciones para protegerte contra los errores de tu código. Por ejemplo, si deseas descartar elementos que producen fallas en una validación de entrada personalizada en ParDo, controla la excepción en tu DoFn y quita el elemento. También puedes hacer seguimiento de los elementos con errores de diferentes formas:

Java: SDK 2.x

  • Para hacer seguimiento de las propiedades de una canalización en ejecución, puedes usar la clase Metrics, como se muestra en el siguiente ejemplo:
        final Counter counter = Metrics.counter("stats", "even-items");
        PCollection<Integer> input = pipeline.apply(...);
        ...
        input.apply(ParDo.of(new DoFn<Integer, Integer>() {
          @ProcessElement
          public void processElement(ProcessContext c) {
            if (c.element() % 2 == 0) {
              counter.inc();
            }
        });
        
  • Puedes registrar los elementos con errores y verificar el resultado mediante Cloud Logging.
  • Puedes hacer que tu ParDo escriba los elementos con errores en un resultado adicional para analizarlo posteriormente.

Python

  • Puedes usar la clase Metrics para seguir las propiedades de una canalización en ejecución, como se muestra en el siguiente ejemplo:
        class FilterTextFn(beam.DoFn):
              """A DoFn that filters for a specific key based on a regex."""
    
              def __init__(self, pattern):
                self.pattern = pattern
                # A custom metric can track values in your pipeline as it runs. Create
                # custom metrics to count unmatched words, and know the distribution of
                # word lengths in the input PCollection.
                self.word_len_dist = Metrics.distribution(self.__class__,
                                                          'word_len_dist')
                self.unmatched_words = Metrics.counter(self.__class__,
                                                       'unmatched_words')
    
              def process(self, element):
                word = element
                self.word_len_dist.update(len(word))
                if re.match(self.pattern, word):
                  yield element
                else:
                  self.unmatched_words.inc()
    
            filtered_words = (
                words | 'FilterText' >> beam.ParDo(FilterTextFn('s.*')))
        
  • Puedes registrar los elementos con errores y verificar el resultado mediante Cloud Logging.
  • Puedes hacer que tu ParDo escriba los elementos con errores en un resultado adicional para analizarlo posteriormente.

Java: SDK 1.x

Solución de problemas de canalizaciones de ejecución lenta o falta de resultado

Java: SDK 2.x

Si tienes una canalización de transmisión de gran volumen, que se ejecuta de forma lenta o se detiene, hay algunos elementos que puedes verificar:

Cuota de Pub/Sub

Si tu canalización lee la entrada de Pub/Sub, es posible que tu proyecto de Google Cloud no tenga suficiente cuota de Pub/Sub. Si tu trabajo genera una gran cantidad de errores 429 (Rate Limit Exceeded), es una indicación de una cuota insuficiente. Prueba los siguientes pasos para comprobar estos errores:

  1. Ve a Google Cloud Console.
  2. En el panel de navegación de la izquierda, haz clic en API y servicios.
  3. En el cuadro de búsqueda, busca Pub/Sub.
  4. Haz clic en la pestaña Uso.
  5. Consulta Códigos de respuesta y busca códigos de error de cliente (4xx).

Usa .withFanout en tus transformaciones de combinación

Si tu canalización procesa entradas PCollection de gran volumen y no delimitadas, recomendamos hacer lo siguiente:

  • Usa Combine.Globally.withFanout en lugar de Combine.Globally.
  • Usa Combine.PerKey.withHotKeyFanout en lugar de Count.PerKey.

Python

Si tienes una canalización de transmisión de gran volumen, que se ejecuta de forma lenta o se detiene, hay algunos elementos que puedes verificar:

Cuota de Pub/Sub

Si tu canalización lee la entrada de Pub/Sub, es posible que tu proyecto de Google Cloud no tenga suficiente cuota de Pub/Sub. Si tu trabajo genera una gran cantidad de errores 429 (Rate Limit Exceeded), es una indicación de una cuota insuficiente. Prueba los siguientes pasos para comprobar estos errores:

  1. Ve a Google Cloud Console.
  2. En el panel de navegación de la izquierda, haz clic en API y servicios.
  3. En el cuadro de búsqueda, busca Pub/Sub.
  4. Haz clic en la pestaña Uso.
  5. Consulta Códigos de respuesta y busca códigos de error de cliente (4xx).

Java: SDK 1.x

Errores comunes y acciones

Para obtener información sobre los errores comunes que puede encontrar al ejecutar su trabajo de Dataflow, consulte la página Guía sobre errores comunes.