使用Spring Batch的ETL的最佳实践?

时间:2013-09-26 09:58:08

标签: java offline etl

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

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

  

步骤1:截断数据仓库中的表A;
  步骤2:将数据加载到表A中;
  step3:截断数据仓库中的表B;
  步骤4:将数据加载到表B中;
  步骤5:截断数据仓库中的表C;
  步骤6:将数据加载到表C中;
  ...

数据仓库中的那些表ABC,...由实时推荐系统处理使用。

但是,由于我从在线数据库加载的数据非常庞大,因此整个作业处理将非常耗时。因此,如果我截断一个表并且还没有加载数据,那么依赖于该表的实时推荐处理将会遇到很大问题。如何防止此数据不完整?使用临时表,或类似的策略?

任何回复都将不胜感激。

1 个答案:

答案 0 :(得分:0)

您有几个选择:

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

  • 如果源表中没有删除(仅插入和更新),则可以使用块记录从目标到源执行完全读/写操作。

    根据目标数据库引擎,您可以使用不同的选项来执行更新。有些可能要求您尝试执行写入尝试(插入或更新);如果失败,你必须捕获异常并执行另一次写入。 (例如,尝试插入。如果捕获DuplicateKeyException,则必须进行更新。根据插入与更新的比例,您可以反转插入/更新的顺序以更新/插入)

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

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