apache spark - Comment contrôler la taille de la partition dans Spark SQL




apache-spark hive (2)

J'ai l'obligation de charger les données d'une table Hive à l'aide de Spark SQL HiveContext et de les charger dans HDFS. Par défaut, la sortie DataFrame from SQL comporte 2 partitions. Pour obtenir plus de parallélisme, j'ai besoin de plus de partitions en SQL. Il n'y a pas de méthode surchargée dans HiveContex t pour prendre le paramètre number of partitions.

Le repartitionnement du RDD provoque un remaniement et augmente le temps de traitement.

>

val result = sqlContext.sql("select * from bt_st_ent")

A la sortie du journal de:

Starting task 0.0 in stage 131.0 (TID 297, aster1.com, partition 0,NODE_LOCAL, 2203 bytes)
Starting task 1.0 in stage 131.0 (TID 298, aster1.com, partition 1,NODE_LOCAL, 2204 bytes)

Je voudrais savoir s'il existe un moyen d'augmenter la taille des partitions de la sortie SQL.


Si votre SQL effectue une lecture aléatoire (par exemple, il a une jointure ou une sorte de groupe par), vous pouvez définir le nombre de partitions en définissant la propriété 'spark.sql.shuffle.partitions'.

 sqlContext.setConf( "spark.sql.shuffle.partitions", 64)

Pour faire suite aux suggestions de Fokko, vous pouvez utiliser une variable aléatoire pour effectuer un regroupement.

val result = sqlContext.sql("""
   select * from (
     select *,random(64) as rand_part from bt_st_ent
   ) cluster by rand_part""")

Un problème très commun et douloureux. Vous devriez rechercher une clé qui distribue les données dans des partitions uniformes. Vous pouvez utiliser les opérateurs DISTRIBUTE BY et CLUSTER BY pour indiquer à spark de grouper des lignes dans une partition. Cela entraînera des frais généraux sur la requête elle-même. Mais aboutira à des partitions de taille égale. Deepsense a un très bon tutoriel à ce sujet.







partitioning