用于ETL的Spring Cloud数据流

时间:2019-03-01 10:34:51

标签: spring-cloud-dataflow

我们正在尝试通过利用Spring Cloud数据流来设计ETL解决方案。

要求主要是:

  1. 查询具有只读访问权限的外部源数据库,该访问权限可能多达约40万行
  2. 进行最小转换/数据质量
  3. 使用jdbc接收器上载/接收到Postgres数据集市。 (在每天上传之前截断表格)
  4. 每24小时运行一次

我们面临的一些挑战:

  • 我们尝试使用JDBC源启动器应用程序连接到源数据库,
    但是,由于我们要访问的数据库受到其他部门的限制,因此它们受到限制,因此无法使用jdbc.update功能更新源数据库以将行标记为“可见”。

  • 是否存在一种建议的方法来查询和翻页大型结果集而不会耗尽内存?在这种情况下,jdbc.max-rows-per-poll选项似乎不合适。

我们不建议使用Tasks / Batch,因为流管道更强大,更干净(数据可以流过流并进行转换)。有没有人成功地使用SCDF流来实现类似的目标,或者根本就不是为此用例设计的?

1 个答案:

答案 0 :(得分:1)

可以在SCDF的流模型和批处理模型中解决所描述的需求。而且,看来您已经能够很好地将这两个功能相关联。 :)

要考虑的几个选项。

对于#1,由于您没有办法说服数据库团队在现有表中添加新列,因此您可以构建一个自定义流/批处理应用程序来模仿JDBC源的功能,但是,请使用另一个数据存储区来跟踪已经“看到”或“已处理”的记录。最终,您需要某种形式的持久性存储/缓存来决定要处理哪些行,而不要处理哪些行。

或者,您可以构建一个基于数据库支持的CDC功能的自定义源。我们正在尝试使用Debezium构建一个[参见:spring-cloud-stream-app-starters/app-starters-release#173],并且在tzolov/cdc-debezium上有关于此事的POC。这样,您仅需依靠受支持的数据库的CDC事件模型即可自动仅从表中接收新记录。

可以随意尝试POC并使用您的发现/用例对问题#173进行评论。

第二个问题更多是设计问题。如果需要使用1-go处理较大的结果集,是否适合流传输模型?也许您可以将其设计为脱机处理它们的任务/批处理工作,以便更好地利用故障恢复和可重新启动性。

一旦有了类似CDC的源,无论如何,您收到的只是新事件/行,因此可能会自动解决流控制问题。