如何将S3存储的超大型CSV文件成功导入DynamoDB
S3存储200万行以上CSV导入DynamoDB落地方案
原有方案失败根因
- Lambda方案无法跑完全量:Lambda单次执行最长硬超时为15分钟,你当前单实例15分钟导入12万行已经属于常规性能较好的水平,200万行量级靠单Lambda实例串行写入不可能在超时窗口内完成;就算做了多Lambda分片触发,没有做游标持久化、失败重试机制的话,中途中断后无法续跑,很容易丢数。
- Pipeline方案卡停:卡在「waiting for runner」后直接停止,核心原因是执行资源拉起失败,常见触发点包括执行角色权限缺失、Runner资源配额不足、临时存储配置不满足要求,调度系统等待资源超时后直接终止任务。
优先落地方案:DynamoDB原生S3批量导入(零代码、稳定性最高)
这个是AWS官方针对S3到DynamoDB的大批量导入场景做的托管能力,不需要自行维护计算资源,不会有超时、资源拉不起来的问题,200万行CSV通常10-30分钟即可完成全量导入:
- 提前校验CSV格式:第一行必须为表头,表头名称要和目标DynamoDB表的分区键、排序键、属性名对应,不要存在空行、未转义的特殊字符,有嵌套结构的字段要提前转成字符串或者调整为平铺结构。
- 进入DynamoDB控制台选择「从S3导入」功能,指定CSV所在的S3路径,输入格式选择CSV,匹配目标表的主键字段和对应数据类型。
- 配置优化项:
- 导入阶段将目标表设置为按需容量模式,避免触发预置吞吐量限流,导入完成后可切回预置容量模式降低成本
- 给导入服务关联的角色配置S3对象读权限、目标DynamoDB表的写权限即可,不需要额外开放其他权限
- 单CSV文件即使超过10GB也不需要手动拆分,服务端会自动分片并行导入
该导入模式不会占用目标表的业务读写容量,导入过程中不会影响线上业务请求
备选方案:EMR Serverless分布式导入(适合需要前置数据清洗的场景)
如果导入前需要做字段过滤、格式转换、去重、主键拼接这类清洗逻辑,直接用EMR Serverless提交Spark作业即可,不需要手动搭建集群:
- 作业逻辑直接读取S3上的CSV文件,完成清洗逻辑后通过DynamoDB Spark Connector批量写入目标表
- 资源配置建议设置10-20个executor,写入时开启批量写入参数
dynamodb.s3.bucket,单批写入条目数控制在25条以内、单批大小不超过400KB,避免触发DynamoDB写入限制,200万行数据通常10分钟内即可跑完 - 作业执行过程中支持断点续跑,不会因为单节点故障导致全量任务失败,资源按需拉起,任务完成后自动释放,不需要长期维护资源
实操避坑点
- 不要用单EC2实例、单函数实例串行跑全量导入,200万行量级下很容易因为网络波动、进程超时导致任务中断
- 全量导入前先取1万行样本做小批量测试,确认字段映射正确、主键无重复,避免全量导入后出现主键覆盖、字段类型错乱的问题
- 导入完成后可以扫表做行数校验,确认导入数据量和源CSV行数一致
内容的提问来源于stack exchange,提问作者Alec
相关产品推荐
相关产品推荐

