NiFi - 提高 QueryDatabaseTable 性能以超越 Sqoop

NiFi - Increasing QueryDatabaseTable performance to outperform Sqoop

我正在使用 QueryDatabaseTable 从具有大约 7000 万行的 PDA/Netezza table 中读取数据。

Nifi 设置为单节点实例,bootstrap.conf 编辑为提供 16g RAM。

QueryDatabase table 使用默认值,

除外

结果是用了相当长的时间,全部 70M 需要 1.5 小时,或者大约。 1M 条记录 p/minute.

  1. 是否有其他我可以尝试的配置更改来提高性能?
  2. QueryDatabaseTable 在内部转换为 Avro,是否可以跳过此转换并仅使用 PDA/Netezza 中的文本格式来提高性能?

还计划很快建立一个集群,但那将是 4 或 6 个节点,因此仍然希望将性能提高到 10 分钟或更短。这可能吗?

QueryDatabaseTable 仅用于 运行 在主节点上,因为它是用于获取的单一来源。这意味着它不会扩展到 distributed/parallel 解决方案,例如 Sqoop。此外,如果假设您在 NiFi 集群中有 3 个节点,而在带有 Sqoop 的 Hadoop 集群中有 10 个节点,那么自然地,您会在后者中获得更多的并行性。

但是,NiFi 对此有 GenerateTableFetch -> ExecuteSQL 模式。 GenerateTableFetch 将生成多个流文件,每个流文件包含一个 SQL 语句以从 table 中获取 "page" 数据,而不是单个节点上的单个处理器执行完整提取.然后您可以使用 ExecuteSQL 实际获取行。

GenerateTableFetch 仍然 运行 仅在主节点上运行,但它本身并不获取行;相反,您可以使用同一集群上的 Remote Process Group -> Input Port 在集群节点之间分发流文件,或者在最新版本的 NiFi 中,您可以在 GenerateTableFetch 和 ExecuteSQL 之间使用负载平衡连接。

一旦流文件在集群中分布,每个节点可以运行并行执行SQL并一次获取一页数据用于下游处理。

对于输出格式,从 NiFi 1.8.0 开始,有 ExecuteSQLRecord,它允许您以具有 RecordSetWriter 的任何格式输出行,其中包括 Avro,JSON, CSV、XML、自由文本(用于自定义文本格式),您甚至可以为更复杂、专有或当前不受支持的格式编写自己的脚本。为了完整起见,还有一个 QueryDatabaseTableRecord 处理器,但对于这个答案,我不鼓励您使用它来解决您的用例:)

在我看来,每分钟 100 万行对于 Netezza 系统来说太慢了。

  • 外部 tables/unload 应该快 50-100 倍
  • 单个 Select 通过 ODBC 到快速客户端(我使用过 powercenter 和 SAS)快 5-10 倍

请注意,Netezza 上的最短查询时间接近 1/8 秒,这意味着您需要在每个查询中获得“金钱”的全部价值(顺便说一句,很有可能),我怀疑您的框架试图“在幕后过度优化:)