Un peu d’histoire

Infrastructure

Big data = gros disque ?

HDD : est un boîtier contenant une série de plateaux recouverts d’un revêtement ferromagnétique. La direction de l’aimantation représente les éléments binaires individuels. Les données sont lues et écrites par une tête (similaire à ce que peu faire une platine vinyle avec un disque) qui se déplace extrêmement rapidement d’une zone du disque à l’autre. Étant donné que toutes ces pièces sont « mécaniques », le disque dur est le composant le plus lent de tout ordinateur et le plus fragile.

SSD : ces types de disques stockent des informations sur une mémoire flash composée de cellules de mémoire individuelles stockant des éléments binaires qui sont instantanément accessibles par le contrôleur.

C’est quoi un controleur disque?

Il s’agit d’un ensemble électronique qui contrôle la mécanique d’un disque dur. Son rôle est de piloter les moteurs de rotation, de positionner les têtes de lecture/enregistrement, et d’interpréter les signaux électriques reçus de ces têtes pour les convertir en données exploitables ou d’enregistrer des données à un emplacement particulier de la surface des disques composant le disque dur.

Evolution du stockage à travers le temps:

HDDSSD
Années1956197019801990200020102020
Format50 plateaux de 24″5,25”3,5″3,5″2,5″2,5″2,5″
Volume Max5 MB60 MB446 MB1000 MB18 000 MB4 000 000 MB20 000 000 MB4 000 000 MB
Débit théorique8 800 caractères/s625 Ko/s0.7 Mb/s9.5 Mb/s110 Mb/s200Mb/s500 Mb/s
Prix pour 1 Mo1mo 10 000 $1mo 193 $1 mo 9 $1 Go 2 €1 Go 0.10€ 1Go 0.02€1Go
0.15€
Rapport Volume Max/Débit713.614281894363631000008000

Dans le cas de stockage sur fichier il vaut mieux privilégier les petits disques durs plus précisément ceux ayant le meilleur ratio volume/débit.

Note: il est possible de connaitre le type de disque dur de votre machine via la commande “lsblk -d -o name,rota” (HDD rota=1, SSD rota=0)

Quelques exemples de Stockages:

permet de stocker des fichiers bruts ou structurés via le format Parquet.

est un site d’hébergement de fichiers. Son API est accéssible via REST / SOAP ou encore BitTorent.

est la Rolls Royces des systémes de gestion de base de données(NoSQL). Elle est conçu pour gérer des quantités massives de données sur un grand nombre de serveurs, assurant une haute disponibilité en éliminant les points de défaillance. Il permet de répartir les données sur plusieurs centres, avec une réplication asynchrone sans nœud maître et une faible latence pour les opérations de tous les clients.

Ce qu’il faut retenir de la partie Stockage:

Intéressez-vous au controleur de votre disque et rien ne sert de prendre des disques de trop grand volume le plus important reste le ratio volume/débit.

Et le Réseaux dans tout ça ?

La carte réseau assure l’interface entre l’équipement et les machines connectées sur le même réseau. Les débits s’expriment généralement en Mbit/s (mégabites par seconde : millions de bits par seconde).

Les débits actuels du standard Ethernet sont :

  • 10 Mbit/s ;
  • 100 Mbit/s (Fast Ethernet) ;
  • 1 000 Mbit/s parfois également noté 1 Gbit/s (Gigabit Ethernet) ;
  • 10 000 Mbit/s (10 Gigabit Ethernet).

Y-a-t’il des éléments à prendre en compte entre réseau et disques ?

Il est important de garder en tête que le controleur réseaux est une contraintes.

Supposons que nous disposons de l’Ethernet 1Gb en Full Duplex (émission et réception simultanée).

Note: Spark préconise un éthernet de 10 GB

Et si on mettait nos noeuds sur un gros clusters avec des VM ou des conteneurs ?

La virtualisation tout comme la conteneurisation est une abstraction du matériel. En choisissant cette méthode nous perdons le contrôle de notre infrastructure. De plus nous sommes toujours contraint aux mêmes problématiques du goulot d’étranglement du controleur réseaux

Note: Lorsque qu’un applicatif hébergé sur VM à besoin d’accéder à du matériel, l’OS hébergé opère un certains nombre de convertions avec son OS host. Cela implique de la latence et du travail CPU.

L’idée est d’avoir une architecture composée de petites machines dites “jetables”. Ne jamais acheter de grosses machines !

Note: Il est recommandé de désactiver le swap

Mais comment accéder à la données ?

Il existe plusieurs outils pour exploiter de la données Big Data.

  • ETL (Apache Pig, Talend, …)
  • Framework imposant le pattern Actor (VertX, Spring Reactor, Akka)
  • Streaming (Kafka, Flink)
  • Et celui qui nous intéresse, Spark !

Note: Il est important de comprendre que le stockage et le calcul vont de paire comme Bonnie and Clyde, Tintin et Milou… L’un ne va pas sans l’autre!

L’architecture de Spark se repose sur le calcul distribué

L’idée de Spark est de répartir la charge de calcul et mémoire, sur l’ensemble des machines. Attention, toutes les opérations ne sont pas toujours décomposables. Elle doit être commutative (x*y = y*x) et associative ((x*y)*z = x*(y*z).

Pour illustrer nos propos prenons l’exemple de l’addition 351 + 128 et appliquons la méthode de calcul par rang (centaines, dizaines, unités).

Une génération de rapport trop gourmande:

Je suis dans une entreprise qui génère des rapports nécéssitant une empreinte mémoire de 64GB. Je dispose d’une infrastructure composée d’un rac de 128 GB sur lequel j’ai 2 instances (2 * 64) . Tout ce passe pour le mieux, jusqu’au jour ou le métier demande de générer d’avantage de données. Que dois-je faire ? Acheter un nouveau rac plus puissant ?

L’option du parallélisme:

Je décide plutot d’acheter 10 machines de 16 GB de RAM. Ce qui nous permettra de générer des rapports ayant une empreinte de 160 GB. Plutôt que d’avoir une seule grosse machine avec 120Gb ! Spark répartit le calcul et l’empreinte mémoire !

Note: Ne pas oublier que la scalabilité verticale est rarement la solution, au contraire dans la grande majorité des cas elle vous causera des problèmes!

Cette fois les contraintes matériels ne sont pas les mêmes, c’est la RAM qu’il faut favoriser.

Quelques exemples d’architecture:

  • La plus courante: 1 cluster Spark + 1 cluster de stockage
  • Ségreguée: 1 cluster Spark pour l’insertion + 1 cluster Spark de report + 1 cluster de stockage
  • La plus performante: 1 cluster mutualisant Spark et Stockage (Cassandra). Elle nécessite des noeuds disposant de beaucoup de RAM et de très bon disques.

Ce qu’il faut retenir de la partie calcul:

Tout comme le stockage de bons équipement réseaux sont nécéssaires. Cette partie nécessite également de la RAM pas nécessairement en gros volume, mais répliquée plusieurs fois.

Les composants

Et si on suivait le cycle de vie d’une requête Spark ?

Pour mieux comprendre l’architecture de Spark nous nous baserons sur l’execution d’un code permettant de classer par ordre décroissant les mot les plus utilisés contenus dans un roman d’Emile Zola:

sc.textFile("/home/baptiste/Workspace/ventreDeParis.txt")
.flatMap(text => text.split(" "))
.filter(word => word.length !=0)
.map(word => word.replaceAll(",",""))
.map({ word => (word, 1) })
.reduceByKey( _ + _ )
.sortBy(t => t._2,false)
.collect()

Spark utilise une architecture leader/follower. La soumission d’une requête s’effectue depuis le Maitre, par exemple via le Spark Shell (1).

Une fois soumis le code est envoyé au Driver(2). Il s’agit d’une application Java indépendante ayant pour but d’organiser le travail des followers à travers le réseau. C’est en quelques sorte le cerveau de notre architecture.

Note: le master pièce maitresse de l’architecture Spark en est aussi son SPOF.

Le Spark Context

Il s’agit du point d’entrée de Spark, il permet de:

  • Se connecter à l’environnement d’éxecution Spark
  • Récupérer le status de l’application Spark
  • Annuler un Job/Stage
  • Lancer un Job de manière synchronizé ou non
  • Allouer programmatiquement des ressources
  • Décomposer le code en unités de traitement plus petites
  • Manager des RDD

C’est quoi un RDD ?

C’est l’objet de base que vous utiliserez tout le temps! Il signifie Resilient Distributed Datasets, c’est une collection de données redondée et distribuée à travers les noeuds d’executions. Si son mécanisme est compliqué, son apparence est simple il s’agit la plupart du temps d’un tableau multi colonnes:

RDD est par définition:

  • In-memory (stocké en ram)
  • Immu