gpt4 book ai didi

Java ETL流程

转载 作者:行者123 更新时间:2023-12-01 07:38:54 24 4
gpt4 key购买 nike

我面临新的挑战,从 Oracle 数据库加载约 100M 行并将它们插入远程 MySQL 数据库服务器。

我将问题分为两部分:

  1. 服务器端 REST 服务器,负责将数据加载到 MySQL 服务器中;
  2. 负责加载 Oracle 数据源的客户端 Java 应用。

在 Java 端,我使用普通 JDBC 来加载分页内容并将其通过线路传输到服务器。这种方法效果很好,但它使代码变得繁琐并且不太可扩展,因为我自己使用 Oracle 的 ROWNUM .....WHERE ROWNUM > x 和 ROWNUM < y 进行分页。

我现在已经尝试使用 Hibernate 的 StatelessSession 来使用通过注释映射的实体。代码可读性更强、更干净,但性能较差。

我听说过 ETL 工具和 SpringBatch,但不太了解。还有其他方法可以解决这个问题吗?

提前致谢。

更新

感谢您提出的宝贵建议。我选择使用 SpringBatch 从 Oracle 数据库加载数据,因为环境非常紧张,而且我无法访问 Oracle 的工具集。 SpringBatch 是事实。对于数据写入步骤,我选择使用 MySQL 的 LOAD DATA INFILE 写入记录 block ,正如你们所说的那样。 REST 服务位于中间,因为出于安全原因它们彼此隐藏。

最佳答案

100M 行已经很多了。您可以通过多种方式设计它:REST 服务器、JDBC 读取、Spring Batch , Spring integration 、 hibernate 、ETL。但底线是:时间

无论您选择哪种架构,您最终都必须在 MySQL 中执行这些 INSERT 操作。您的里程可能会有所不同,但只是给您一个数量级:每秒 2K 插入,需要半天时间才能向 MySQL 填充 100M 行 ( source )。

根据同一来源LOAD DATA INFILE每秒可以处理大约 25K 插入(大约增加 10 倍,大约需要一个小时)。

鉴于如此大量的数据,我建议:

  • 使用原生 Oracle 数据库工具转储 Oracle 表,生成人类可读的内容(或计算机可读的内容,但您必须能够解析它)

  • 使用尽可能快的工具解析转储文件。也许 grep/sed/gawk/cut 就足够了?

  • 生成与MySQL兼容的目标文件LOAD DATA INFILE(非常可配置)

  • 使用上述命令将文件导入MySQL

当然,您可以在 Java 中使用漂亮且可读的、经过单元测试和版本控制的代码来完成此操作。但面对如此大量的数据,您需要务实。

这是初始加载。之后 Spring Batch 可能会是一个不错的选择。如果可以的话,尝试将应用程序直接连接到两个数据库 - 同样,这会更快。另一方面,出于安全原因,这可能是不可能的。

如果您想要非常灵活并且不直接将自己绑定(bind)到数据库中,请在 Web 服务后面公开输入 (Oracle) 和输出 (MySQL)(REST 也可以)。 Spring 集成会对你有很大帮助。

关于Java ETL流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7941277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com