Apache nifi NiFi—提高QueryDatabaseTable性能以超越Sqoop

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,是否可以跳过此转换,

我使用QueryDatabaseTable从PDA/Netezza表中读取数据,该表大约有7000万行

Nifi被设置为一个单节点实例,并编辑
bootstrap.conf
以提供16g RAM

QueryDatabase表正在使用默认值,但

  • 每个流文件的最大行数
    :1000000
  • 输出批量大小
    :10

结果是它花费了相当长的时间,整个70米需要1.5小时,或者大约每分钟1米的记录

  • 是否有其他配置更改可供我尝试以提高性能
  • QueryDatabaseTable在内部转换为Avro,是否可以跳过此转换,而只使用PDA/Netezza中的文本格式来提高性能
    还计划很快建立一个集群,但这将是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
    ,看看它是否提高了性能。艾尔