Redshift使用UNLOAD向S3卸载:单文件覆盖操作是否原子?
Redshift UNLOAD 覆盖操作的原子性与读取一致性问题
核心问题
当执行Redshift UNLOAD命令时,配置parallel off和allowoverwrite参数(输出仅单个文件),其他读取方在UNLOAD运行期间读取目标S3对象时:
- 是否会看到中间不一致的状态?
- 覆盖操作是否具备原子性?是否存在读取方找不到文件的中间状态?
关键结论与解释
不会出现中间不一致状态:
Redshift UNLOAD搭配allowoverwrite时,并不会直接删除原文件再写入新内容。它会先将数据写入S3上的临时对象,待新数据完全写入、校验完成后,再通过S3的原子替换操作覆盖原目标对象。由于S3的PUT/替换操作是原子性的,读取方要么获取到旧的完整文件,要么获取到新的完整文件,绝不会读到半写入的不完整数据。覆盖操作具备原子性,无文件不存在的空窗期:
原目标文件会一直保留到新文件完全就绪并完成原子替换的瞬间,所以读取过程中不会出现“找不到文件”的情况。整个替换过程是原子的,不存在中间状态下文件消失的问题。
内容的提问来源于stack exchange,提问作者Ktri
相关产品推荐
相关产品推荐

