Spark: Diffusion variables: Il semble que vous essayez de référence SparkContext à partir d'une émission variable, de l'action, ou de transforamtion
Class ProdsTransformer:
def __init__(self):
self.products_lookup_hmap = {}
self.broadcast_products_lookup_map = None
def create_broadcast_variables(self):
self.broadcast_products_lookup_map = sc.broadcast(self.products_lookup_hmap)
def create_lookup_maps(self):
// The code here builds the hashmap that maps Prod_ID to another space.
pt = ProdsTransformer ()
pt.create_broadcast_variables()
pairs = distinct_users_projected.map(lambda x: (x.user_id,
pt.broadcast_products_lookup_map.value[x.Prod_ID]))
J'obtiens l'erreur suivante:
"Exception: Il semble que vous essayez de référence
SparkContext à partir d'une émission variable, de l'action, ou de transforamtion.
SparkContext peut être utilisé uniquement sur le pilote, pas dans le code de l'exécuter
sur les travailleurs. Pour plus d'informations, voir l'ÉTINCELLE-5063."
D'aide avec la façon de traiter avec la diffusion des variables sera grande!
Ce n'est pas assez de code et/ou des données de l'échantillon pour quelqu'un d'essayer de reproduire l'erreur et/ou le fixer. Aussi, dans le cas où vous n'avez pas remarqué, tous l'indentation est extirpé du python.
J'ai ajouté plus de code.
Je me demande si l'erreur serait de s'en aller si vous avez déplacé le
J'ai besoin de plusieurs cartes.
OK, je pense que l'erreur signifie que l'appel
J'ai ajouté plus de code.
Je me demande si l'erreur serait de s'en aller si vous avez déplacé le
products_lookup_map
des propriétés de ProdsTransformer
instances et au lieu de cela fait un mondial. Avez-vous besoin de plus d'une carte?J'ai besoin de plusieurs cartes.
OK, je pense que l'erreur signifie que l'appel
sc
ou rdd fonctions est interdit au sein des travailleurs, c'est à dire dans toute étincelle de la fonction comme map()
, flatmap()
, reduce()
, etc.... Vous pouvez uniquement appeler sc.something
dans le programme principal. Ainsi, par exemple, vous pouvez enchaîner les cartes, mais vous ne pouvez pas avoir une carte à l'intérieur d'une carte. Et apparemment, la diffusion est en vertu de ce genre de restriction. J'ai vu l'étincelle mutilation des classes personnalisées, et donc il y a quelques loisirs d'instances de la classe sur les travailleurs de données sérialisées qui est déplacé autour.
OriginalL'auteur user3803714 | 2015-07-20
Vous devez vous connecter pour publier un commentaire.
Par la référence à l'objet contenant votre diffusion variable dans votre
map
lambda, Étincelle va tenter de sérialiser l'ensemble de l'objet et de l'expédier aux travailleurs. Depuis l'objet contient une référence à la SparkContext, vous obtenez le message d'erreur. Au lieu de cela:Essayez ceci:
Ce dernier évite la référence à l'objet (
pt
), de sorte que l'Étincelle ne doit expédier la diffusion variable.OriginalL'auteur user2303197