comment définir et obtenir des variables statiques à partir d'étincelle?
J'ai une classe comme ceci:
public class Test {
private static String name;
public static String getName() {
return name;
}
public static void setName(String name) {
Test.name = name;
}
public static void print() {
System.out.println(name);
}
}
dans mon Étincelle pilote, je suis en paramètre le nom de ce genre et l'appel de la print()
commande:
public final class TestDriver{
public static void main(String[] args) throws Exception {
SparkConf sparkConf = new SparkConf().setAppName("TestApp");
//...
//...
Test.setName("TestName")
Test.print();
//...
}
}
Cependant, je suis un NullPointerException
. Comment puis-je passer d'une valeur à la variable globale et de l'utiliser?
À partir de votre code c'est complètement étranger à l'Étincelle. Le master est un programme comme un autre et je ne vois pas le problème. Il doit être sur certains omis de code.
J'ai essayé ce sur la norme de l'application java et cela a fonctionné, donc, je suppose que le problème est avec la parallélisation des tâches et de la distribution du comportement de l'Étincelle cadre.
Pouvez-vous mettre la totalité de la trace de la pile? Ce que je veux dire c'est que le problème est probablement dans une ligne, vous n'avez pas mis au-dessus de...
Avec "Variable Globale" voulez-vous dire de la valeur définie une fois sur le conducteur et utilisés dans tous les travailleurs? ou certains mutable structure commune qui est défini et mis à jour, comme le travail progresse?
Notez également que votre exemple, pourrait ne pas être un ensemble minimal de reproduire le problème. Plus probablement, le
J'ai essayé ce sur la norme de l'application java et cela a fonctionné, donc, je suppose que le problème est avec la parallélisation des tâches et de la distribution du comportement de l'Étincelle cadre.
Pouvez-vous mettre la totalité de la trace de la pile? Ce que je veux dire c'est que le problème est probablement dans une ligne, vous n'avez pas mis au-dessus de...
Avec "Variable Globale" voulez-vous dire de la valeur définie une fois sur le conducteur et utilisés dans tous les travailleurs? ou certains mutable structure commune qui est défini et mis à jour, comme le travail progresse?
Notez également que votre exemple, pourrait ne pas être un ensemble minimal de reproduire le problème. Plus probablement, le
Test.print()
est appelée à l'intérieur d'une fermeture pour une Étincelle de l'opération.OriginalL'auteur diplomaticguru | 2015-04-16
Vous devez vous connecter pour publier un commentaire.
Ok, à la base, il y a 2 façons de prendre une valeur connue du maître aux exécuteurs:
Pas besoin d'utiliser des variables statiques dans les deux cas. Mais, si vous NE voulez pas avoir des valeurs statiques disponibles sur votre exécuteur des machines virtuelles, vous devez effectuer l'une de ces:
Espérons que cette aide!
P. S: Comme pour vous d'exception: je ne vois pas ce que le code de l'échantillon, mon pari est qu'elle est présente ailleurs.
Modifier pour plus de précisions: Le paresseux val solution est tout simplement de la Scala, pas d'Étincelle en cause...
Depuis chaque Exécuteur correspond à une JVM, une fois que les classes sont chargées
MyStaticObject
sera initialisé. Lelazy
mot-clé garantit que lesMyStaticValue
variable ne seront initialisés la première fois, il est effectivement demandé, et de conserver sa valeur depuis.Vous êtes accueillis 🙂
pourriez-vous nous donner un exemple de code pour votre première solution? et pourriez-vous donner un exemple, à propos de paresseux val solution
Faites une modification, l'ajout de liens à droite de la documentation avec des exemples et des ajoutée le paresseux val exemple à la fin. Cheers!
J'ai peut-être un peu tard mais... quelle est la différence entre l'utilisation d'un
lazy val
etmapPartitions
en termes de nombre de fois que le code d'initialisation est appelé? PourmapPartitions
il est clair qu'elle est appelée pour chaque partition, mais que dire de lalazy val
tubé? Est-il encore appelée une fois par partition ou, plutôt, une fois par exécuteur testamentaire?OriginalL'auteur Daniel Langdon
La copie de votre classe dans votre processus de pilote n'est pas de la copie dans vos exécuteurs. Ils ne sont pas dans le même
ClassLoader
, ou même la même JVM, ou même sur la même machine. Définition d'une variable statique sur le pilote ne fait rien pour les autres exemplaires, d'où vous trouvez qu'il est nul à distance.comment puis-je gérer cela? tout susgestion? Le même code fonctionne sur Hadoop MapReduce.
et @DanielL, Ok, donc, je suis capable de transmettre et de conserver la valeur par l'appel de la fonction avec flatMap() la méthode. e.g
JavaRDD<String> wordsE = lines .flatMap(new FlatMapFunction<String, String>() { @Override public Iterable<String> call(String s) { Test.setName("TestName") Test.print();
Toutefois, ces fonctions seront appelées pour chaque ligne trouvée dans la RDD. Comment puis-je ne l'appeler qu'une fois? En gros, je suis à la recherche de quelque chose d'équivalent au setup() qui se trouve dans MapReduce.
Ah, bien, au moins il y a un RDD là maintenant! Je pense toujours que vous devez fournir un meilleur exemple de code si vous voulez voir où l'exception se produit, mais maintenant je vois où vous allez avec cette, va poster une réponse...
OriginalL'auteur Sean Owen