我在Nifi中创建了一个具有以下要求的流程组:
从hive表中获取数据>>加密内容>>上传到azure blob存储。
现在我有3000个表需要安排上述流程。有没有办法只为所有表使用单个流,而不是为每个表创建3000个流。
此外,我还想为某些表执行azure存储而不是全部。是否有任何方法可以根据表1仅应用于gcloud而不是Azure上的任何条件来指示流。同样,我希望表2能够同时使用azure和gcloud。
提前致谢
答案 0 :(得分:2)
有几件事情可以做,但我希望仍有一些最佳方法。
无需3000流
SelectHiveQL
可以获取一个包含SELECT
查询的输入流文件,因此我想到的一种方法是,您可以在文件中使用3000个SELECT查询并使用GetFile
来读取该文件并使用SplitText
将其拆分,然后将splits
关系连接到SelectHiveQL
处理器并应用您的进一步处理逻辑,即EncryptContent
并写入WASB,如果需要的。
决策驱动路由
对于第二个查询,即决定将哪些文件放入Azure Blob以及将哪些文件放入GCS Bucket,您可以使用RouteOnAttribute
处理器。
SelectHiveQL
写入一个属性query.input.tables
,其中包含以逗号分隔格式选择的表列表。如果您只查询了一个表,则仅为query.input.tables
编写该表名。因此,在RouteOnAttribute
中,您可以拥有一个动态关系属性,如:
Destination.Azure : ${query.input.tables:in("Table_1", "Table_15")}
Destination.GCS : ${query.input.tables:in("Table_2", "Table_5")}
然后将Destination.Azure
连接到PutAzureBlobStorage
处理器,将Destination.GCS
连接到PutGCSObject
。
在上面的示例中,我使用了NiFi表达式语言提供的in
运算符,您可以根据表命名约定使用其他运算符。例如,如果您希望客户表登陆Azure Blob并且供应商表登陆GCS,您可以使用:
Destination.Azure : ${query.input.tables:startsWith("customer")}
Destination.GCS : ${query.input.tables:startsWith("supplier")}
有关NifFi表达语言提供的运营商和功能的完整列表,请查看此document。