Problème: Je souhaite importer des données dans Spark EMR à partir de S3 en utilisant:
data = sqlContext.read.json("s3n://.....")
Est-il possible de définir le nombre de nœuds que Spark utilise pour charger et traiter les données? Voici un exemple de la façon dont je traite les données:
data.registerTempTable("table")
SqlData = sqlContext.sql("SELECT * FROM table")
Contexte : Les données ne sont pas trop volumineuses, il faut beaucoup de temps pour charger dans Spark et aussi pour interroger. Je pense que Spark partitionne les données en trop de nœuds. Je veux pouvoir régler cela manuellement. Je sais que lorsque je travaille avec des RDD et sc.parallelize
, je peux transmettre le nombre de partitions en entrée. De plus, j'ai vu repartition()
, mais je ne suis pas sûr que cela puisse résoudre mon problème. La variable data
est une DataFrame
dans mon exemple.
Permettez-moi de définir la partition plus précisément. Définition un: communément appelée "clé de partition", dans laquelle une colonne est sélectionnée et indexée pour accélérer la requête (ce n'est pas ce que je veux). Définition 2: (c'est là que je me préoccupe) supposons que vous ayez un jeu de données, Spark décide de le distribuer sur plusieurs nœuds afin qu'il puisse exécuter des opérations sur les données en parallèle. Si la taille des données est trop petite, cela peut ralentir davantage le processus. Comment puis-je définir cette valeur
Par défaut, il se partitionne en 200 jeux. Vous pouvez le changer en utilisant la commande set dans le contexte SQL sqlContext.sql("set spark.sql.shuffle.partitions=10");
. Cependant, vous devez le configurer avec prudence en fonction de vos caractéristiques de données.
Vous pouvez appeler repartition()
sur le cadre de données pour définir des partitions. Vous pouvez même définir spark.sql.shuffle.partitions
cette propriété après avoir créé le contexte Hive ou en passant à spark-submit jar:
spark-submit .... --conf spark.sql.shuffle.partitions=100
ou
dataframe.repartition(100)
Le nombre de partitions "d'entrée" est fixé par la configuration du système de fichiers.
1 fichier de 1Go, avec une taille de bloc de 128M, vous donnera 10 tâches. Je ne suis pas sûr que vous puissiez le changer.
la répartition peut être très mauvaise, si vous avez beaucoup de partitions d'entrée cela va créer beaucoup de shuffle (trafic de données) entre partitions.
Il n'y a pas de méthode magique, vous devez essayer et utiliser l'interface Web pour voir combien de tâches sont générées.