0

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

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

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

数据仓库中的那些表A, B, C, ... 供实时推荐系统处理使用。

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

任何答复将不胜感激。

4

1 回答 1

0

你有几个选择:

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

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

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

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

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

于 2013-10-01T15:59:01.217 回答