为数据库中的多个表安排单个nifi进程组

时间:2018-05-25 10:01:41

标签: scheduler apache-nifi

我在Nifi中创建了一个具有以下要求的流程组:

从hive表中获取数据>>加密内容>>上传到azure blob存储。

现在我有3000个表需要安排上述流程。有没有办法只为所有表使用单个流,而不是为每个表创建3000个流。

enter image description here

此外,我还想为某些表执行azure存储而不是全部。是否有任何方法可以根据表1仅应用于gcloud而不是Azure上的任何条件来指示流。同样,我希望表2能够同时使用azure和gcloud。

提前致谢

1 个答案:

答案 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