web-dev-qa-db-fra.com

Quelle devrait être la valeur optimale pour spark.sql.shuffle.partitions ou comment augmenter les partitions lors de l'utilisation de Spark SQL?

Salut, j'utilise Spark SQL en fait hiveContext.sql() qui utilise le regroupement par requêtes et je rencontre des problèmes de OOM. Donc, penser à augmenter la valeur de spark.sql.shuffle.partitions De 200 par défaut à 1000, mais cela n'aide pas. Veuillez me corriger si je me trompe, ces partitions partageront la charge de mélange de données, donc plus les partitions moins de données à conserver. Veuillez guider Je suis nouveau sur Spark. J'utilise Spark 1.4.0 et j'ai environ 1 To de données non compressées à traiter à l'aide de hiveContext.sql() group by queries.

36
u449355

Si vous manquez de mémoire sur le shuffle, essayez de définir spark.sql.shuffle.partitions à 2001.

Spark utilise une structure de données différente pour la comptabilité aléatoire lorsque le nombre de partitions est supérieur à 2000:

private[spark] object MapStatus {

  def apply(loc: BlockManagerId, uncompressedSizes: Array[Long]): MapStatus = {
    if (uncompressedSizes.length > 2000) {
      HighlyCompressedMapStatus(loc, uncompressedSizes)
    } else {
      new CompressedMapStatus(loc, uncompressedSizes)
    }
  }
...

Je souhaite vraiment qu'ils vous laissent configurer cela indépendamment.

Au fait, j'ai trouvé cette information dans un jeu de diapositives Cloudera .

48
nont

OK, donc je pense que votre problème est plus général. Ce n'est pas spécifique à Spark SQL, c'est un problème général avec Spark où il ignore le nombre de partitions que vous lui dites lorsque les fichiers sont peu nombreux. Spark semble avoir le même nombre de partitions que le nombre de fichiers sur HDFS, sauf si vous appelez repartition. Donc, appeler repartition devrait fonctionner, mais a la mise en garde de provoquant un brassage un peu inutilement.

J'ai soulevé cette question il y a un moment et je n'ai toujours pas obtenu de bonne réponse :(

Spark: augmenter le nombre de partitions sans provoquer de mélange?

9
samthebest

Cela dépend en fait de vos données et de votre requête, si Spark doit charger 1 To, il y a quelque chose de mal dans votre conception.

Utilisez la superbe interface Web pour voir le DAG, voyez comment Spark traduit votre requête SQL en travaux/étapes et tâches).

Les métriques utiles sont "Input" et "Shuffle".

  • Partitionnez vos données (Hive/disposition du répertoire comme/year = X/month = X)
  • Utilisez spark CLUSTER BY fonctionnalité, pour travailler par partition de données
  • Utilisez le format de fichier ORC/Parquet car ils fournissent un "filtre déroulant", les données inutiles ne sont pas chargées dans Spark
  • Analysez Spark Historique pour voir comment Spark lit les données

En outre, OOM pourrait se produire sur votre pilote?

-> c'est un autre problème, le pilote collectera à la fin les données que vous souhaitez. Si vous demandez trop de données, le pilote sera MOO, essayez de limiter votre requête ou écrivez une autre table (syntaxe Spark CREATE TABLE ...AS).

4
Thomas Decaux

Je suis tombé sur ce post de Cloudera sur le partitionnement de la ruche. Consultez la section "Pointeurs" qui parle du nombre de partitions et du nombre de fichiers dans chaque partition entraînant une surcharge du nœud de nom, ce qui pourrait provoquer un MOO.

0
pbahr