首页 > 解决方案 > 使用 Lambda 将大型 CSV 文件导入 DynamoDB 时出错

问题描述

我想将一个大的 csv 文件(大约 1gb,2.5m 行和 50 列)导入 DynamoDb,所以一直在关注AWS 的这个博客。

但是,我似乎遇到了超时问题。我已经摄入了大约 600,000 行,并且它倒下了。

我认为从读取 CloudWatch 日志来看,由于在 CSV 文件上读取 boto3 导致超时发生(它首先打开整个文件,迭代并批量写入)......我试图减小文件大小(3 列, 10,000 行作为测试),我在 2500 行后超时。

这里有什么想法吗?!

蒂亚:)

标签: amazon-web-servicesaws-lambdaamazon-dynamodb

解决方案


我非常感谢这些建议(克里斯和贾莫德)。在尝试以编程方式将事物分解成更小的块但失败后,我决定总体上看一下这种方法。

通过研究,我了解到有 4 种选择:

  1. Lambda 函数 - 如上所述,这会因超时而失败。
  2. AWS Pipeline - 没有用于将 CSV 导入 DynamoDB 的模板
  3. 手动输入 - 250 万个项目?不,谢谢!:)
  4. 使用 EC2 实例将数据加载到 RDS 并使用 DMS 迁移到 DynamoDB

最后一个选项实际上效果很好。这是我所做的:

  • 创建一个 RDS 数据库(我使用了 db.t2.micro 层,因为它是免费的)并创建了一个空白表。
  • 创建 EC2 实例(免费 Linux 层)并:
  • 在 EC2 实例上:使用 SCP 将 CSV 文件上传到 ec2 实例
  • 在 EC2 实例上:首先Sudo yum install MySQL获取所需的工具,然后使用mysqlimport--local 选项将 CSV 文件导入 rds MySQL 数据库,这需要几秒钟才能完成。
  • 在这一点上,我还进行了一些数据清理,以删除一些空格和一些已经潜入文件的字符返回,仅使用标准 SQL 查询。
  • 使用 DMS,我创建了一个复制实例、源 (rds) 和目标 (dynamodb) 数据库的端点,最后创建了一个要导入的任务。
  • 导入大约需要 4 小时 30 米
  • 导入后,我删除了 EC2、RDS 和 DMS 对象(以及关联的 IAM 角色)以避免任何潜在成本。

幸运的是,我有一个扁平的结构可以做到这一点,而且它只有一张桌子。我需要 dynamodb 的廉价速度,否则,我会坚持使用 RDS(我几乎完成了一半的过程!!!)

感谢您的阅读,如果您以后遇到同样的问题,祝您好运。


推荐阅读