Aller au contenu principal

Étape Spark lente avec peu d'E/S

Si vous avez une étape lente avec peu d'E/S, cela pourrait être causé par :

  • Lecture de nombreux petits fichiers
  • Écrire beaucoup de petits fichiers
  • UDF(s) lents
  • Jointure cartésienne
  • Jointure d'éclatement

Presque tous ces problèmes peuvent être identifiés à l'aide du DAG SQL.

Ouvrir le DAG SQL

Pour ouvrir le DAG SQL, faites défiler jusqu'en haut de la page du Job et cliquez sur Requête SQL associée :

ID SQL

Vous devriez maintenant voir le DAG. Sinon, faites défiler un peu et vous devriez le voir :

DAG SLQ

Avant de passer à la suite, familiarisez-vous avec le DAG et l'endroit où le temps est passé. Certains nœuds dans le DAG contiennent des informations temporelles utiles et d'autres non. Par exemple, ce bloc a pris 2,1 minutes et fournit même l'ID de l'étape :

Nœud de phase lente

Ce nœud vous demande de l'ouvrir pour voir qu'il a pris 1,4 minute :

Nœud d'écriture lent

Ces temps sont cumulatifs, il s'agit donc du temps total passé sur toutes les tâches, et non du temps horloge. Mais c'est toujours très utile car ils sont corrélés avec le temps et les coûts.

Il est utile de vous familiariser avec l'endroit du DAG où le temps est passé.

Lecture de nombreux petits fichiers

Si vous constatez que l'un de vos opérateurs d'analyse prend beaucoup de temps, ouvrez-le et recherchez le nombre de fichiers lus :

Lecture de nombreux fichiers

Si vous lisez des dizaines de milliers de fichiers ou plus, vous pourriez avoir un problème de petits fichiers. La taille de vos fichiers doit être d’au moins 8 Mo. Le problème des petits fichiers est le plus souvent causé par un partitionnement sur un trop grand nombre de colonnes ou une colonne à cardinalité élevée.

Si vous avez de la chance, vous n'aurez peut-être qu'à exécuter OPTIMIZE. Databricks vous recommande également d'activer l'optimisation prédictive et de reconsidérer la file layout.

Écriture de nombreux petits fichiers

Si vous constatez que votre écriture prend beaucoup de temps, ouvrez-la et recherchez le nombre de fichiers et la quantité de données écrites :

Écriture de nombreux fichiers

Si vous écrivez des dizaines de milliers de fichiers ou plus, vous risquez d’avoir un problème de petits fichiers. La taille de vos fichiers doit être d’au moins 8 Mo. Le problème des petits fichiers est le plus souvent causé par un partitionnement sur trop de colonnes ou sur une colonne à cardinalité élevée. Vous devez activer l’optimisation prédictive, reconsidérer votre Layout de fichier ou activer les écritures optimisées.

UDF lents

Si vous savez que vous avez des UDF, ou voyez quelque chose de semblable dans votre DAG, vous souffrez peut-être de la lenteur des UDF :

Nœud UDF

Si vous pensez être confronté à ce problème, essayez de commenter votre UDF pour voir comment cela impacte la vitesse de votre pipeline. Si l’UDF est effectivement là où le temps est passé, votre meilleure option est de réécrire l’UDF en utilisant des fonctions natives. Si ce n'est pas possible, tenez compte du nombre de tâches dans l'étape qui exécute votre UDF. Si le nombre est inférieur au nombre de cœurs sur votre cluster, repartition() votre dataframe avant d'utiliser l'UDF :

Python
  (df
.repartition(num_cores)
.withColumn('new_col', udf(...))
)

Les UDF peuvent également souffrir de problèmes de mémoire. Considérez que chaque tâche peut avoir à charger toutes les données de sa partition en mémoire. Si ces données sont trop volumineuses, les choses peuvent devenir très lentes ou instables. Le repartitionnement peut également résoudre ce problème en rendant chaque tâche plus petite.

Jointure cartésienne

Si vous voyez une jointure cartésienne ou une jointure en boucles imbriquées dans votre DAG, vous devez savoir que ces jointures sont très coûteuses. Assurez-vous que c'est ce que vous vouliez et voyez s'il existe une autre solution.

Jointure éclatée ou explosion

Si vous voyez quelques lignes entrer dans un nœud et beaucoup plus en sortir, vous souffrez peut-être d'une jointure explosive ou d'un explode() :

Jointure en explosion

En savoir plus sur les explodes dans le guide d'optimisation Databricks.