Apache nifi Nifi从Oracle获取数据问题

Apache nifi Nifi从Oracle获取数据问题,apache-nifi,Apache Nifi,我需要从oracle获取数据并上传到google云存储 我正在使用executeSql proecssor,但对于大型表来说,它是失败的,甚至对于具有大约45mb大小的100万条记录的表,它也需要2小时才能拉出来 使用restapi将表名传递给listenHttp,后者将表名传递给executeSql。我不能使用QueryDatabase,因为表的数量是动态的,并且使用UI和Nifi RestUi启动提取的调用也是动态的 请建议ExecuteSql Processor中的任何调优参数。我相信您所

我需要从oracle获取数据并上传到google云存储

我正在使用executeSql proecssor,但对于大型表来说,它是失败的,甚至对于具有大约45mb大小的100万条记录的表,它也需要2小时才能拉出来

使用restapi将表名传递给listenHttp,后者将表名传递给executeSql。我不能使用QueryDatabase,因为表的数量是动态的,并且使用UI和Nifi RestUi启动提取的调用也是动态的


请建议ExecuteSql Processor中的任何调优参数。

我相信您所说的是,当处理器仍在处理(大型)结果集时,能够拥有较小的流文件,并可能将其发送到下游。对于QueryDatabaseTable,此功能已添加到NiFi 1.6.0(via)中,并且在即将发布的版本(NiFi 1.8.0 via)中,此功能也将可用于ExecuteSQL


你应该能够使用它来做你想做的事情。在这里,您可以设置分区大小(最终将是每个流文件的行数),如果您希望在每次流文件进入时获取整个表,则不需要“最大值”列(这也允许您按照所述处理多个表)。GenerateTableFetch将生成SQL语句以从表中获取“页面”数据,这将在非常大的表上为您提供更好的增量性能。

我相信您所说的功能是拥有较小的流文件,并可能在处理器仍在处理(大型)流文件时将其发送到下游结果集。对于QueryDatabaseTable,此功能已添加到NiFi 1.6.0(via)中,并且在即将发布的版本(NiFi 1.8.0 via)中,此功能也将可用于ExecuteSQL


你应该能够使用它来做你想做的事情。在这里,您可以设置分区大小(最终将是每个流文件的行数),如果您希望在每次流文件进入时获取整个表,则不需要“最大值”列(这也允许您按照所述处理多个表)。GenerateTableFetch将生成SQL语句以从表中获取“页面”数据,这将在非常大的表上为您提供更好的增量性能。

Hi matt感谢您的回复。我也在尝试同样的事情。但即使在这种情况下,execute sql处理器也需要30分钟以上的时间来获取5000条记录,这些记录的大小为1页。在Oracle<12上,这可能会很慢,因为有一个嵌套的select来获取,然后按行号排序。在NiFi 1.7.0中,GTF中有一个选项可以使用列的值来获取页面,因此如果您有一个整数/长列,其值分布相当均匀,可能像毫秒(但不是时间戳类型)或ID值,您可以使用该列,而且应该快得多。表名由用户从UI传递,并通过rest传递给nifi。因此,我无法在处理器内部获取列名:(还有其他的优化方法吗?我正在Oracle 11g中使用ojdbc7.jar。我也尝试了ojdc6,但没有什么不同。这可能最好作为一个单独的问题来处理。Hi matt谢谢你的回答。我也尝试了完全相同的方法。但即使在这种情况下,execute sql处理器也需要30分钟以上的时间来获取5000个记录。)形成1页大小的rds。在Oracle<12上,这可能会很慢,因为有一个嵌套的select来获取,然后按行号排序。在NiFi 1.7.0中,GTF中有一个选项,可以使用列的值来获取页面,因此如果您有一个整数/长列,其值分布相当均匀,可能像毫秒(但不是时间戳类型)或者ID值,您可以使用该列,而且应该快得多。表名由用户从UI传递,并通过rest传递给nifi。因此,我无法在处理器内部获取列名:(是否还有其他的优化可以工作。我正在将ojdbc7.jar与Oracle 11g一起使用。我也尝试了ojdc6,但没有什么不同。这可能最好作为一个单独的SO问题来处理