如何将flowfile属性传递给控制器​​服务?

时间:2018-03-21 15:24:04

标签: apache-nifi

Hello Internet Hive Mind!

我需要使用nifi查询AWS Athena,但是我需要为发送的每个查询更改暂存目录(S3存储和文件夹,其中将保存结果)。

但是必须在DBCPConnectionPool控制器服务上设置s3_staging_dir属性。 如何为每个不同的流文件更改该属性的值? 显然,单靠表达语言无法获取它。

谢谢!

2 个答案:

答案 0 :(得分:2)

我不确定每个查询依赖于不同的临时目录的流的性质,但有几点需要注意。

  1. DBCPConnectionPool控制器服务确实允许评估表达式语言的动态属性,但是当控制器服务启用时执行表达式语言评估,因此"一次"每个开始/停止。
  2. 控制器服务上的动态属性不评估flowfile属性。
  3. 来自Apache NiFi DBCPConnectionPool documentation

      

    动态属性:

         

    动态属性允许用户指定名称和值   属性。

         

    ...

         

    指定要在JDBC上设置的属性名称和值   连接(一个或多个)。如果使用表达式语言,则评估将是   在启用控制器服务时执行。注意没有流量   文件输入(属性,例如)可用于Expression   这些属性的语言结构。 支持表达   语言:真实

    由于您要求每个请求的S3暂存目录不同,我认为在这种情况下,您需要采用以下选项之一:

    1. File a Jira在NiFi中请求原生Athena支持(彻底解释为什么现有DBCPConnectionPool不支持您的用例)
    2. 使用您自己的DBCPConnectionPool控制器服务扩展AthenaConnectionPool控制器服务。有许多教程可用于构建您自己的NiFi组件,但NiFi Developer Guide > Developing Controller Services是最佳起点。您可以创建一个控制器服务,该服务在执行表达式语言执行时会评估传入的流文件属性,但您需要手动触发它,因为控制器服务的生命周期没有@OnTrigger阶段。如果您还编写自定义处理器,则可以调用一些"重新评估"控制器服务中的方法来自处理器的onTrigger()方法,但现有的处理器不会调用它。相反,您可以使用执行程序theoretically put a high frequency refresher in the controller service本身,但这肯定会影响性能
    3. 为每个暂存目录创建多个DBCPConnectionPool实例和SQL处理器(可行的顺序为1 - 3,否则非常糟糕)
    4. 使用ExecuteStreamCommand处理程序与awscli一起使用命令行工具执行查询。这剥夺了NiFi本机SQL工具,但允许每次调用自定义查询,因为ExecuteStreamCommand可以解释特定于流文件的属性并在查询中使用它们
    5. 重新评估您的流程设计并查看是否有办法执行查询而不允许在单个查询执行时使用任意S3暂存目录

答案 1 :(得分:0)

您不必在DBCPConnectionPool中设置该属性。您在SQL处理器中设置的查询将从Athena输出结果作为流文件。您可以将SQL处理器连接到PutS3Object并指定存储桶名称和其他必要属性。这会将SQL查询的结果写入S3临时目录。