在使用spark和redshift时,如何优化etl数据管道以实现容错?

6ju8rftf  于 2021-07-14  发布在  Spark
关注(0)|答案(1)|浏览(296)

我正在使用pyspark编写一个大批量作业,它将etls 200个表加载到amazonredshift中。这200个表是从一个输入数据源创建的。因此,只有成功地将数据加载到所有200个表中时,批处理作业才会成功。批处理作业每天运行,同时为每个日期将数据添加到表中。
对于容错性、可靠性和幂等性,我当前的工作流程如下:
使用暂存表。使用创建临时红移表 CREATE TEMP TABLE LIKE <target_table> 将数据转换并加载到暂存表中。
对其他200张table重复1-2。
开始 BEGIN 交易。
使用将临时表数据复制到目标表中
INSERT INTO <taget_table> SELECT * FROM <staging_table> END 交易 DROP 所有暂存表。
这样我就可以保证,如果第3步失败(更可能),我不必担心从原始表中删除部分数据。相反,我只需重新运行整个批处理作业,因为临时表在jdbc断开连接后被丢弃。
虽然它解决了大部分的问题,但它不优雅,不老练,而且需要额外的时间。我想知道spark和/或redshift是否提供了标准工具来解决etl世界中的这个非常常见的问题。
谢谢

omhiaaxx

omhiaaxx1#

复制命令可以位于事务块中。你只需要:
开始
将数据复制到所有表
提交(如果成功)
redshift将为所有其他查看器维护表的早期版本,并且在提交之前,它们的表视图不会更改。
您布置的进程的优点是,在事务运行期间,其他进程无法获得表上的独占锁(alter table等)。你的插入会比复制运行得快,所以交易打开的时间会短一些。只有当其他进程在etl运行的同时修改表时,这才是一个问题,这通常不是一个好主意。

相关问题