VT2017 Flow-based data processing

=Présentation=
 * Sujet : Flow-based data processing
 * Auteur : Maxime Dereymez
 * Enseignants : Didier Donsez et Georges-Pierre Bonneau

=Résumé= Le "flow-based programming" est un paradigme de programmation dans lequel les applications sont représentées comme des graphes constitués de processus "boîtes noires" indépendants dans lesquels passent un flux de données potentiellement infini. Chaque donnée passe donc par une séquence de ces boîtes noires jusqu'à être détruit ou transmis à un autre système. Un logiciel créé en FBP reste aussi flexible qu'un graphe et est donc très aisé à modifier et à maintenir. Ce paradigme s'adapte particulièrement au traitement de données en temps réel comme la récolte de nombreuses données de capteurs (dans un cadre d'IoT), ou le traitement de Big Data.

Mots-Clés : dataflow, paradigme de programmation, IoT, Big Data, temps réel

=Abstract= Flow-based programming is a programming paradigm where you think of applications as graphs made of several independant "black box" processes which are linked and through which passes a potentially unending flow of information. Every piece of data goes through a sequence of those black boxes until they are either discarded or transmitted to another system. A FBP software is as flexible as a graph thus making it very easy to modify and maintain. This paradigm is well suited for processing a dataflow in real time, like when retrieving data from a lot of sensors (IoT), or processing Big Data.

Keywords : dataflow, programming paradigm, IoT, Big Data, real time

=Synthèse=

Motivation
La gestion d'un flux de données constant peut s'avérer difficile s'il l'on se contente de voir un programme comme un pointeur se déplaçant dans une séquence d'instruction. Lors d'un procédé de traitement complexe, il peut devenir difficile de retranscrire un graphe représentant une suite de traitements. De plus la flexibilité d'un graphe n'est pas forcément retranscrite dans un logiciel. Déconnecter un nœud pour le reconnecter sur un graphe peut mener à recréer une grosse partie du programme. Dans une ère où les données sont de plus en plus importantes et les traitements de plus en plus complexes, il fut nécessaire de trouver un moyen de traiter ces flux d'informations de manière efficace en réduisant la différence entre le graphe de conception et le programme final.

Création
Le paradigme de programmation connu sous le nom de "flow-based programming" fut créé par J. Paul Morrison dans les années 70 pour IBM afin d'être utilisé dans un programme pour une banque canadienne, où ce programme tourne encore aujourd'hui. Il consiste à répliquer un graphe de conception en encapsulant des processus de traitement dans des "boîtes noires" dont on ne connaît que les ports d'entrées et de sortie. Il suffit alors de connecter ces boîtes et de faire passer le flux de données à travers celles-ci.

Fonctionnement
Un programme en "flow-based programming" est constitué de plusieurs "boîtes" indépendantes appliquant un traitement simple et bien défini. Ces boîtes disposent de ports d'entrée et de sortie, ceux-ci étant reliés les uns aux autres. Les données arrivent par certaines boîtes et vont de boîte en boîte sous forme de paquets en suivant les connexions. Si une boîte est en train de traiter un paquet, et qu'un autre paquet arrive dans un port d'entrée, la connexion joue également le rôle de file d'attente, et stocke les paquets en attente. Le traitement des données est asynchrone : une boîte ne va démarrer que lorsqu'elle reçoit assez de données dans ses ports d'entrée. Si l'on compare un paradigme de programmation classique à un artisan accomplissant chaque tâche du programme, un programme utilisant le "flow-based programming" est une chaîne de production où chaque travailleur a une fonction définie et le produit passe par toute cette chaîne.

Avantages

 * Flexibilité : En gardant le code regroupé sous forme de composants, on se retrouve avec une flexibilité proche du graphe de départ et il est désormais aisé de manipuler chaque composant, de les débrancher, les réarranger et les rebrancher en utilisant seulement les fonctions basiques des connexions entre chaque boîte.
 * 'Facilité : Une fois plusieurs "boîtes" crées pour un système, il devient extrêmement rapide de mettre en place un autre système en assemblant celles-ci.
 * Distribution : Chaque composant étant bien séparé les uns des autres, il est également facile de distribuer un système et mettre à l'échelle le système. Cela permet donc de traiter plus facilement une quantité très importante de données comme avec le Big Data.
 * Parallélisation : Pour résoudre les goulots d'étranglement éventuels, on peut paralléliser un composant à moindre effort si celui-ci ne possède pas d'état

Apache NiFi
NiFi est originellement un projet de la NSA conçu en 2006 pour gérer les flux de données entre des systèmes différents qui peuvent avoir des formats différents. NiFi (à l'origine Niagara Files) sert donc à appliquer des transformations simples et facilement rediriger ces flux vers les systèmes. NiFi fut cédé à la fondation Apache en novembre 2014, pour devenir un des ses projets de premier niveau en 2015. Un système NiFi est géré au travers d'une interface Web de manière graphique : on manipule directement le graphe de traitement, et l'on peut facilement ajouter des boîtes, les retirer, modifier les connexions, sans la moindre connaissance d'un langage informatique. Couplé au nombre conséquent de "processors" (les boîtes noires de NiFi) présents par défaut (plus de 150), NiFi est un outil parfait pour appréhender le concept de flow-based programming.

Avantages
En plus des avantages du flow-based programming, NiFi est conçu de manière a être facilement mis à l'échelle. Le comportement d'un graphe peut facilement être répliqué au sein d'un cluster, géré par Apache Zookeeper. On peut de plus facilement ajouter une node à ce cluster, qui sera directement intégré à son fonctionnement. Au delà d'un cluster, plusieurs systèmes NiFi peuvent aisément se connecter grâce à un protocole qui est propre à NiFi, et ce depuis l'interface Web : il suffit d'ajouter un processor spécifique et de renseigner l'adresse du système distant pour que NiFi détecte lui-même les systèmes présents et les entrées disponibles.