Les variables globales dans hadoop
Mon programme suit une itératif map/reduce approche. Et il doit cesser si certaines conditions sont remplies. Est-il de toute façon je peux définir une variable globale qui peut être répartie sur toutes les map/reduce tâches et vérifier si la variable globale atteint la condition d'achèvement.
Quelque chose comme ça.
While(Condition != true){
Configuration conf = getConf();
Job job = new Job(conf, "Dijkstra Graph Search");
job.setJarByClass(GraphSearch.class);
job.setMapperClass(DijkstraMap.class);
job.setReducerClass(DijkstraReduce.class);
job.setOutputKeyClass(IntWritable.class);
job.setOutputValueClass(Text.class);
}
Où condition est une variable globale qui est modifié pendant/après chaque map/reduce exécution.
OriginalL'auteur Deepak | 2010-05-22
Vous devez vous connecter pour publier un commentaire.
Chaque fois que vous exécutez un plan pour réduire de travail, vous pouvez examiner l'état de la sortie, les valeurs contenues dans les comptoirs, etc, et de prendre une décision au niveau du noeud qui est de contrôler l'itération si vous voulez plus d'itération ou pas. Je suppose que je ne comprends pas d'où la nécessité pour un état global provient de votre scénario.
Plus généralement, il existe deux façons principales de l'état est partagé entre l'exécution d'nœuds (bien qu'il doit être noté que le partage de l'état est préférable d'éviter car elle limite l'évolutivité).
Essayez ceci pour une brève intro: philippeadjiman.com/blog/2010/01/07/...
OriginalL'auteur SquareCog
Vous pouvez utiliser de Configuration.set(String name, String value) de définir une valeur, vous serez en mesure d'accéder à votre Mappeurs/Réducteurs/etc:
Dans votre pilote:
Et, par exemple, dans votre mappeur:
Mais ce ne sera probablement pas vous aider à regarder sur la sortie des travaux précédents de décider de démarrer une plus itération. I. e. cette valeur ne sera pas repoussé après l'exécution de la tâche.
Vous pouvez également utiliser Hadoop est DistributedCache pour stocker les fichiers qui seront répartis entre tous les nœuds. C'est un peu mieux que de simplement stocker quelque chose sur HDFS si une valeur que vous allez passer de cette manière est quelque chose de petit.
Bien sûr les compteurs peut également être utilisé à cette fin. Mais ils ne regardent pas trop fiables aux fins de la prise de décisions dans l'algorithme. Ressemble dans certains cas, ils peuvent être incrémenté deux fois (si une tâche a été exécutée plus d'une fois, par exemple en cas de panne ou de spéculation exécution) - je ne suis pas sûr.
OriginalL'auteur Alexey Tigarev
C'est la façon dont il fonctionne dans Hadoop 2.0
Dans votre pilote:
Et dans votre Mappeur:
OriginalL'auteur Nilesh
Vous pouvez utiliser En cascade pour organiser de multiples Hadoop emplois. Spécifier un HDFS chemin où vous souhaitez conserver l'état global de la variable et de l'initialiser avec des feintes de contenu. À chaque itération, lire le contenu actuel de ce HDFS chemin, la suppression de ces contenus, effectuer un certain nombre de map/reduce étapes, et enfin effectuer un mondial de réduire les mises à jour de l'état global de la variable. Selon la nature de votre mission, vous devrez peut-être désactiver l'exécution spéculative et permettent de nombreuses tentatives.
OriginalL'auteur chairmanK