Lecture de deux flux (principal et configs) en séquentiel dans Flink
J'ai deux flux, l'un est le flux principal, disons dans l'exemple de la détection de fraude, j'ai un flux de transactions, puis j'ai un deuxième flux qui est configs, dans notre exemple, ce sont des règles. Je connecte donc le flux principal au flux de configuration afin d'effectuer le traitement. Mais lorsque flink démarre pour la première fois et que nous ajoutons un travail, il commence à consommer des transactions et des flux de configuration parallèles et lorsque vous souhaitez traiter la transaction, il constate parfois qu'il n'y a pas de configuration et que nous devons envoyer la transaction à la file d'attente des lettres mortes. Cependant, ce que je veux réaliser, c'est que s'il existe une configuration brevetée que je pourrais obtenir un peu plus tard, je veux d'abord obtenir cette configuration, puis obtenir une transaction afin de la traiter plutôt que de l'envoyer dans la file d'attente des lettres mortes. J'ai la même clé pour les transactions et les configurations.
Pour faire court, existe-t-il un moyen de dire à flink lorsque le premier travail démarre, essayez de consommer un flux jusqu'à ce qu'il n'y ait pas de nouvelle valeur, puis commencez à traiter le flux principal? Comment puis-je les rendre séquentiels?
Solution du problème
La méthode recommandée consiste à connecter les 2 flux et à appliquer un RichCoFlatMap qui vous permettra de mettre en mémoire tampon les événements main
pendant que vous attendez de recevoir les événements de configuration.
Consultez cette section utile des didacticiels Flink. Le tout dernier paragraphe décrit en fait votre problème.
It is important to recognize that you have no control over the order in which the flatMap1 and flatMap2 callbacks are called. These two input streams are racing against each other, and the Flink runtime will do what it wants to regarding consuming events from one stream or the other. In cases where timing and/or ordering matter, you may find it necessary to buffer events in managed Flink state until your application is ready to process them. (Note: if you are truly desperate, it is possible to exert some limited control over the order in which a two-input operator consumes its inputs by using a custom Operator that implements the InputSelectable interface.
Donc, en un mot, vous devriez connecter vos 2 flux et avoir une sorte de ListState où vous pouvez "tamponner" vos éléments principaux en attendant de recevoir les règles. Lorsque vous recevez un élément du flux de configuration, vous vérifiez si vous aviez des éléments en attente "en attente" pour cette configuration dans votre ListState (votre tampon). Si vous le faites, vous pouvez ensuite traiter ces éléments et les émettre via le collecteur de votre flatmap.
Commentaires
Enregistrer un commentaire