当前位置: 首页 > 面试题库 >

Java ETL流程

富锦
2023-03-14
问题内容

我要从Oracle数据库加载约1亿行并将其插入远程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写入记录块。REST服务位于中间,因为出于安全原因它们彼此隐藏。


问题答案:

1亿行相当多。您可以通过多种方式进行设计:REST服务器,JDBC读取,Spring
Batch
,Spring集成,Hibernate,ETL。但最重要的是: time

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

根据同一资料来源,LOAD DATA INFILE每秒可处理约25K次插入(大约多10倍,大约需要一个小时的工作时间)。

话虽这么多,我建议:

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

  • 尽可能快地分析转储文件。也许grep/ sed/ gawk/ cut就足够了?

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

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

当然,您可以使用美观且可读的代码,经过单元测试和版本控制的Java语言来执行此操作。但是,有了如此大量的数据,您就必须要务实。

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

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



 类似资料:
  • 我正在研究一个需要工作流/流程引擎的解决方案。我的工作流包含一些基于Java的进程(类)和一些Linux Shell脚本。流程不会是静态的,每个流程的执行取决于前一个流程的状态/结果,将有多条路径,路径将由前一个流程的状态确定。 我尝试查看jBPM,但没有找到合适的支持来调用shell脚本。请根据我的要求为我推荐一个合适的替代方案。 非常感谢。

  • (以一个简单的Websocket聊天室服务端为例) 1、任意位置建立项目目录 如 SimpleChat/ 2、引入Workerman/Autoloader.php 如 require_once '/your/path/Workerman/Autoloader.php'; 3、选定协议 这里我们选定Text文本协议(WorkerMan中自定义的一个协议,格式为文本+换行) (目前WorkerMan支

  • 主要内容:表示,序列化,表示,解析YAML遵循流程的标准程序。YAML中的本机数据结构包括简单表示,例如:节点。 它也称为表示节点图。 它包括映射,序列和标量,正在序列化以创建序列化树。通过序列化,对象将使用字节流进行转换。 序列化事件树有助于创建字符流的表示,反向过程将字节流解析为序列化事件树。 之后节点将转换为节点图。之后在YAML本机数据结构中转换这些值。 如下图解释 - YAML中的信息以两种方式使用:机器处理和人类消费。

  • 静态页面 管理端

  • 当团队管理员启用此功能后,点击即可使用。 1.手机版 使用方法:打开审批-找到要提的流程-输入流程内容-选择审批人-提交   2.电脑版 目前电脑版审批操作与手机版完全一致

  • 关于OAuth 请先查阅以下资料: The OAuth 2.0 Authorization Framework (opens new window) OAuth 2.0 (opens new window) OAuth 2 的授权流程 参与的角色 Resource Owner 资源所有者,即代表授权客户端访问本身资源信息的用户(User),也就是应用场景中的“开发者A” Resource Serv

  • 我有一个关于kafka流应用程序中的控制流的基本问题。如果有两个源主题 我做了一个非常初步的测试,当记录被消费时,我偷看了一下,然后用一个简单的速溶软件打印了它们被处理的瞬间。现在 这些是主题中记录的开始和结束时间戳 主题B记录在主题A之前提取。Sysout显示主题B中的所有记录。有人能帮助理解这一点吗?我希望在编写具有多个输入源的流式应用程序时使用这种理解。 提前感谢

  • 问题内容: 任何人都可以澄清一下下面的过程是否是正确的处理流程流的方法,而没有任何流缓冲区已满和阻塞问题 我正在从Java程序中调用外部程序,正在使用ProcessBuilder来构建流程,执行之后 我正在使用一种方法来处理流程 在我的方法中,我试图处理流程流 readStream方法用于读取我的流文本。 问题答案: 不,那不是正确的方法。 首先,在某些系统上,您的代码将永远停留在调用中,因为该过