Hello Internet Hive Mind!
我需要使用nifi查询AWS Athena,但是我需要为发送的每个查询更改暂存目录(S3存储和文件夹,其中将保存结果)。
但是必须在DBCPConnectionPool控制器服务上设置s3_staging_dir属性。 如何为每个不同的流文件更改该属性的值? 显然,单靠表达语言无法获取它。
谢谢!
答案 0 :(得分:2)
我不确定每个查询依赖于不同的临时目录的流的性质,但有几点需要注意。
DBCPConnectionPool
控制器服务确实允许评估表达式语言的动态属性,但是当控制器服务启用时执行表达式语言评估,因此"一次"每个开始/停止。 来自Apache NiFi DBCPConnectionPool
documentation:
动态属性:
动态属性允许用户指定名称和值 属性。
...
指定要在JDBC上设置的属性名称和值 连接(一个或多个)。如果使用表达式语言,则评估将是 在启用控制器服务时执行。注意没有流量 文件输入(属性,例如)可用于Expression 这些属性的语言结构。 支持表达 语言:真实
由于您要求每个请求的S3暂存目录不同,我认为在这种情况下,您需要采用以下选项之一:
DBCPConnectionPool
不支持您的用例)DBCPConnectionPool
控制器服务扩展AthenaConnectionPool
控制器服务。有许多教程可用于构建您自己的NiFi组件,但NiFi Developer Guide > Developing Controller Services是最佳起点。您可以创建一个控制器服务,该服务在执行表达式语言执行时会评估传入的流文件属性,但您需要手动触发它,因为控制器服务的生命周期没有@OnTrigger
阶段。如果您还编写自定义处理器,则可以调用一些"重新评估"控制器服务中的方法来自处理器的onTrigger()
方法,但现有的处理器不会调用它。相反,您可以使用执行程序theoretically put a high frequency refresher in the controller service本身,但这肯定会影响性能DBCPConnectionPool
实例和SQL处理器(可行的顺序为1 - 3,否则非常糟糕)ExecuteStreamCommand
处理程序与awscli
一起使用命令行工具执行查询。这剥夺了NiFi本机SQL工具,但允许每次调用自定义查询,因为ExecuteStreamCommand
可以解释特定于流文件的属性并在查询中使用它们答案 1 :(得分:0)
您不必在DBCPConnectionPool
中设置该属性。您在SQL处理器中设置的查询将从Athena输出结果作为流文件。您可以将SQL处理器连接到PutS3Object
并指定存储桶名称和其他必要属性。这会将SQL查询的结果写入S3临时目录。