我的 RDS postgres/oracle(尚未确定是 oracle 还是 postgres)实例中有大约 30 个表。我想获取过去 4 小时内插入/更新的所有记录(可配置),创建与每个表相关的 csv 文件并将文件存储在 S3 中。我希望整个过程都是事务性的。如果从一张表获取数据时出现任何错误,我不希望与其他 29 个表相关的数据保留在 S3 中。数据不是很大,在4小时内,每个表的记录数不超过100条。
我正在考虑在 EMR 集群中使用 Spark 作业来从 RDS 获取数据,为每个表创建一个 csv 并在流程结束时将所有文件发布到 S3。一旦数据发布到 S3,EMR 集群就会被销毁。 cloudwatch 触发器将每 4 小时调用一次 lamda,这将启动一个新的 EMR 集群来执行此作业。
对于这种转变,是否有任何值得探索的替代方法?
最佳答案
看看AWS Glue它在幕后使用 EMR,但您不需要关心基础设施和配置,只需 setup crawler和 write your ETL job .
请注意,AWS Glue 不支持 JDBC 连接的谓词下推 ( currently s3 only ),因此这意味着它将首先加载整个表,然后再应用过滤。
此外,您还应该仔细考虑原子性,因为 Glue ETL 作业只是处理数据并写入接收器,而无需事务。如果发生故障,它不会删除部分写入的记录,因此您应该自行管理。我会考虑几个选项:
- 每次执行时将数据写入临时文件夹(本地或 s3),然后使用
aws s3 sync
将对象移动到最终目的地使用 TransferManager from AWS SDK 命令或复制数据 - 将数据写入最终目的地的专用文件夹中,并在出现故障时使用 CLI 或 SDK 将其删除
关于java - RDS 到 S3 - 数据转换 AWS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50361589/