web-dev-qa-db-ja.com

Python ExecuteStreamCommandを使用したスクリプト

以前の質問とこの質問に関連する例を見つけるために最善を尽くし、探している答えがまだ見つからないとき、私は自分で質問を提出することを考えました。

次の理由により、ExecuteStreamCommandは私にとって完璧なプロセッサのように見えます。

  • Pythonスクリプトを実行し、Jythonを回避することができます(ExecuteScriptと同様の方法で)。Jythonは私にとってはオプションではありません。
  • FlowFilesを取り込むことができます。私のスクリプトは前のプロセッサの出力を消費するように作られているので、これは必要です。さらに、データを「NiFi管理」下に保つという考えも気に入っています。
  • ルーティングに役立つ「実行ステータス」を書き込みます。

一言で言えば、私がExecuteStreamCommandでやろうとしていることは次のとおりです。

  • 以前のプロセッサの出力(正確にはJSON行を含むテキストファイルを出力するScrapyスパイダー)を取り込みます
  • pythonスクリプトを呼び出します(例:python3 my_script.py
  • My pythonスクリプトで取り込まれたFlowFileをロードします。
  • FlowFileのコンテンツを選択します。
  • Python内でFlowFileのコンテンツを操作します。
  • 元のFlowFileの更新バージョンを出力するか、新しいバージョンを作成します。
  • 更新された/新しいFlowFileでNiFiフローを続行します。

わかりやすくするために、私は現在理解していません。

  • pythonスクリプトを呼び出す方法(ExecuteStreamCommandプロセッサから)
  • Python内からFlowFileをロードする方法
  • Python内から新しいFlowFileを更新または作成する方法
  • Pythonから更新されたFlowFileをNiFiに出力する方法。

ExecuteScriptのさまざまな例に出くわしましたが、残念ながら、これらはExecuteStreamCommandの使用に正確に変換されません。

前もって感謝します。任意のアドバイスをいただければ幸いです。

9
vcovo

あなたの質問から、Jythonを使用できないため、InvokeScriptedProcessorまたはExecuteScriptプロセッサを使用せずにPythonスクリプトを呼び出す必要があると述べています。その要件を考えると、フレームワークにある程度の知識が必要ですが、この情報はすべて ExecuteStreamCommand documentation からのものです。

「現在、理解できません」セクション:

  • pythonスクリプトを呼び出す方法(ExecuteStreamCommandプロセッサから)

    • ExecuteStreamCommandプロセッサで、Command ArgumentsおよびCommand Pathプロパティを次のように構成します。

      • コマンド引数:any flags or args, delimited by ;(つまり、/path/to/my_script.py
      • コマンドパス:/path/to/python3
  • Python内からFlowFileをロードする方法

    • フローファイルのコンテンツは[〜#〜] stdin [〜#〜]を介して渡されるため、Pythonスクリプトで、そのデータを処理します通常処理するのと同じ方法[〜#〜] stdin [〜#〜]
  • Python内から新しいFlowFileを更新または作成する方法
    • NiFiは、フローファイルの作成をフレームワークで処理します。 Pythonスクリプトから[〜#〜] stdout [〜#〜]によって渡されるデータは、結果のフローファイルのコンテンツに入力されますExecuteStreamCommandプロセッサの出力ストリーム関係に渡されます。この場合、スクリプトは「フローファイル」を認識する必要はありません。代わりにISPまたはESプロセッサーでは、スクリプトに自動的に挿入されるNiFiスクリプトAPIを使用して、flowfileオブジェクトを作成または更新できます。
  • Pythonから更新されたFlowFileをNiFiに出力する方法。
    • 繰り返しますが、スクリプトから[〜#〜] stdout [〜#〜]に目的のフローファイルコンテンツを書き込み、(戻りステータスコード0)NiFiは、その内容で新しいフローファイルを生成します。 ESCOutput Destination Attributeプロパティをnull以外の値に設定すると、代わりに、NiFiは既存のフローファイルを同じ名前の新しい属性で更新します。スクリプトの出力。
10
Andy