> For the complete documentation index, see [llms.txt](https://cleyrop.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cleyrop.gitbook.io/docs/projet-data-and-ia/dataflow/analyser-les-executions-et-logs.md).

# Analyser les exécutions et logs

Chaque exécution de Dataflow — qu’elle soit manuelle, planifiée ou événementiel — génère des logs détaillés. Ces logs permettent de suivre pas à pas le déroulement de l’exécution, de repérer les éventuelles erreurs et de diagnostiquer les problèmes.

***

## Accéder aux détails d'une exécution

Depuis la liste des Dataflow, onglet Historique ou depuis l'onglet Exécutions dans la barre d'actions de la branche du Dataflow d'intérêt :

* Choisissez l'exécution à analyser
* Chaque exécution contient :
  * le **statut global** (succès, échec, annulée),
  * la **date et la durée** d’exécution,
  * le **cluster utilisé**,
  * le **déclencheur** (manuel, récurrence, évenement)
  * la **liste des étapes exécutées et les logs associés**
* Vous pouvez cliquer sur la transformation à analyser pour visualiser les logs. Vous pouvez également afficher le code exécuté, les datasets parents ou encore prévisualiser les données

{% hint style="info" %}
Vous pouvez retrouver l'exécution de votre branche en tapant son nom dans la barre de recherche
{% endhint %}

<figure><img src="/files/poqwXKdk7WHorJYx1tvY" alt="" width="563"><figcaption></figcaption></figure>

Depuis le Dataflow, vous pouvez également cliquer sur chaque transformation.

#### File d'attente dans le cluster <a href="#position-dans-la-file-dattente" id="position-dans-la-file-dattente"></a>

Lorsqu’un Dataflow est lancé, son statut passe à `En attente` : il rejoint la **file d’attente du cluster.**

La **position** affichée sous le statut indique son ordre d’exécution. Si la position est n°1, le Dataflow sera exécuté en priorité.

La file d’attente est **partagée par l’ensemble du cluster** :

* Si plusieurs sessions sont disponibles, les Dataflows peuvent s’exécuter en parallèle (une session par Dataflow).
* Si une seule session est active, les Dataflows suivants attendent la fin de l’exécution en cours.

Pour **réduire l’attente**, le Platform Manager peut **ajouter une session**. Celle-ci est prise en compte quasi immédiatement, permettant de débloquer les exécutions en attente.

## Visualiser les résultats

Après chaque exécution (manuelle ou planifiée), vous pouvez **visualiser les résultats :** cliquez sur un **dataset de sortie** pour afficher sa **prévisualisation** (jusqu’à 100 premières lignes) ainsi que son schéma complet (colonnes, types, nullable…).

{% hint style="info" %}
Si la **prévisualisation n’apparaît pas** alors qu’elle devrait, il s’agit souvent d’un problème de schéma
{% endhint %}

## Analyser les logs

### Bonnes pratiques de logging

* Les `print()` des transformations Python sont bien visibles dans les logs. Évitez cependant de les multiplier (notamment sur des DataFrames entiers) pour garder une lecture exploitable.
* Vous pouvez paramétrer le niveau de détail des logs dans votre transformation :

```python
import logging 
root_logger = logging.getLogger()
root_logger.setLevel(logging.INFO)
```

### Repères en cluster Spark

**Diagnostic rapide** : toute erreur entre “Iceberg catalog: cleyrop” (début) et “Table … initialized” (fin de transformation) provient du code de la transformation.

{% code title="log start" %}

```log
INFO - Cleyrop client initialized.
… INFO - Iceberg catalog: cleyrop
```

{% endcode %}

{% code title="log end" %}

```log
… INFO - Table "<techname>.branch_<branche>" initialized
… INFO - Writing dataframe to table "<techname>"
… INFO - Writing mode: "WriteMode.OVERWRITE"
… INFO - Converting PySpark pandas dataframe to Spark dataframe
```

{% endcode %}

### Copier les logs

Vous pouvez **copier les logs** depuis l’interface (clic droit > Copier).

Cela permet de partager le diagnostic avec un autre utilisateur ou avec le support technique.

## Erreurs connues & correctifs

#### **Erreur : `executor lost` ou OOM**

* **Cause** : vient de la **ressource mémoire** (Out Of Memory)
* **Correctifs possibles** :
  * Augmenter la mémoire (RAM) ou le nombre d’exécuteurs alloués au cluster.
  * Si certaines étapes nécessitent l’usage intensif de Pandas (traitements en mémoire locale), il est préférable de les isoler dans un Dataflow distinct, pour limiter la charge sur le cluster principal

#### **Erreur : p**as de preview de Dataset de sortie ou compatibilité schéma

* **Cause** **probable** : compatibilité de schéma, problème d'encodage
* **Correctifs possibles** :
  * Vérifier la [**compatibilité**](/docs/projet-data-and-ia/dataflow/creer-un-dataflow/configurer-un-dataset-de-sortie.md#table-de-compatibilite-schema) entre moteurs / bibliothèque utilisée

#### Autres erreurs

```log
java.lang.UnsupportedOperationException: Not a supported type: void
```

* **Cause** : une colonne entièrement vide.
* **Correctifs possibles** :
  * Remplir la colonne via fillna() (ex. df\['col'].fillna(0)), ou
  * Typer explicitement la colonne via astype() (ex. df.astype({'col': "string"})).

<pre class="language-log"><code class="lang-log"><strong>TypeError: Dataframe must be a PySpark pandas or Spark dataframe
</strong></code></pre>

* **Cause** : la transformation Spark ne retourne pas un DataFrame pandas-on-Spark ou Spark.
* **Correctif** : retourner un pyspark.pandas.DataFrame (ou un pyspark.sql.DataFrame) et utiliser pyspark.pandas plutôt que pandas.

```log
TypeError: 'Dataframe' object has no attribute 'collect'
```

* **Cause** : la transformation Python ne retourne pas un Polars LazyFrame.
* **Correctif** : retourner un polars.lazyframe.frame.LazyFrame (utilisez .lazy() si vous partez d’un DataFrame Polars).

***

## Bonnes pratiques de diagnostic

* Lisez les logs **de bas en haut** : l’erreur la plus récente est souvent la cause principale.
* Si l’erreur concerne une table, vérifiez la **cohérence du schéma** (types ou colonnes manquantes).
* Ajoutez des logs personnalisés dans vos transformations avec `print()` ou `logger.info()` pour contextualiser l’exécution.
