Apache spark 当使用Spark和Redshift时,如何优化ETL数据管道以实现容错?

Apache spark 当使用Spark和Redshift时,如何优化ETL数据管道以实现容错?,apache-spark,amazon-redshift,spark-redshift,Apache Spark,Amazon Redshift,Spark Redshift,我正在使用PySpark编写一个大批量作业,该作业将ETL 200个表并加载到Amazon Redshift中。 这200个表是从一个输入数据源创建的。因此,只有当数据成功加载到所有200个表中时,批处理作业才会成功。批处理作业每天运行,同时为每个日期将数据添加到表中 对于容错性、可靠性和幂等性,我当前的工作流程如下: 使用暂存表。使用创建临时红移表,如 将数据转换并加载到临时表中 对200个其他表格重复1-2 开始BEGIN事务 将临时表数据复制到目标表中 使用插入到SELECT*FROM 结

我正在使用PySpark编写一个大批量作业,该作业将ETL 200个表并加载到Amazon Redshift中。 这200个表是从一个输入数据源创建的。因此,只有当数据成功加载到所有200个表中时,批处理作业才会成功。批处理作业每天运行,同时为每个日期将数据添加到表中

对于容错性、可靠性和幂等性,我当前的工作流程如下:

  • 使用暂存表。使用
    创建临时红移表,如
  • 将数据转换并加载到临时表中
  • 对200个其他表格重复1-2
  • 开始
    BEGIN
    事务
  • 将临时表数据复制到目标表中 使用
    插入到SELECT*FROM
  • 结束
    交易
  • 删除所有暂存表
  • 这样我可以保证,如果第3步失败(可能性更大),我就不必担心从原始表中删除部分数据。相反,我将简单地重新运行整个批处理作业,因为临时表在JDBC断开连接后被丢弃

    虽然它解决了大多数问题,但它并不优雅,不老练,而且需要额外的时间。我想知道Spark和/或Redshift是否提供了标准工具来解决ETL世界中非常常见的问题


    谢谢,复制命令可以在事务块中。你只需要:

  • 开始
  • 将数据复制到所有表中
  • 提交(如果成功)
  • Redshift将为所有其他查看器维护表的早期版本,并且在提交之前,它们的表视图不会更改

    您安排的流程的优点是,在事务运行期间,其他流程无法获得表上的独占锁(ALTER TABLE等)。您的插入将比副本运行快,因此事务打开的时间将更短。只有当其他进程在ETL运行的同时修改表时,这才是一个问题,这通常不是一个好主意