Aller au contenu

Classiques Garnier

Les techniques de gestion du temps dans les architectures de flux

  • Type de publication : Article de revue
  • Revue : Études digitales
    2018 – 1, n° 5
    . Religiosité technologique
  • Auteur : Fauré (Christian)
  • Résumé : L’article consacré aux « techniques de gestion du temps dans les architectures de flux » confronte le temps de l’événement à celui de son traitement et interroge l’effet de ce subtil mais constant décalage.
  • Pages : 201 à 212
  • Revue : Études digitales
  • Thème CLIL : 3157 -- SCIENCES HUMAINES ET SOCIALES, LETTRES -- Lettres et Sciences du langage -- Sciences de l'information et de la communication
  • EAN : 9782406092902
  • ISBN : 978-2-406-09290-2
  • ISSN : 2497-1650
  • DOI : 10.15122/isbn.978-2-406-09290-2.p.0201
  • Éditeur : Classiques Garnier
  • Mise en ligne : 13/08/2019
  • Périodicité : Semestrielle
  • Langue : Français
  • Mots-clés : Techniques, gestion du temps, architectures de flux, événement, traitement du temps
201

Les techniques de gestion du temps
dans les architectures de flux

Issues notamment du secteur de la finance et de celui des plateformes de réseaux sociaux, de nouvelles architectures digitales capables de faire traitement sur des flux de données ininterrompus commencent à se répandre. Cest lopportunité de faire le point sur les techniques de gestion quutilisent ces « moteurs de flux ».

Définition dune architecture de flux

Comme les termes de « flow » et de « streaming » restent assez flous, Tyler Akidau, ingénieur chez Google, a proposé une définition assez précise et opératoire dun système de streaming1 :

A streaming engine is a type of data processing engine that is designed with infinite data sets in mind.

« Un moteur de flux est un moteur de traitement qui a été conçu pour traiter des jeux de données infinis. »

Une fois de plus, on voit que cest le mode de collecte qui détermine larchitecture de traitement ; quand la collecte des données ne sarrête jamais, les jeux de données deviennent infinis. Par ailleurs, ces moteurs de traitement de flux sont souvent caractérisés comme étant des systèmes à faible latence et à résultats approximatifs ou probabilistes. La « faible latence » cest ce que lon souhaite : répondre au plus vite aux sollicitations. Le fait davoir des « résultats approximatifs ou probabilistes », 202cest ce quon accepte de concéder pour y parvenir, puisquon travaille sur des ensembles de données ouverts et infinis, et non fermés et finis : la base sur laquelle on fait des traitements est « mouvante ».

Batch versus Flow

Un système bancaire qui collecte les données puis les traite en batch (cest-à-dire par lots) a forcément une architecture informatique conçue pour ce type de traitement. Mais si vous prenez cette architecture et que vous lutilisez pour opérer disons un réseau social, chacun comprendra quil y a un problème de conception, de design : quelle valeur aurait un réseau social qui collecterait les informations dans la journée pour ne les mettre à jour, après traitement, que le lendemain ? Quel intérêt pour un utilisateur du réseau social de recevoir des notifications sur des interactions qui se sont passées la veille ? Cet exemple nest pas innocent, car les architectures de flux sont largement utilisées2 dans les systèmes de réseaux sociaux et de messageries instantanées : Twitter, Facebook, Meetic, Linkedin, etc.

La différence porte avant tout sur la manière dont se fait la collecte des données. Inévitablement, des données collectées par lots (batch) seront traitées par lots et celles collectées en continu (flow) seront traitées en continu3 : « Dis-moi comment tu collectes tes données et je te dirai quelle est ton architecture digitale ».

La tendance, en matière dacquisition des données, est quelle devienne continue et permanente. Aussi va-t-on immanquablement assister à une migration progressive des architectures digitales vers des architectures de flux. Larchitecture du système dinformation dune entreprise digitale va de moins en moins avoir besoin de collecter ses données en mode batch. Au contraire, de nombreuses autres entreprises ne voient pas lintérêt 203de passer à des architectures de flux, selon un constat fondé sur trois raisons principales :

1. Elles estiment ne pas en avoir besoin : elles sont capables dabsorber et de traiter leur volumétrie de data avec des architectures classiques : « nul besoin dune Ferrari si une Dacia fait le job ! ».

2. Construire et maintenir des architectures de flux est complexe ; ces dernières demandent des compétences pointues et, à lheure actuelle, les frameworks disponibles ne sont pas tous « secs ». Il y a donc une part de risque non négligeable.

3. Les entreprises pensent que la collecte des données par lot fait partie de lordre des choses et quon ne peut pas y déroger. Cest probablement là leur principale réticence. En réalité, si les données sont encore collectées par batchs, cest quil y a soit des activités manuelles dans le processus de collecte, soit un défaut de numérisation du processus, soit un reliquat historique dune procédure non digitale (par exemple, réglementaire). Nous voyons par-là que la digitalisation des entreprises commence toujours par la définition de ses modes de collecte des données. Ceux qui nont pas fait évoluer leurs modalités de collecte ne voient pas lintérêt des architectures de flux.

Il y a également dautres arguments que lon peut entendre et qui plaident en faveur du maintien dune collecte et dun traitement par batch ; par exemple, lorsquil sagit de calculer un maximum ou une moyenne. En effet comment faire ce type de traitement si lon na pas des jeux de données lotis, avec un début et une fin ? En réalité ces arguments sont fallacieux, une simple consultation des premiers papiers scientifiques sur les architectures de flux montre que les techniques de windowing (technique de fenêtrage glissant dans des collections de flux de données, que nous aborderons ci-dessous) ont résolu le problème posé par ce genre dopérations bloquantes4. Chaque entreprise doit donc aujourdhui se poser, à nouveaux frais, la question de la conception de ses techniques de collecte et de traitement de données.

204

Les architectures Lambda
pour combiner Batch et Flow ?

Larchitecture Lambda, conceptualisée par Nathan Marz dans son article How to beat the CAP Theorem5, vise à construire des systèmes de flux au-dessus de systèmes de traitement par batchs, en essayant de combiner le monde du batch avec celui du flux. Même si lidée est séduisante, sa mise en œuvre sest heurtée à la complexité de maintenir deux logiques de traitement disposant dun code spécifique et de systèmes de stockage différents. Raison pour laquelle les architectures Lambda sont aujourdhui plutôt considérées comme une phase de transition ou comme une architecture théorique que comme une solution pérenne.

Aujourdhui, la tendance est davoir des systèmes de flux qui peuvent traiter aussi bien des flux de données que des batchs de données. Pour ces systèmes (on pense à Apache Flink6 ou Apache Spark7), nul besoin de deux systèmes complémentaires (batch et flux) puisque le système de flux traite tout aussi bien les deux cas8.

Mais on voit pointer un changement de paradigme puisque la spécificité dun système (batch ou flux) devient une partie dun autre système. Dit autrement : le batch devient un simple cas particulier du flux. Dans les faits, les frameworks de streaming évoluent à une vitesse telle que la médiation dune architecture Lambda est en passe de devenir caduque. Désormais, une architecture de flux traite aussi bien des batchs que des flux9, et ceci à condition que deux challenges soient relevés : celui de lexactitude et celui de la manipulation du temps.

205

Lexactitude dans les architectures de flux

Lexactitude est la moindre des choses si lon veut quun moteur de flux puisse faire aussi bien quun moteur de batch. Mais de quelle exactitude parle-t-on ici ? Il sagit didempotence. On dit quune opération est idempotente si elle a le même effet et produit le même résultat quel que soit le nombre de fois où quelle est exécutée. Par exemple, dans le style darchitecture REST, la méthode DEL a toujours le même résultat, que vous la jouiez une fois ou n fois10. Appliqué à un moteur de traitement de données, cela veut dire que les mêmes données en input produiront toujours le même résultat en output.

Garantir cette exactitude, cette idempotence, dans le traitement des flux de données suppose que le système distribué puisse être tolérant aux pannes, car si des calculs se font sur différents nœuds du réseau, il faut que des états intermédiaires puissent être gardés en mémoire11. Qui plus est, garder ces états en log est une solution au problème dexactitude ; un des intérêts des logs est dêtre le levier qui va permettre de collecter des données en continu et justifier lutilisation dun moteur de traitement de flux (doù limportance du framework Kafka dans les architectures de flux).

Au final, le traitement de flux consiste à lire une log (une collection de données) pour la transformer en une autre log, qui peut elle-même être lue pour produire une autre log et ainsi de suite. Il y a des traitements qui senchaînent, puisquun traitement de flux est lapplication dune fonction à une collection. On peut dire par analogie que la fonction globale du système est la composition des fonctions de chaque étape.

Après lexactitude, le second challenge pour les systèmes de flux réside dans leurs techniques de manipulation du temps.

206

Temps de lévénement et temps du traitement

Lorsque nous regardons le ciel étoilé, la nuit, nous regardons en fait un état qui nexiste plus au moment où nous le regardons ; cest le passé que nous voyons, du fait du temps quil aura fallu aux photons pour parcourir, à la vitesse de la lumière, la distance qui nous sépare des étoiles. De la même manière, votre regard qui parcourt ces lignes en voit les lettres environ une nanoseconde avant dêtre déchiffrées. Que ce soit à léchelle macroscopique ou microscopique, il y a toujours un décalage entre le temps de ce qui arrive et le temps où cela nous arrive.

Aussi, la première distinction que nous devons faire est celle qui sépare le temps de lévénement (Event Time), quand il arrive effectivement, et le temps du traitement (Processing Time), quand lévénement est constaté et traité dans le système. Dans un monde idéal, les données seraient traitées en temps réel et il ny aurait aucune différence entre ces deux temporalités. Mais dans les systèmes distribués cela narrive jamais, du fait de la nature même du réseau (pertes probables de nœud du réseau, problèmes de contention) : dès lors, comment pallier les incohérences temporelles ? Comment retrouver le temps ? Cest dans les techniques de manipulation et de gestion du temps que les choses vont se jouer.

Dans les architectures de flux, cest la nature infinie des collections de données qui pose problème : comment appliquer des calculs à une collection de données en perpétuelle extension ? Eh bien quà cela ne tienne : créons des collections finies virtuelles, des « vues fenêtrées » qui vont introduire des collections finies dans le flux infini. La réponse globale apportée par les moteurs de flux (streaming engines) dans la gestion temporelle dun flux infini de données passe toujours par des techniques de fenêtrage (windowing).

Si le fenêtrage est la solution générale au problème de collections de données infinies, faire face à des situations diverses et hétérogènes exige de pouvoir décliner le fenêtrage dans des techniques particulières, adaptées à des contextes particuliers. En effet, au problème des collections de données infinies, sajoutent deux facteurs de complexité : les données narrivent pas nécessairement au moteur de traitement selon lordre du temps des événements (event time). Le plus souvent, elles arrivent même 207de manière désordonnée ; lécart entre le temps de lévénement (event time) et le temps du traitement (processing time) nest pas constant. Sinon ce serait trop simple : il suffirait de connaître cet écart constant pour faire coïncider parfaitement les deux temporalités.

Les techniques de fenêtrage
du flux des événements

Les techniques de fenêtrage12 peuvent sappliquer soit au temps des événements, soit au temps du traitement. Le cas dusage permettant de travailler au niveau du temps des traitements est le plus simple : le fenêtrage se fait selon lordre darrivée des données sans se soucier de savoir si elles arrivent dans le bon ordre. Cette approche permet également de savoir avec certitude que notre fenêtre sest terminée proprement, puisquaucune donnée narrivera après coup ou en retard.

En revanche, si lon est attentif à lexactitude de nos calculs, on va chercher à prendre en compte le temps de lévénement comme référence, comme lorsquon souhaite connaître le nombre de clics sur un site web durant un créneau horaire donné : cest lhorodatage du clic dans le temps de lévénement qui doit faire foi et pas le temps de son traitement.

Dans la majorité des cas dusages, cest le temps de lévénement qui est déterminant, et on ne peut plus alors utiliser des techniques de fenêtrage sur le temps des traitements : cest ce fenêtrage sur le temps des événements, qui constitue le principal challenge pour les architectures de flux.

Les techniques de fenêtrage dans des collections infinies se font en jouant sur plusieurs paramètres : le temps de début et de fin de la fenêtre, la durée de la fenêtre et enfin sa fréquence. Si la durée de la fenêtre est égale à sa fréquence, nous aurons un fenêtrage fixe qui découpe le flux des données de manière régulière. Si la fréquence est inférieure à la durée, il y a un recouvrement des fenêtres ; on parle de fenêtres décalées 208ou glissantes (Sliding Windows). Enfin si la fréquence est supérieure à la durée, on aura des fenêtres espacées ; technique plutôt utilisée pour sonder ou faire des calculs sur des échantillons.

Dans ces derniers exemples, une fois fixées, les variables ne changent pas, cest la raison pour laquelle on peut dire que ce sont des techniques de fenêtrages fixes. On peut également avoir une vision plus dynamique du fenêtrage en faisant varier les paramètres de début, de fin, de durée et de fréquence. Cest typiquement ce que lon fait avec des fenêtres de sessions qui sont utiles lorsquon veut analyser les comportements des utilisateurs : le login et le logout déterminent le début et la fin de la fenêtre (avec des fonctions de timeout).

Quand et comment déclencher
des traitements intermédiaires ?

Si lon a mis en place des techniques de fenêtrage côté event time, il va également falloir répondre à la question du traitement de ces fenêtres. Lexercice est difficile parce quon ne peut jamais vraiment savoir si les traitements se font sur des collections exactes (complétude dune collection) : a-t-on vraiment récupéré toutes les données événementielles dune fenêtre de temps donnée ? À quel moment décide-t-on de faire les transformations et les traitements ?

Il faut bien comprendre quici la question ne porte pas sur la nature des traitements qui seront effectués mais sur le déclenchement du traitement. Pour y répondre, deux techniques différentes et complémentaires sont utilisées : les techniques de marquage (Watermark) et les techniques de déclenchement (Triggers).

Commençons par les techniques de marquage (Watermark) qui sont aussi appelées « tatouages numériques » ou « filigranes numériques ». Elles consistent à rajouter des informations portant sur la structure ou sur la logique des données collectées, permettant ainsi de mesurer la progression de la complétude des données dans une fenêtre de temps des événements. Cette mesure de la complétion peut être déterministe et précise quand on a une parfaite connaissance de la logique des événements 209(par exemple quand on sait quil y aura 10 000 événements sur une plage dune minute), mais elle peut aussi être heuristique sil faut sen tenir à des estimations de progression des événements dans la fenêtre.

Quand les techniques de marquage sont heuristiques, cela veut dire que le tatouage numérique interne ne suffit plus et quil faut faire appel à des signaux externes pour provoquer un déclenchement (Triggers). Ces signaux peuvent être la progression de complétude du temps de traitement, le comptage du nombre dévénements, la prise en compte déléments de ponctuation qui sont inclus dans les données tels que EndOfFile, etc. Et pour complexifier la situation, on peut également combiner différents triggers entre eux pour faire des triggers combinatoires.

Le triptyque : complétude, latence, coût

Si un traitement est joué avant la fin de la plage temporelle de la collection de données, alors il devra être rejoué jusquà ce que toutes les données de la plage horaire arrivent dans le système pour enfin produire le résultat final. Tant que la fenêtre nest pas finie, le traitement nest capable de produire quun résultat intermédiaire et probable, car la fonction dun ensemble de données doit toujours sappuyer sur une complétude des données pour être correcte.

Comme des messages peuvent arriver en retard, il peut être nécessaire de laisser une marge derreur laissant un répit à ces derniers. Si la fonction attend trop longtemps que la plage se termine (à cause dune donnée retardataire), cela ajoute de la latence au système qui attend le résultat pour enchaîner dautres traitements.

Frances Perry13, de léquipe Google Dataflow, parle du triptyque complétude, latence, coût. Si lon veut connaître exactement un résultat (par exemple les ventes de la journée) il faut attendre la complétude de la fenêtre de données. Bien souvent on souhaite avoir des résultats intermédiaires et seulement probables avant la fin de la fenêtre de calcul pour ne pas avoir à attendre et pour ne pas introduire de la latence dans le système. Mais évidemment, tous les traitements intermédiaires ont un 210contrecoup : ils complexifient le système et consomment des ressources, ce qui augmente le coût global de fonctionnement du système. Il faut donc trouver pour chaque cas dusage un optimum entre complétude, latence et coût.

Dernier moment, avec les techniques dites daccumulation. En effet, dans le cas de traitements intermédiaires, il faut des techniques de gestion de cette accumulation, jusquau traitement final. On en distingue aujourdhui trois principales : le discarding qui consiste à supprimer létat du traitement précédent – on ne fait donc pas de lien entre les différents états. Ensuite, la technique daccumulation (Accumulating) dans laquelle les états antérieurs sont repris et enrichis par les nouveaux états. Enfin, la technique Accumulating and retracting qui, comme son nom lindique, permet à la fois daccumuler des états et en même temps de supprimer des états plus anciens (une sorte de fenêtrage glissant dans le traitement).

Léquipe Google Dataflow a fait un formidable travail de pédagogie14 lorsquelle a fait don du SDK15 à la fondation Apache – ce qui a donné naissance à Apache Beam16, une implémentation du modèle de Dataflow de Google qui permet de définir et deffectuer des traitements sur des données aussi bien en batchs quen flux. Léquipe de Google a synthétisé son travail autour de quatre questions auxquelles un moteur de traitement des flux doit répondre :

Que peut-on calculer ? Cette question fait référence au type de traitement que lon est capable deffectuer (question que nous navons pas développée, mais qui renvoie aux types de fonctions de transformation que lon peut appliquer aux collections de données fenêtrées).

À quel moment se déploie le calcul dans le temps des événements ? Cette question renvoie aux techniques de fenêtrage du temps des événements.

Quand fait-on les traitements ? Cette question renvoie aux techniques de Watermarks et de Trigger.

Comment fait-on pour gérer laccumulation des traitements intermédiaires ? Cette question renvoie aux techniques daccumulation.

211

Le tournant probabiliste

Il est fort probable que le « tournant digital » des systèmes dinformation de gestion corresponde à une introduction radicale des statistiques et des probabilités, cest-à-dire à des traitements non déterministes, à limage de ce que fit Gibbs dans la physique du début du xxe siècle quand il reconnut lexistence dun élément fondamental dans la structure de lunivers : le hasard. « Les statistiques sont la science des distributions17 » rappelait Norbert Wiener, celui qui inventa la cybernétique, cette science du feedback. On comprend mieux pourquoi les systèmes distribués sont inévitablement des terrains privilégiés pour des approches statistiques et probabilistes. Cette théorie générale des messages quest la cybernétique, précisait Wiener, est une théorie probabiliste. Si le feedback, ou rétroaction, est le moyen de contrôler lentropie, dans les systèmes distribués de flux ce contrôle seffectue au moyen déchanges de messages entre les différents composants du système. Nous retrouvons des jeux décriture et la relation épistolaire des composants logiciels introduits dont nous avons eu le loisir de traiter par ailleurs.

Linscription « Nul nentre ici sil nest géomètre » était gravée au fronton de lAcadémie de Platon à Athènes, indiquant que lenseignement de la philosophie nétait accessible que pour celui qui était déjà versé dans les sciences géométriques. Par mimétisme, nous serions tentés de dire, à propos des architectures de flux, que « Nul nentre ici sil nest statisticien ». Face à la complexité croissante des échanges et des messages entre les différents composants, le recours au formalisme mathématique simpose comme une nécessité, que lon constate historiquement à différents niveaux. Dans les années soixante-dix et jusquaux années quatre-vingt-dix, il sagissait de faire des calculs déterministes avec des modèles impératifs et de la programmation par procédures. Dans les années quatre-vingt-dix, il sagissait de faire de la modélisation avec des modèles orientés objets18 et de la programmation par méthodes. Depuis 212les années deux mille dix, nous sommes dans des paradigmes fonctionnels où la programmation se fait à base de fonctions (Haskell, Scala, F#, Clojure, Swift), mais nous commençons déjà à entrevoir lémergence du paradigme statistique avec de la programmation probabiliste couplée à des systèmes de stockage de type Time Series DB. Le paradigme mathématique et notamment probabiliste prend donc de lampleur dans les systèmes digitaux : il est le vecteur incontournable pour en maîtriser la complexité croissante.

Christian Fauré

1 Tyler Akidau, The world beyond batch : Streaming 101 : https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-101.

2 Le secteur financier avait déjà largement utilisé ce genre de technologies.

3 Il faudrait nuancer ce propos car on peut collecter en continu et traiter en batch derrière. On peut aussi avoir besoin daccumuler un peu de données (une fenêtre temporelle typiquement, avec le pattern « micro-batch ») avant de faire le traitement, en modifiant le curseur qui fait le compromis entre la latence, lexactitude et le coût. Nous reviendrons en détails sur ces points dans le chapitre suivant.

4 Il faut quand même que les opérations de calcul soient associatives et commutatives dès lors que les données arrivent par petits bouts et en ordre dispersé. Cest le cas de la moyenne, au-delà, cela devient compliqué en mode flux. Le batch na pas cette limitation et offre aussi des possibilités de rejeu et didempotence à faible coût qui sont possibles en flux, mais plus complexes.

5 http://nathanmarz.com/blog/how-to-beat-the-cap-theorem.html

6 https://flink.apache.org/

7 http://spark.apache.org/

8 On a aussi parlé darchitecture « Kappa » : http://milinda.pathirage.org/kappa-architecture.com/

9 Une technique permettant de transformer un batch en flux consiste à éclater un fichier en messages unitaires quon injecte un à un vers une architecture de flux (pour les batchs faits denregistrements, soit 99 % de ceux pris en charge par les SI traditionnels). Mais cela ne résout pas le besoin de latence ni la nécessité davoir un horodatage exact à chaque message.

10 Cf. le RFC de HTTP 1.1 : « Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request. The methods GET, HEAD, PUT and DELETE share this property. » https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

11 Cf. larticle de Kreps, Why local state is a fundamental primitive in stream processing, https://www.oreilly.com/ideas/why-local-state-is-a-fundamental-primitive-in-stream-processing

12 Ne perdons pas de vue que dans de nombreux cas, le traitement au fil de leau et sans fenêtrage est possible. Nous mettons en exergue les techniques de fenêtrage car cest là où le plus de difficultés doivent être prises en compte.

13 Frances Perry, dans une conférence de 2015 : https://www.youtube.com/watch?v=3UfZN59Nsk8

14 Tyler Akidau, The world Beyond Batch, https://www.oreilly.com/ideas/the-world-beyond-
batch-streaming-102

15 Kit de développement logiciel

16 https://beam.apache.org/

17 Norbert Wiener, Cybernétique et société, Paris, Éditions du Seuil, 2014, p. 42.

18 Edsger Dijkstra, prix Turing 1972, dit à ce propos que « la programmation par objets est une idée exceptionnellement mauvaise qui ne pouvait naître quen Californie. »