Apache nifi NiFi—提高QueryDatabaseTable性能以超越Sqoop
我使用QueryDatabaseTable从PDA/Netezza表中读取数据,该表大约有7000万行 Nifi被设置为一个单节点实例,并编辑Apache nifi NiFi—提高QueryDatabaseTable性能以超越Sqoop,apache-nifi,sqoop,netezza,Apache Nifi,Sqoop,Netezza,我使用QueryDatabaseTable从PDA/Netezza表中读取数据,该表大约有7000万行 Nifi被设置为一个单节点实例,并编辑bootstrap.conf以提供16g RAM QueryDatabase表正在使用默认值,但 每个流文件的最大行数:1000000 输出批量大小:10 结果是它花费了相当长的时间,整个70米需要1.5小时,或者大约每分钟1米的记录 是否有其他配置更改可供我尝试以提高性能 QueryDatabaseTable在内部转换为Avro,是否可以跳过此转换,
bootstrap.conf
以提供16g RAM
QueryDatabase表正在使用默认值,但
:1000000每个流文件的最大行数
:10输出批量大小
结果是它花费了相当长的时间,整个70米需要1.5小时,或者大约每分钟1米的记录
还计划很快建立一个集群,但这将是4或6个节点,因此仍希望将性能提高到10分钟或更少。这可能吗 QueryDatabaseTable只能在主节点上运行,因为它是用于获取的单个源。这意味着它不会扩展到分布式/并行解决方案,如Sqoop。另外,如果假设NiFi集群中有3个节点,而使用Sqoop的Hadoop集群中有10个节点,那么在后者中自然会获得更多的并行性 但是,NiFi对此有
GenerateTableFetch->ExecuteSQL
模式。GenerateTableFetch将生成多个流文件,每个流文件包含一条SQL语句,用于从表中获取数据的“页面”,而不是在单个节点上的单个处理器执行完整的获取。然后可以使用ExecuteSQL实际获取行
GenerateTableFetch仍然只在主节点上运行,但它本身不获取行;相反,您可以在同一集群上使用远程进程组->输入端口
在集群节点之间分发流文件,或者在NiFi的最新版本中,您可以在GenerateTableFetch和ExecuteSQL之间使用负载平衡连接
一旦流文件分布在集群中,每个节点就可以并行地在它们上运行ExecuteSQL,并一次获取一页数据进行下游处理
对于输出格式,从NiFi 1.8.0开始,有ExecuteSQLRecord,它允许您以具有RecordSetWriter的任何格式输出行,其中包括Avro、JSON、CSV、XML、自由文本(用于自定义文本格式),您甚至可以为更复杂、专有或当前不支持的格式编写自己的脚本。为了完整起见,还有一个QueryDatabaseTableRecord处理器,但对于这个答案,我不鼓励您使用它来解决您的用例:)QueryDatabaseTable仅在主节点上运行,因为它是用于获取的单个源。这意味着它不会扩展到分布式/并行解决方案,如Sqoop。另外,如果假设NiFi集群中有3个节点,而使用Sqoop的Hadoop集群中有10个节点,那么在后者中自然会获得更多的并行性 但是,NiFi对此有
GenerateTableFetch->ExecuteSQL
模式。GenerateTableFetch将生成多个流文件,每个流文件包含一条SQL语句,用于从表中获取数据的“页面”,而不是在单个节点上的单个处理器执行完整的获取。然后可以使用ExecuteSQL实际获取行
GenerateTableFetch仍然只在主节点上运行,但它本身不获取行;相反,您可以在同一集群上使用远程进程组->输入端口
在集群节点之间分发流文件,或者在NiFi的最新版本中,您可以在GenerateTableFetch和ExecuteSQL之间使用负载平衡连接
一旦流文件分布在集群中,每个节点就可以并行地在它们上运行ExecuteSQL,并一次获取一页数据进行下游处理
对于输出格式,从NiFi 1.8.0开始,有ExecuteSQLRecord,它允许您以具有RecordSetWriter的任何格式输出行,其中包括Avro、JSON、CSV、XML、自由文本(用于自定义文本格式),您甚至可以为更复杂、专有或当前不支持的格式编写自己的脚本。为了完整起见,还有一个QueryDatabaseTableRecord处理器,但对于这个答案,我不鼓励您使用它来解决您的用例:)在我看来,对于Netezza系统来说,每分钟一百万行的速度太慢了
- 外部表/卸载速度应快50-100倍
- 通过ODBC单选连接到快速客户端(我使用过powercenter和SAS)的速度提高了5-10倍
请注意,Netezza上的最短查询时间接近1/8秒,这意味着您需要在每个查询中获得“金钱”的全部价值(很可能是顺便说一句),我怀疑您的框架试图在幕后“过度优化”这一点:)在我看来,对于Netezza系统来说,每分钟100万行的速度太慢了
- 外部表/卸载速度应快50-100倍
- 通过ODBC单选连接到快速客户端(我使用过powercenter和SAS)的速度提高了5-10倍
请注意,Netezza上的最短查询时间接近1/8秒,这意味着您需要在每个查询中获得“金钱”的全部价值(很可能是顺便说一句),我怀疑您的框架试图在幕后“过度优化”这一点:)感谢@mattyb的详细回复。设置集群后,我将尝试GenerateTableFetch->ExecuteSQL模式。我还将尝试在文本输出中使用
ExecuteSQLRecord
,看看它是否提高了性能。此外,RAM的增加会显著提高QDT处理器的速度吗?(从16g到32g???)感谢@mattyb的详细回复。设置集群后,我将尝试GenerateTableFetch->ExecuteSQL模式。我还将尝试在文本输出中使用ExecuteSQLRecord
,看看它是否提高了性能。艾尔