【问题标题】:Best practice of ETL using Spring Batch?使用 Spring Batch 的 ETL 最佳实践?
【发布时间】:2013-10-02 05:41:14
【问题描述】:

我正在使用 Spring Batch 将海量在线数据提取-转换-加载到数据仓库中进行推荐分析。两者都是关系型数据库。

我的问题是,离线 Spring Batch ETL 的最佳实践是什么?满载还是增量加载?我更喜欢满载,因为它更简单。目前我正在使用这些步骤进行数据加载工作:

step1:截断数据仓库中的表A;
step2:将数据加载到表A中;
step3:截断数据仓库中的表B;
step4:将数据加载到表B中;
step5:截断数据仓库中的表C;
step6:将数据加载到表C中;
...

数据仓库中的ABC、...这些表被实时推荐系统处理使用。

但由于我从在线数据库加载的数据非常庞大,整个作业处理将非常耗时。所以如果我截断了一个表,还没有加载数据,那么依赖这个表的实时推荐处理就会有很大的问题。如何防止这种数据不完整的发生?使用 Staging Table 或类似的策略?

任何回复将不胜感激。

【问题讨论】:

  • 这不是一个真正的 Spring Batch 问题;这只是一个直接的 ETL 设计问题。
  • 感谢您的提醒。我修改了标签。

标签: java offline etl


【解决方案1】:

你有几个选择:

  • 使用源表上的审核日志来确定目标中需要更新的记录。这是批处理 ETL 的最佳选择,但它需要在源系统中打开审计日志。如果您有能力打开审计并且它不会成为性能问题,那就是要走的路。

  • 如果源表中没有删除(只有插入和更新),您可以简单地使用记录块从目标到源进行完整的读/写。

    根据目标数据库引擎,您将有不同的选项来进行更新。有些可能要求您尝试执行写入尝试(插入或更新);如果失败,您必须捕获异常并执行其他写入。 (例如,尝试插入。如果捕捉到DuplicateKeyException,则必须改为进行更新。根据插入与更新的比率,您可以将插入/更新的顺序颠倒为更新/插入)。

    其他引擎允许 MERGE,它允许一步更新/插入/删除。

    这种方法仍然会移动大量数据,但对目标的影响最小。当然,这假设您能够以不存在参照完整性问题的方式对表更新进行排序。在阅读时写入目标。

【讨论】:

  • 感谢您的回答。我会记住这些。 :) 目前我正在使用 Full load + Staging table 这样做:
  • 加载高耗时数据到staging表;在最后一步将临时表的数据迁移到截断的目标表。再次感谢您的回复。
猜你喜欢
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 2015-09-11
  • 2020-03-08
  • 2010-12-22
  • 1970-01-01
相关资源
最近更新 更多