L'essentiel d'Apache Spark

Tirer parti des variables globales

Testez gratuitement nos 1302 formations

pendant 10 jours !

Tester maintenant Afficher tous les abonnements
Vous pouvez définir deux types de variable globale. Il s'agit des variables de broadcast et des accumulateurs. Dans cette vidéo, vous apprendrez à utiliser les variables.
06:56

Transcription

N'oubliez jamais en travaillant avec Spark que ce que vous faites, c'est du traitement distribué. Donc, le code que vous allez générer va être découpé, enfin le code n'est pas découpé, si vous voulez, mais il va être dupliqué, et exécuté sur un certain nombre de threads, et sur un certain nombre de machines. C'est à garder en tête, parce que vous allez toujours penser à votre code de cette façon. Qu'est-ce que je veux dire par là ? Il y a, et vous allez le voir dans la documentation quand vous allez commencer à utiliser le RDD, eh bien il y a des transformations qui sont assez pratiques ou assez générales comme par exemple foreach. Alors vous pourriez vous dire, eh bien au lieu d'utiliser un reduce, je pourrais faire un count d'une variable. Alors si je reprends tout ceci, je vais garder ici mon map, je pourrais dire, ben je pourrais faire un foreach, et, donc je vous fais la vrai syntaxe lambda, donc x, et puis je mettrais ici ... += x. Ce serait le nombre d'occurrences que j'incrémente dans mon foreach. Donc le foreach, ça peut être utilisé pour modifier quelque chose comme une variable, par exemple, pour travailler de façon un peu plus complexe qu'avec le map. Donc mes trois petits points ici, c'est bien entendu quelque chose que j'ai mis ici, c'est pas la syntaxe, c'est pour dire qu'il va falloir placer quelque chose dans ces trois petits points. Donc, je vais exécuter ça qui va faire une erreur, mais juste pour le garder, et puis je pourrais me dire, je me fais une variable. Alors, pas une valeur , mais une variable que j'appellerai i, par exemple, et que j'assigne à 0. Et ensuite, je mettrai mon i ici. Alors on est d'accord, si on garde en tête l'idée du traitement distribué, on se dit non, peut être pas, parce que qu'est-ce qui va se passer ? On va avoir ce code, la variable et le code qui va être envoyé à chaque machine. Cette variable, elle est où ? Elle est locale, elle est globale. Bien non, elle est pas globale, il n'y a pas de variable globale sur laquelle on peut écrire en Spark. Quel est le serveur qui contiendrait cette variable globale ? Peut-être le master, peut être le driver. Non, ce serait totalement impraticable. Ce qu'on va faire ici, c'est qu'on oublie le foreach pour ce genre de choses, de toute façon, le résultat ne sera pas correct. Donc, je vais faire un Entrée juste pour garder ceci, et puis, comment est-ce qu'on va pouvoir faire ? Est-ce qu'il y a un moyen ? Est-ce que Spark nous offre quelque chose ? Oui. Il y a deux types de données globales, on pourrait dire. On a d'abord ce qu'on appelle des variables de broadcast. En fait, c'est plutôt des valeurs dans le sens Scala. Parce que ce que je peux faire, je vais dire val, pour que ce soit une valeur, et puis je vais, admettons que j'ai besoin d'une valeur numérique, par exemple 314, peu importe, eh bien je vais dire, par exemple num = et j'ai mon 314. Je vais pas l'envoyer comme ça. Je vais créer un objet spécifique qui s'appelle une variable de broadcast. Donc je vais prendre mon contexte, Spark contexte. Je vais lui dire, eh bien tu me crées un objet broadcast. Dans son constructeur, je lui dis eh bien tu me donnes 314. Et maintenant, « cast » bien entendu. Et maintenant il y a un objet de type Broadcast[Int] qui a été créé, et cette valeur, cet objet finalement sera envoyé à tous les nœuds de traitement, une seule fois sera conservé, il est donc partagé, il est dupliqué sur chaque nœud de traitement, et il peut être réutilisé. Considérez que c'est l'équivalent d'une constante de votre programme qui doit être accessible sur tous les nœuds. Mais bien entendu, cette valeur ne peut pas être modifiée, ça, ça n'a pas de sens. Par contre, vous pouvez créer un type spécial qui pourra être modifiable, et qui s'appelle un accumulateur. Et donc l'accumulateur c'est un objet qui va être distribué également, qui va s'accumuler sur chaque machine, et ensuite qui sera regroupé et réduit, si vous voulez, directement par Spark. Pour créer cet accumulateur, je vais aussi utiliser la syntaxe val pour une valeur, parce que ce sera quelque chose qui sera imitable localement, et par contre, l'objet lui-même va se débrouiller pour pouvoir s'accumuler sur les différentes machines. Je vais par exemple appeler la valeur acc =. Je vais créer à partir de mon contexte un accumulateur d'un certain type, par exemple un long, donc un entier long. Accumulator, c'est donc ma méthode qui va créer mon accumulateur, et je vais lui donner un nom à l'intérieur du constructeur, ce sera par exemple ("numero"). Ou peut être ("nombre"), c'est un peu plus logique. J'ai donc un accumulateur de type long qui a été créé, vous voyez que c'est dans le namespace spark.util. Et maintenant je peux l'utiliser à l'intérieur de mon foreach, si je reprends mon foreach qui doit être quelque part par là. Je peux utiliser ici mon acc = de deux façons d'ailleurs. Je peux utiliser cette syntaxe, ou bien faire acc.add, il y a une méthode qui permet l'ajout à l'accumulateur. Ce qui se passe, c'est que chaque traite de traitement va incrémenter sa propre copie de l'accumulateur, ne pourra pas la lire, mais c'est le driver plus tard, qui pourra lire la valeur. Alors on va faire ça. Et ici, bon j'ai une erreur qui dit : += n'est pas un membre. Cela dit, mon code n'est pas terrible, parce que je suis en train de faire un map, je récupère des strings et j'accumule avec +=, donc ce qu'il faudrait plutôt déjà, c'est que je fasse un map ici pour obtenir des longueurs, ce serait un peu plus logique, parce que je vais pas accumuler des chaînes, je vais accumuler des valeur numériques, là c'est un long. Donc, je vais reprendre ma longueur, voir si c'est mieux, j'ai toujours pas +=, donc allez, je laisse tomber, mais je fais un add de x, x étant donc la longueur de chaque chaîne. Maintenant, comment est-ce que je récupère la valeur ? Eh bien au niveau de mon driver, et non pas de chaque machine de travail, maintenant je suis sur mon driver, j'ai mon programme qui s'exécute. Eh bien j'ai mon acc.value, cette propriété qui contient le résultat de toutes les accumulations de toutes les machines. Et j'ai donc un 1 209 232 caractères dans tout ça. Donc comme vous travaillez avec un programme qui va être distribué, il faut bien garder ça en tête, et utiliser les bonnes fonctionnalités pour obtenir les bons résultats bien entendu.

L'essentiel d'Apache Spark

Analysez des données volumineuses avec Apache Spark. Chargez vos données pour les analyser, profitez des opérations de transformation et des actions pour agréger vos données, etc.

3h11 (38 vidéos)
Aucun commentaire n´est disponible actuellement
 
Logiciel :
Spécial abonnés
Date de parution :16 mars 2017

Votre formation est disponible en ligne avec option de téléchargement. Bonne nouvelle : vous ne devez pas choisir entre les deux. Dès que vous achetez une formation, vous disposez des deux options de consultation !

Le téléchargement vous permet de consulter la formation hors ligne et offre une interface plus conviviale. Si vous travaillez sur différents ordinateurs ou que vous ne voulez pas regarder la formation en une seule fois, connectez-vous sur cette page pour consulter en ligne les vidéos de la formation. Nous vous souhaitons un excellent apprentissage avec cette formation vidéo.

N'hésitez pas à nous contacter si vous avez des questions !