AWS DMS同步至S3的分区配置及文件路径问题咨询
关于AWS DMS将RDS MySQL数据推送至S3的分区配置问题
场景背景
你当前使用AWS DMS将RDS MySQL数据同步至S3,S3目标端点配置如下:
{ "CsvRowDelimiter": "\\n", "CsvDelimiter": ",", "AddColumnName": true, "CompressionType": "NONE", "EnableStatistics": true, "DatePartitionEnabled": true, "DatePartitionSequence": "YYYYMMDD", "DatePartitionDelimiter": "SLASH", "EncryptionMode": "SSE_KMS", "ServerSideEncryptionKmsKeyId": "XXXXX", "TimestampColumnName":"TIMESTAMP", "IncludeOpForFullLoad": true, "CdcInsertsOnly": false }
生成的S3目录结构为:
-/ --/my_table_name ---LOAD00000001.csv ---/2023 ----/01 -----/09 ------20230109-165206632.csv
问题解答
1. 是否可以为日期文件夹设置前缀,使其遵循Hive命名规范(例如/year=2023/month=01/day=09/)?
AWS DMS的S3目标端点原生不支持直接生成key=value格式的Hive风格分区目录,可通过以下两种方案实现需求:
- 方案1:S3事件触发Lambda重命名目录
配置S3事件(当新分区目录创建时触发),编写Lambda函数将/2023/01/09结构重命名为/year=2023/month=01/day=09。注意处理文件移动的原子性,避免同步过程中出现数据不一致。 - 方案2:通过Glue Crawler配置分区投影(无需修改物理目录)
若仅需让Hive/Athena识别分区,无需改动实际S3目录结构。在Glue Crawler中配置分区投影,指定分区键为year、month、day,并设置对应投影规则(如year为四位数字、month为两位数字),Crawler会自动将现有目录结构映射为Hive兼容的分区表,上层查询可直接按year、month过滤。
2. 是否可以将初始全量加载生成的CSV文件放置在日期文件夹结构内,而非根目录?
DMS默认将全量加载文件放在表目录根路径下,因为全量加载阶段无单条数据的CDC时间戳关联。可通过以下方案解决:
- 方案1:Lambda触发移动/拆分全量文件
全量加载完成后触发Lambda函数,读取文件中TIMESTAMP字段统计日期范围,将全量文件移动到对应日期目录;若数据跨多个日期,可改用Glue Job拆分文件后分别放入对应分区。 - 方案2:拆分全量与CDC任务流程
先将全量加载数据导出至临时目录,再通过ETL工具(如Glue Job)按TIMESTAMP字段拆分到对应日期分区,之后启动CDC同步任务,实现全量与CDC数据的分区结构统一。 - 方案3:自定义全量加载分区规则
若全量数据有统一业务日期字段,可在DMS任务的表映射规则中结合S3端点分区配置实现,但该方式对数据字段的一致性要求较高,实际可靠性不如前两种方案。
内容的提问来源于stack exchange,提问作者alxsbn
相关产品推荐
相关产品推荐

