我使用Spring Batch将大量在线数据提取 - 转换 - 加载到数据仓库中进行推荐分析。两者都是RDBMS。
我的问题是,离线Spring Batch ETL的最佳做法是什么?满载还是增量?我更喜欢Full Load,因为它更简单。目前我正在使用这些步骤进行数据加载:
步骤1:截断数据仓库中的表A;
步骤2:将数据加载到表A中;
step3:截断数据仓库中的表B;
步骤4:将数据加载到表B中;
步骤5:截断数据仓库中的表C;
步骤6:将数据加载到表C中;
...
数据仓库中的那些表A
,B
,C
,...由实时推荐系统处理使用。
但是,由于我从在线数据库加载的数据非常庞大,因此整个作业处理将非常耗时。因此,如果我截断一个表并且还没有加载数据,那么依赖于该表的实时推荐处理将会遇到很大问题。如何防止此数据不完整?使用临时表,或类似的策略?
任何回复都将不胜感激。
答案 0 :(得分:0)
您有几个选择:
使用源表上的审核日志来确定需要在目标中更新哪些记录。这是批处理ETL的最佳选择,但它要求在源系统中启用审计日志记录。如果你有能力开启审计并且它不会成为性能问题,那就是你要走的路。
如果源表中没有删除(仅插入和更新),则可以使用块记录从目标到源执行完全读/写操作。
根据目标数据库引擎,您可以使用不同的选项来执行更新。有些可能要求您尝试执行写入尝试(插入或更新);如果失败,你必须捕获异常并执行另一次写入。 (例如,尝试插入。如果捕获DuplicateKeyException
,则必须进行更新。根据插入与更新的比例,您可以反转插入/更新的顺序以更新/插入)
其他引擎允许MERGE,它允许一步更新/插入/删除。
这种方法仍会移动大量数据,但对目标的影响最小。当然,这假定您能够以不存在参照完整性问题的方式订购表更新。在阅读时写入目标。