2017-02-23 1 views

Répondre

1

optimisation des dataframe est en général en 3 saveurs:

  1. gestion de la mémoire de tungstène
  2. Catalyst optimisation des requêtes
  3. codegen wholestage

gestion de la mémoire de tungstène

Lors de la définition un RDD [myclass], spark n'a pas vraiment de compréhension de myclass. Cela signifie qu'en général chaque ligne contiendra une instance de la classe.

Cela a deux problèmes.

La première est la taille de l'objet. Un objet Java a des frais généraux. Par exemple, une classe de cas qui contient deux entiers simples. Faire une séquence de 1000000 instances et la transformer en RDD prend ~ 26MB tout en faisant la même chose avec dataset/dataframe prend ~ 2MB. En outre, cette mémoire lorsqu'elle est effectuée dans dataset/dataframe n'est pas gérée par garbage collection (elle est gérée comme une mémoire non sécurisée en interne par spark) et aurait donc moins d'impact sur les performances du GC.

Dataset bénéficie des mêmes avantages de gestion de la mémoire de données. Cela dit, lorsque vous effectuez des opérations de jeu de données, la conversion des données de la structure de données interne (Row) à la classe de cas a un impact sur les performances.

optimisation des requêtes Catalyst

Lors de l'utilisation des fonctions de dataframes, étincelle sait ce que vous essayez de faire et peut parfois modifier votre requête à un poste équivalent, qui est plus efficace.

Disons par exemple que vous faites quelque chose comme:. df.withColumn ("A", éclairé (1)) filtre ($ "b" < ($ "a" + 1)).

Fondamentalement, vous vérifiez si (x < 1 + 1). Spark est assez intelligent pour comprendre cela et le changer en x < 2.

Ce type d'opérations ne peut pas être effectué lorsque vous utilisez des opérations de jeu de données car l'étincelle n'a aucune idée sur l'intérieur des fonctions que vous êtes en train de faire.

codegen wholestage

Quand étincelle sait ce que vous faites, il peut effectivement générer du code plus efficace. Cela peut améliorer les performances d'un facteur 10 dans certains cas.

Cela ne peut pas non plus être fait sur les fonctions de l'ensemble de données car l'étincelle ne connaît pas les fonctions internes des fonctions.