Dépannage et débogage

Cette page fournit des conseils de dépannage et des stratégies de débogage qui peuvent vous être utiles si vous avez des difficultés à créer ou exécuter votre pipeline Dataflow. Ces informations peuvent vous aider à détecter une défaillance dans un pipeline, à déterminer la raison de l'échec de son exécution et à identifier les mesures correctives possibles.

Dans la mesure où Dataflow vous fournit des informations en temps réel sur votre tâche, les premières mesures de routine consisteront à vérifier les messages d'erreur, à examiner les journaux et à détecter des problèmes éventuels tels que le blocage de la progression de votre tâche.

Pour plus d'informations sur les erreurs courantes que vous êtes susceptible de rencontrer lors de l'exécution de votre tâche Dataflow, consultez la page Guidage d'erreur commun.

Vérifier l'état de votre pipeline

Vous pouvez détecter les éventuelles erreurs dans vos exécutions de pipeline à l'aide de l'interface de surveillance Dataflow.

  1. Accédez à Google Cloud Console.
  2. Sélectionnez votre projet Google Cloud dans la liste des projets.
  3. Cliquez sur le menu dans le coin supérieur gauche.
  4. Accédez à la section Big Data et cliquez sur Dataflow. La liste des tâches en cours apparaît dans le volet de droite.
  5. Sélectionnez la tâche de pipeline à afficher. La colonne Status (État) vous permet de voir l'état de chaque tâche d'un seul coup d'œil : "Running" (En cours d'exécution), "Succeeded" (Réussie) ou "Failed" (Échec).
Figure 1 : Liste de tâches Dataflow dans Developers Console, présentant des tâches dans les états "Running" (En cours d'exécution), "Succeeded" (Réussie) et "Failed" (Échec).

Procédure de base pour résoudre un problème

Si l'une de vos tâches de pipeline échoue, vous pouvez sélectionner la tâche pour afficher des informations plus détaillées sur les erreurs et les résultats d'exécution. Lorsque vous sélectionnez une tâche, vous pouvez afficher les graphiques clés de votre pipeline, le graphique d'exécution, le panneau Job Info (Infos de la tâche) et le panneau Logs (Journaux) avec Job Logs (Journaux de la tâche), Worker logs (Journaux du nœud de calcul) et Diagnostics (Diagnostic).

Vérifier les messages d'erreur liés à la tâche

Pour afficher les journaux de la tâche générés par le code de votre pipeline et par le service Dataflow, cliquez sur dans le panneau inférieur du panneau Logs.

Vous pouvez filtrer les messages qui s'affichent dans Job Logs en cliquant sur Info et sur Filter (Filtre). Pour n'afficher que les messages d'erreur, cliquez sur Info, puis sélectionnez Error (Erreur).

Pour développer un message d'erreur, cliquez sur la section extensible .

Panneau des journaux avec les journaux de la tâche, le diagnostic, le filtre au niveau du journal et le message d'erreur développés en surbrillance.

Vous pouvez également cliquer sur l'onglet Diagnostic. Cet onglet indique où les erreurs se sont produites tout au long de la chronologie choisie, le nombre total d'erreurs consignées et les recommandations possibles pour votre pipeline.

Onglet "Diagnostics" avec deux erreurs signalées.

Afficher les journaux d'étape correspondant à votre tâche

Lorsque vous sélectionnez une étape dans le graphique de votre pipeline, le panneau des journaux passe de l'affichage des journaux de la tâche générés par le service Dataflow à l'affichage des journaux des instances Compute Engine exécutant l'étape sélectionnée du pipeline.

Étape de pipeline sélectionnée avec "Step worker logs" (Journaux de noeud de travail par étape) en surbrillance.

Cloud Logging regroupe tous les journaux collectés des instances Compute Engine de votre projet dans un seul emplacement. Pour plus d'informations sur l'utilisation des différentes fonctionnalités de journalisation de Dataflow, consultez la page Enregistrer les messages de pipeline.

Traiter un rejet de pipeline automatisé

Dans certains cas, le service Dataflow détermine que votre pipeline est susceptible de provoquer des problèmes connus liés au SDK. Pour éviter la soumission de pipelines susceptibles de rencontrer des problèmes, Dataflow rejette automatiquement votre pipeline en affichant le message suivant :

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, après avoir pris connaissance des mises en garde formulées dans les détails du bug fournis en lien, vous souhaitez tout de même tenter d'exécuter votre pipeline, vous avez la possibilité d'annuler ce rejet automatique. Ajoutez l'indicateur --experiments=<override-flag> et soumettez à nouveau votre pipeline.

Déterminer la cause de l'échec d'un pipeline

L'échec de l'exécution d'un pipeline Apache Beam est généralement dû à l'une des causes suivantes :

  • Erreurs liées à la construction du graphique ou du pipeline. De telles erreurs se produisent lorsque Dataflow rencontre un problème à la construction du graphique des étapes qui composent votre pipeline, comme décrit par votre pipeline Apache Beam.
  • Erreurs liées à la validation de la tâche. Le service Dataflow valide toute tâche de pipeline que vous lancez. Des erreurs liées à ce processus de validation peuvent empêcher la création ou l'exécution de votre tâche. Les erreurs de validation peuvent résulter de problèmes liés au bucket Cloud Storage de votre projet Google Cloud ou aux autorisations accordées à ce projet.
  • Exceptions dans le code destiné aux nœuds de calcul. Ces erreurs résultent de la présence d'anomalies ou de bugs dans le code qui est fourni par l'utilisateur et que Dataflow distribue aux nœuds de calcul en parallèle (par exemple, dans les instances DoFn d'une transformation ParDo).
  • Pipelines à exécution ralentie ou absence de sortie. Si votre pipeline fonctionne lentement ou s'il s'exécute pendant une longue période sans générer de résultats, il convient de vérifier vos quotas de sources et de récepteurs de données en flux, en particulier pour Pub/Sub. Notez également que certaines transformations sont mieux adaptées que d'autres aux pipelines traitant de grands volumes de données en flux.
  • Erreurs provoquées par des défaillances transitoires dans d'autres services Google Cloud. Votre pipeline peut échouer en raison d'une panne ou d'un autre problème temporaire survenant dans l'un des services Google Cloud dont dépend Dataflow, tels que Compute Engine ou Cloud Storage.

Détecter les erreurs de construction d'un graphique ou d'un pipeline

Une erreur de construction de graphique peut survenir lorsque Dataflow crée le graphique d'exécution de votre pipeline à partir du code de votre programme Dataflow. Durant la construction du graphique, Dataflow vérifie la validité des opérations spécifiées.

Si Dataflow détecte une erreur dans la construction du graphique, gardez à l'esprit qu'aucune tâche ne sera créée sur le service Dataflow. Par conséquent, vous ne verrez aucun retour dans l'interface de surveillance de Dataflow. Au lieu de cela, vous verrez un message d'erreur semblable au suivant dans la fenêtre de la console ou du terminal sur lequel vous avez exécuté votre pipeline Apache Beam :

Java : SDK 2.x

Par exemple, si votre pipeline tente d'effectuer une opération d'agrégation comme GroupByKey sur une collection PCollection illimitée soumise à un fenêtrage global et dépourvue de déclencheur, un message d'erreur semblable à celui-ci s'affiche :

...
... 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

Par exemple, si votre pipeline utilise des indicateurs de type et qu'un argument de l'une des transformations n'est pas du type attendu, un message d'erreur semblable à celui-ci s'affiche :

... 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 vous rencontrez une telle erreur, vérifiez le code de votre pipeline pour vous assurer que les opérations qu'il contient sont valides.

Détecter des erreurs dans la validation d'une tâche Dataflow

Une fois que le service Dataflow a reçu le graphique de votre pipeline, il tente de valider votre tâche. Cette validation comprend les éléments suivants :

  • Vérification de l'accès par le service aux buckets Cloud Storage associés à votre tâche pour les fichiers temporaires et les sorties intermédiaires
  • Vérification des autorisations requises dans votre projet Google Cloud
  • Vérification de l'accès par le service aux sources d'entrée et de sortie (telles que les fichiers)

Si votre tâche échoue au cours du processus de validation, un message d'erreur apparaît dans l'interface de surveillance de Dataflow, ainsi que dans la fenêtre de votre console ou de votre terminal si vous avez opté pour une exécution bloquante. Le message d'erreur ressemblera à celui-ci :

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

Détecter une exception dans le code distribué aux nœuds de calcul

Durant l'exécution de votre tâche, vous pouvez rencontrer des erreurs ou des exceptions liées au code distribué aux nœuds de calcul. Ces erreurs signifient généralement que les DoFn du code de votre pipeline ont généré des exceptions non gérées, ce qui entraîne l'échec de sous-tâches dans votre tâche Dataflow.

Les exceptions détectées dans le code utilisateur (par exemple, dans vos instances DoFn) sont signalées dans l'interface de surveillance de Dataflow. Si vous avez spécifié l'exécution bloquante pour votre pipeline, des messages d'erreur tels que ceux-ci s'afficheront également dans la fenêtre de votre console ou de votre terminal :

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.

Remarque : En cas d'échec, le service Dataflow relance jusqu'à quatre fois les tâches en mode de traitement par lot, et un nombre illimité de fois les tâches en mode de traitement par flux. En mode de traitement par lot, votre tâche finit par échouer, tandis qu'en mode de traitement par flux, elle peut rester indéfiniment bloquée.

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'

Remarque : En cas d'échec, le service Dataflow relance jusqu'à quatre fois les tâches en mode de traitement par lot, et un nombre illimité de fois les tâches en mode de traitement par flux. En mode de traitement par lot, votre tâche finit par échouer, tandis qu'en mode de traitement par flux, elle peut rester indéfiniment bloquée.

Java : SDK 1.x

Envisagez d'ajouter des gestionnaires d'exceptions pour éviter toute erreur dans votre code. Par exemple, si vous souhaitez supprimer les éléments qui font échouer une validation d'entrée personnalisée effectuée dans une transformation ParDo, traitez l'exception au sein de votre fonction DoFn et supprimez l'élément.

Vous pouvez également suivre les éléments défaillants de différentes manières :

  • Vous pouvez journaliser les éléments défaillants et vérifier la sortie à l'aide de Cloud Logging.
  • Vous pouvez consulter les avertissements ou les erreurs dans les journaux des nœuds de calcul et de démarrage des nœuds de calcul de Dataflow en suivant les instructions figurant dans la section Afficher les journaux.
  • Vous pouvez utiliser votre transformation ParDo pour écrire les éléments défaillants dans une sortie supplémentaire pour inspection ultérieure.

Pour suivre les propriétés d'un pipeline en cours d'exécution, vous pouvez utiliser la classe Metrics comme illustré dans l'exemple suivant :

Java : SDK 2.x

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();
    }
});

Python

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.*')))

Java : SDK 1.x

Résoudre un problème de pipeline ralenti ou d'absence de sortie

Java : SDK 2.x

Si vous avez un pipeline gérant de grands volumes de données en mode de traitement par flux qui s'exécute lentement ou reste bloqué, il convient de vérifier les points suivants :

Quota Pub/Sub

Si votre pipeline lit des entrées provenant de Pub/Sub, il est possible que le quota Pub/Sub de votre projet Google Cloud soit insuffisant. Si votre tâche génère un nombre élevé d'erreurs 429 (Rate Limit Exceeded), cela peut être une indication d'un problème de quota insuffisant. Pour confirmer l'existence de ces erreurs, procédez comme suit :

  1. Accédez à Google Cloud Console.
  2. Dans le volet de navigation de gauche, cliquez sur API et services.
  3. Dans le champ de recherche, recherchez Pub/Sub.
  4. Cliquez sur l'onglet Utilisation.
  5. Vérifiez les codes de réponse et recherchez les codes d'erreur client (4xx).

Utiliser .withFanout dans vos transformations combinées

Si votre pipeline traite des collections PCollection illimitées contenant de grands volumes de données, nous vous recommandons les mesures correctives suivantes :

  • Utilisez Combine.Globally.withFanout à la place de Combine.Globally.
  • Utilisez Combine.PerKey.withHotKeyFanout à la place de Count.PerKey.

Python

Si vous avez un pipeline gérant de grands volumes de données en mode de traitement par flux qui s'exécute lentement ou reste bloqué, il convient de vérifier les points suivants :

Quota Pub/Sub

Si votre pipeline lit des entrées provenant de Pub/Sub, il est possible que le quota Pub/Sub de votre projet Google Cloud soit insuffisant. Si votre tâche génère un nombre élevé d'erreurs 429 (Rate Limit Exceeded), cela peut être une indication d'un problème de quota insuffisant. Pour confirmer l'existence de ces erreurs, procédez comme suit :

  1. Accédez à Google Cloud Console.
  2. Dans le volet de navigation de gauche, cliquez sur API et services.
  3. Dans le champ de recherche, recherchez Pub/Sub.
  4. Cliquez sur l'onglet Utilisation.
  5. Vérifiez les codes de réponse et recherchez les codes d'erreur client (4xx).

Java : SDK 1.x

Utiliser les détails de l'exécution

Si votre tâche est lente ou bloquée, accédez à l'onglet Execution details (Détails de l'exécution).

Cette fonctionnalité vous permet d'inspecter l'exécution de vos tâches par lots. Vous pouvez l'utiliser pour identifier l'étape ou le nœud de calcul qui génère un goulot d'étranglement. Pour en savoir plus, consultez la section Détails de l'exécution.

Identifier les étapes lentes ou bloquées

Pour identifier les étapes lentes ou bloquées, utilisez la vue du workflow de l'étape. Les barres longues indiquent que l'étape a pris plus de temps. Cette vue vous permet d'identifier rapidement les étapes les plus lentes de votre pipeline.

Une fois que vous avez trouvé l'étape du goulot d'étranglement, vous pouvez effectuer les actions suivantes:

  • Identifiez le nœud de calcul à l'origine des lenteurs dans cette étape.
  • S'il n'y a pas de nœuds de calcul lent, identifiez l'étape qui contribue le plus à l'exécution de la phase. Pour déterminer les étapes les plus lentes, utilisez le panneau Informations secondaires. Vous pouvez ensuite identifier les candidats pour l'optimisation du code utilisateur.

Identifier un nœud de calcul lent

Pour identifier un nœud de calcul lent pour une étape spécifique, utilisez la vue Progression du nœud de calcul.

Vous pouvez ainsi voir si tous les nœuds de calcul exécutent toutes les tâches de l'étape ou si l'un d'entre eux est bloqué sur une tâche. Une fois ce nœud de calcul trouvé, vous pouvez effectuer les actions suivantes:

Erreurs courantes et mesures correctives

Pour plus d'informations sur les erreurs courantes que vous êtes susceptible de rencontrer lors de l'exécution de votre tâche Dataflow, consultez la page Guidage d'erreur commun.