web-dev-qa-db-fra.com

Combinez deux flux dans Apache Flink quelle que soit l'heure de la fenêtre

J'ai deux flux de données que je souhaite combiner. Le problème est qu'un flux de données a une fréquence beaucoup plus élevée que l'autre et il y a des moments où un flux ne reçoit aucun événement. Est-il possible d'utiliser le dernier événement d'un flux et de le joindre à l'autre flux à chaque événement à venir?

La seule solution que j'ai trouvée utilise la fonction de jointure, mais vous devez spécifier une fenêtre commune, où vous pouvez appliquer la fonction de jointure. Cette fenêtre n'est pas atteinte, lorsqu'un flux ne reçoit aucun événement.

Existe-t-il une possibilité d'appliquer la fonction de jointure à chaque événement provenant d'un flux ou de l'autre et de conserver l'état du dernier événement consommé et d'utiliser cet événement pour la fonction de jointure?

Merci d'avance pour tous les conseils utiles!

16
FLoppix

Il existe de nombreuses approches différentes pour combiner ou joindre deux flux dans Flink, en fonction des exigences de chaque cas d'utilisation spécifique. Lorsque vous faites cela "à la main", vous voulez utiliser les ConnectedStreams de Flink avec un RichCoFlatMapFunction ou CoProcessFunction. L'un ou l'autre de ces éléments vous permettra de conserver l'état géré (c'est-à-dire le dernier élément du flux rarement mis à jour) et de le joindre au flux plus rapide. CoProcessFunction ajoute la possibilité de travailler avec des minuteries, que vous devez utiliser pour effacer l'état des clés expirées, si cela est pertinent.

Il y a un exercice sur le site de formation Flink sur différentes approches pour implémenter de telles jointures: Enrichment Joins . Pour un exemple plus simple, voir aussi l'exercice sur Expiration État .

Chaque version récente de Flink a inclus des fonctions de jointure intégrées supplémentaires, donc à ce stade, il est moins souvent nécessaire de lancer la vôtre. Voir les pages sur se joindre à l'API DataStream , se joint à l'API Table et se joint à SQL pour plus de détails.

18
David Anderson