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