使用ExecuteStreamCommand

时间:2018-03-24 17:54:40

标签: python apache-nifi

在尽力找到与此问题相关的先前问题和示例后,仍然没有找到我正在寻找的答案,我认为我会自己提交问题。

ExecuteStreamCommand对我来说似乎是完美的处理器,原因如下:

  • 我能够执行任何Python脚本并避免使用Jython(与ExecuteScript类似)。 Jython对我来说不是一个选择。
  • 我可以使用FlowFiles。这是必要的,因为我的脚本使用前一个处理器的输出。此外,我喜欢将数据保存在" NiFi管理"。
  • 之内
  • 它写了一个"执行状态"这对路由很有用。

简而言之,我尝试用ExecuteStreamCommand做的是:

  • 摄取先前处理器的输出(Scrapy蜘蛛输出带有JSON行的文本文件)
  • 调用python脚本(例如python3 my_script.py
  • 加载我的python脚本中提取的FlowFile。
  • 选择FlowFile的内容。
  • 在python中操作FlowFile的内容。
  • 输出原始FlowFile的更新版本或创建新版本。
  • 使用更新的/新的FlowFile继续我的NiFi流程。

为了清楚起见,我目前无法理解:

  • 如何调用python脚本(来自ExecuteStreamCommand Processor)
  • 如何从Python中加载FlowFile
  • 如何在Python中更新或创建新的FlowFile
  • 如何将更新后的FlowFile从Python输出回NiFi。

我遇到过ExecuteScript的各种示例,但不幸的是,这些并不完全转化为使用ExecuteStreamCommand。

提前谢谢你。任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:9)

根据您的问题,您说您需要在不使用InvokeScriptedProcessorExecuteScript处理器的情况下调用Python脚本,因为您无法使用Jython。鉴于这一要求,您仍应该能够实现目标。虽然它需要熟悉框架,但所有这些信息都来自ExecuteStreamCommand documentation

您的“我目前无法理解”部分:

  • 如何调用python脚本(来自ExecuteStreamCommand Processor)

    • ExecuteStreamCommand处理器中,使用以下命令配置命令参数命令路径属性:

      • 命令参数: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处理器的输出流关系的结果流文件的内容中。在此实例中,您的脚本无需了解“flowfiles”。如果您使用ISPES处理器,则可以使用NiFi脚本API,该API会自动注入脚本以创建或更新flowfile对象。
  • 如何将更新的FlowFile从Python输出回NiFi。
    • 再次,只需从脚本中将所需的流文件内容写入 STDOUT ,并且(给定返回状态代码为0)NiFi将生成包含该内容的新流文件。如果将ESC输出目标属性属性设置为非空值,则NiFi将使用包含脚本输出的同名新属性来更新现有的流文件。