web-dev-qa-db-fra.com

Python Script utilisant ExecuteStreamCommand

Après avoir fait de mon mieux pour trouver des questions et des exemples précédents pertinents à cette question, et sans toujours trouver les réponses que je cherchais, j'ai pensé que je soumettrais moi-même une question.

ExecuteStreamCommand semble être le processeur parfait pour moi pour les raisons suivantes:

  • Je peux exécuter n'importe quel script Python et éviter Jython (d'une manière similaire à ExecuteScript). Jython n'est pas une option pour moi.
  • Je peux prendre FlowFiles. Ceci est nécessaire car mon script est fait pour consommer la sortie d'un processeur précédent. De plus, j'aime l'idée de garder les données sous "gestion NiFi".
  • Il écrit un "état d'exécution" qui sera utile pour le routage.

En un mot, ce que j'essaie de faire avec ExecuteStreamCommand est:

  • Ingérer la sortie d'un processeur précédent (une araignée Scrapy qui génère un fichier texte avec des lignes JSON pour être exact)
  • Appelez un script python (par exemple python3 my_script.py)
  • Chargez le FlowFile qui a été ingéré dans mon script python.
  • Sélectionnez le contenu du FlowFile.
  • Opérez sur le contenu du FlowFile en python.
  • Générez une version mise à jour du FlowFile d'origine ou créez-en une nouvelle.
  • Continuez avec mon flux NiFi avec le nouveau/nouveau FlowFile.

Par souci de clarté, je ne comprends pas actuellement:

  • Comment appeler le script python (à partir du processeur ExecuteStreamCommand)
  • Comment charger le FlowFile depuis Python
  • Comment mettre à jour ou créer un nouveau FlowFile depuis Python
  • Comment sortir le FlowFile mis à jour de Python retour vers NiFi.

J'ai rencontré divers exemples pour ExecuteScript, mais malheureusement, ceux-ci ne se traduisent pas exactement par l'utilisation de ExecuteStreamCommand.

Merci d'avance. Tout conseil est apprécié.

9
vcovo

D'après votre question, vous dites que vous devez appeler le script Python sans utiliser les processeurs InvokeScriptedProcessor ou ExecuteScript car vous ne pouvez pas utiliser Jython. Étant donné cette exigence, vous devriez toujours être en mesure d'atteindre votre objectif. Bien que cela nécessite une certaine familiarité avec le cadre, toutes ces informations proviennent de la documentation ExecuteStreamCommand .

Votre section "Je ne comprends pas actuellement":

  • Comment appeler le script python (à partir du processeur ExecuteStreamCommand)

    • Dans votre processeur ExecuteStreamCommand, configurez les arguments de commande et Chemin de commande propriétés avec les éléments suivants:

      • Arguments de la commande: any flags or args, delimited by ; (c'est à dire. /path/to/my_script.py)
      • Chemin de commande: /path/to/python3
  • Comment charger le FlowFile depuis Python

    • Le contenu du fichier de flux sera transmis via [~ # ~] stdin [~ # ~] , donc dans votre Python script, traitez ces données de la même manière que vous traitez normalement [~ # ~] stdin [~ # ~] .
  • Comment mettre à jour ou créer un nouveau FlowFile depuis Python
    • NiFi gère la création du fichier de flux dans le framework. Toutes les données transmises par votre Python à [~ # ~] stdout [~ # ~] seront renseignées dans le contenu du fichier de flux résultant transmis à la relation de flux de sortie du processeur ExecuteStreamCommand. Votre script n'a pas besoin de connaître "flowfiles" dans ce cas. Si vous utilisiez plutôt les processeurs ISP ou ES, vous pouvez utiliser l'API de script NiFi qui est automatiquement injectée dans les scripts pour créer ou mettre à jour l'objet de fichier de flux.
  • Comment sortir le FlowFile mis à jour de Python retour vers NiFi.
    • Encore une fois, écrivez simplement le contenu du fichier de flux souhaité dans [~ # ~] stdout [~ # ~] à partir de votre script, et (étant donné un code d'état de retour de 0) NiFi va générer un nouveau fichier de flux avec ce contenu. Si vous définissez la propriété Attribut de destination de sortie de ESC sur une valeur non nulle, NiFi mettra à jour le flux existant avec un nouveau attribut du même nom contenant la sortie du script.
10
Andy