NiFi - 提高 QueryDatabaseTable 性能以超越 Sqoop
NiFi - Increasing QueryDatabaseTable performance to outperform Sqoop
我正在使用 QueryDatabaseTable 从具有大约 7000 万行的 PDA/Netezza table 中读取数据。
Nifi 设置为单节点实例,bootstrap.conf
编辑为提供 16g RAM。
QueryDatabase table 使用默认值,
除外
Max Rows Per Flow File
: 1000000
Output Batch Size
: 10
结果是用了相当长的时间,全部 70M 需要 1.5 小时,或者大约。 1M 条记录 p/minute.
- 是否有其他我可以尝试的配置更改来提高性能?
- 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 秒,这意味着您需要在每个查询中获得“金钱”的全部价值(顺便说一句,很有可能),我怀疑您的框架试图“在幕后过度优化:)
我正在使用 QueryDatabaseTable 从具有大约 7000 万行的 PDA/Netezza table 中读取数据。
Nifi 设置为单节点实例,bootstrap.conf
编辑为提供 16g RAM。
QueryDatabase table 使用默认值,
除外Max Rows Per Flow File
: 1000000Output Batch Size
: 10
结果是用了相当长的时间,全部 70M 需要 1.5 小时,或者大约。 1M 条记录 p/minute.
- 是否有其他我可以尝试的配置更改来提高性能?
- 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 秒,这意味着您需要在每个查询中获得“金钱”的全部价值(顺便说一句,很有可能),我怀疑您的框架试图“在幕后过度优化:)