【问题标题】:Errors importing large CSV file to DynamoDB using Lambda使用 Lambda 将大型 CSV 文件导入 DynamoDB 时出错
【发布时间】:2020-10-05 03:12:56
【问题描述】:

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

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

我认为通过读取 CloudWatch 日志,超时是由于对 CSV 文件的 boto3 读取(它首先打开整个文件,迭代并批量写入)...我试图减小文件大小(3 列,10,000 行作为测试),我在 2500 行后超时。

这里有什么想法吗?!

TIA :)

【问题讨论】:

  • 您是否检查过您没有受到 DynamoDB 的限制?这将作为 CloudWatch 中的指标提供
  • 谢谢克里斯,我检查了这一点,但没有发生限制(计为 0 个限制)。我相信使用 OnDemand 表时,预置的读/写容量单位达到了 400 左右的峰值。
  • 你说超时,是不是说超过了Lambda函数配置的超时时间?它设置为什么?您是在批量写入 DynamoDB 之前尝试将整个 CV 读入内存,还是在 CSV 中有效地进行流式传输?
  • 如果你遇到超时,你能把它分解成更小的块并单独导入它们吗?

标签: amazon-web-services aws-lambda amazon-dynamodb


【解决方案1】:

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

通过研究,我了解到有 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 获取所需工具,然后使用带有 --local 选项的 mysqlimport 将 CSV 文件导入 rds MySQL 数据库,这需要几秒钟才能完成。
  • 此时,我还使用标准 SQL 查询进行了一些数据清理,以删除一些空格和一些悄悄进入文件的字符返回。
  • 使用 DMS,我创建了一个复制实例、源 (rds) 和目标 (dynamodb) 数据库的端点,最后创建了一个要导入的任务。
  • 导入耗时约 4 小时 30 米
  • 导入后,我删除了 EC2、RDS 和 DMS 对象(以及关联的 IAM 角色)以避免任何潜在成本。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 2021-01-28
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多