web-dev-qa-db-fra.com

Que faire avec "WARN TaskSetManager: Stage contient une tâche de très grande taille"?

J'utilise spark 1.6.1.

Mon spark lit plus de 10000 fichiers parquet stockés dans s3.

val df = sqlContext.read.option("mergeSchema", "true").parquet(myPaths: _*)

myPaths est un Array[String] qui contient les chemins des 10000 fichiers parquet. Chaque chemin est comme ceci s3n://bucketname/blahblah.parquet

Spark prévient un message comme ci-dessous.

WARN TaskSetManager: l'étape 4 contient une tâche de très grande taille (108 Ko). La taille de tâche maximale recommandée est de 100 Ko.

Spark a réussi à exécuter et à terminer le travail de toute façon, mais je suppose que cela peut ralentir le travail de traitement spark.

Quelqu'un at-il une bonne suggestion à propos de ce problème?

10
reapasisow

Le problème est que votre ensemble de données n'est pas réparti également entre les partitions et que certaines partitions ont donc plus de données que d'autres (et donc certaines tâches calculent des résultats plus importants).

Par défaut Spark SQL suppose 200 partitions en utilisant spark.sql.shuffle.partitions propriété (voir Autres options de configuration ):

spark.sql.shuffle.partitions (par défaut: 200) Configure le nombre de partitions à utiliser lors du mélange des données pour les jointures ou les agrégations.

Une solution consiste à coalesce ou repartition votre ensemble de données après avoir lu les fichiers parquet (et avant d'exécuter une action).

Utilisez explain ou l'interface utilisateur Web pour examiner les plans d'exécution.


L'avertissement vous donne un indice pour optimiser votre requête afin que la récupération des résultats plus efficace soit utilisée (voir TaskSetManager ).

Avec l'avertissement, TaskScheduler (qui s'exécute sur le pilote) récupérera les valeurs de résultat en utilisant l'approche moins efficace IndirectTaskResult (comme vous pouvez le voir dans le code ).

9
Jacek Laskowski