web-dev-qa-db-fra.com

Quelle est la taille maximale d'un objet de diffusion dans Spark?

Lorsque vous utilisez la fonction Dataframe broadcast ou les fonctions SparkContext broadcast , quelle est la taille maximale de l'objet qui peut être envoyée à tous les exécuteurs?

10
Kirk Broadhurst

broadcast fonction:

La valeur par défaut est de 10 Mo, mais nous avons utilisé jusqu'à 300 Mo, ce qui est contrôlé par spark.sql.autoBroadcastJoinThreshold .

AFAIK, Tout dépend de la mémoire disponible. il n'y a donc pas de réponse définitive à cela. ce que je dirais, c'est qu'il devrait être inférieur à une grande trame de données et vous pouvez estimer la taille d'une trame de données grande ou petite comme ci-dessous ...

import org.Apache.spark.util.SizeEstimator

logInfo(SizeEstimator.estimate(yourlargeorsmalldataframehere))

sur cette base, vous pouvez passer un indice broadcast au framework.

Jetez également un œil à scala doc from sql/execution/SparkStrategies.scala

qui dit ....

  • Diffusion: si un côté de la jointure a une taille physique estimée qui est inférieure au seuil configurable par l'utilisateur [[SQLConf.AUTO_BROADCASTJOIN_THRESHOLD]] ou si ce côté a un indice de diffusion explicite (par exemple, l'utilisateur a appliqué le
    [[org.Apache.spark.sql.functions.broadcast ()]] vers un DataFrame), puis ce côté de la jointure sera diffusé et l'autre côté sera diffusé, sans mélange
    effectuée. Si les deux côtés sont en dessous du seuil, diffusez le petit côté. Si ni l'un ni l'autre n'est plus petit, BHJ n'est pas utilisé.
  • Shuffle hash join: si la taille moyenne d'une seule partition est suffisamment petite pour construire une table de hachage.
  • Fusion de tri: si les clés de jointure correspondantes sont triables.
  • S'il n'y a pas de clés de jointure, les implémentations de jointure sont choisies avec la priorité suivante:
    • BroadcastNestedLoopJoin: si un côté de la jointure pouvait être diffusé
    • CartésienProduit: pour jointure intérieure
    • BroadcastNestedLoopJoin

Jetez également un œil à other-configuration-options

SparkContext.broadcast (TorrentBroadcast):

la variable partagée broadcast a également une propriété spark.broadcast.blockSize=4M AFAIK il n'y a pas de limitation de noyau dur que j'ai vu pour cela aussi ...

pour plus d'informations pls. voir TorrentBroadcast.scala


ÉDITER :

Cependant, vous pouvez avoir un problème de 2 Go, même si cela n'a pas été officiellement déclaré dans les documents (je n'ai rien pu voir de ce genre dans les documents). les pls regardent SPARK-6235 qui est l'état "EN COURS" & SPARK-6235_Design_V0.02.pdf .

13
Ram Ghadiyaram