【问题标题】:EC2 suitability for synching large CSV files from an FTPEC2 适用于从 FTP 同步大型 CSV 文件
【发布时间】:2016-06-13 04:49:43
【问题描述】:

我必须每周执行两次任务。该任务包括从公共 ftp 服务器获取 1.4GB 的 csv 文件。然后我必须处理它(应用一些过滤器,丢弃一些行,进行一些计算),然后将其同步到 AWS RDS 上托管的 Postgres 数据库。对于每一行,我必须在数据库中检索一个 SKU 条目并确定它是否需要更新。

我的问题是 EC2 是否可以作为我的解决方案。我主要关心的是内存。我已经搜索了一些解决方案https://github.com/goodby/csv,它们通过逐行获取而不是将其全部拉到内存来处理这个问题,但是如果我尝试直接从FTP。

谁能提供一些见解? AWS EC2 是解决这个问题的好平台吗?您将如何处理 csv 大小和内存限制的问题?

【问题讨论】:

  • if I try to read the .csv directly from the FTP. 请澄清一下,因为 FTP 协议不做“流式传输”。

标签: csv amazon-ec2 ftp amazon-rds


【解决方案1】:

您将无法直接从 FTP 流式传输文件,而是要复制整个文件并将其存储在本地。使用 curl 或 ftp 命令可能是最有效的方法。

一旦你这样做了,你将需要编写某种程序,如果你可以并行化工作,一次或几行读取文件。有一些可用的 ETL 工具可以让这变得简单。使用 PHP 可以工作,但对于此类工作来说它不是一个非常有效的选择,并且您的并行化选项有限。

【讨论】:

    【解决方案2】:

    当然,您可以在 EC2 实例上执行此操作(您几乎可以执行任何可以在 EC2 中提供代码的操作),但如果您只需要每周运行两次任务,EC2 实例将处于空闲状态,其余时间都在吃钱,除非您为每个任务运行手动停止并启动它。

    scheduled AWS Lambda function 在这里可能更具成本效益且更合适。您的代码选项稍有限制,但您可以为 Lambda 函数提供相同的 IAM 权限以访问 RDS,并且它仅在计划或调用时运行。

    【讨论】:

    • Karen,你认为 Lambda 会在内存中处理 1.4GB 的信息吗?我正在学习,我不知道 300 秒的限制是否有问题?
    • Lambda 函数可以配置为使用高达 1.5Gb 的内存。你会很接近,因为你的执行代码也需要内存。对于执行时间,您必须运行并查看。与运行 Linux 的任何给定实例相比,我不知道是否有办法计算 Lambda 函数的性能。如果您的时间多于金钱,则值得测试,尽管如果您的 CSV 文件会随着时间的推移而增长,这可能会成为一个问题,除非 AWS 将来增加内存和执行时间限制。 (这可能是他们支持团队的问题。)
    • 我最终没有使用 Lambda 是因为你告诉我的原因,还因为我必须使用两个库,而且在 Lambda 中这样做比在 AWS EC2 Ubuntu 实例上安装它们更复杂.
    【解决方案3】:

    FTP 协议不做“流式传输”。您不能逐块从 Ftp 块中读取文件。

    老实说,如果你每周只运行两次,下载文件并触发运行更大的实例没什么大不了的,你只需选择 r3.large(它的成本低于 0.20/小时),尽快执行并停止它。与 EBS 相比,内部 SSD 磁盘空间应该为您提供最佳的 I/O。

    只需确保您的操作系统和代码部署在 EBS 中以供将来重用(除非您有自动代码部署机制)。并且您必须确保 RDS 能够处理突发 I/O,否则它将成为瓶颈。

    更好的是,使用 r3.large 实例,您可以将 CSV 文件拆分为更小的块,并行加载它们,然后在一切完成后关闭实例。之后您只需支付最低的根 EBS 存储成本。

    如果过程很长,我不建议使用 lambda,因为 lambda 仅用于短而快速的处理(它将在 300 秒后终止)。

    (更新): 如果你打开一个文件,解析它的简单方法是顺序读取它,它可能无法充分利用整个 CPU。您可以按照 answer here 的引用拆分 CSV 文件。

    然后使用相同的脚本,您可以通过将一些发送到后台进程来同时调用它们,下面的示例显示了在 Linux 下将 python 进程置于后台。

    parse_csvfile.py csv1 & 
    parse_csvfile.py csv2 & 
    parse_csvfile.py csv3 & 
    

    所以代替单个文件顺序 I/O,它将使用多个文件。此外,在 SSD 下拆分文件应该是轻而易举的事。

    【讨论】:

    • 到目前为止,我对 AWS RDS 和 S3 有一些经验。我现在正在学习 Lambda,因此我想问你是否相信(以你的最佳猜测为目标)我的过程需要超过 300 秒?我假设我在 S3 存储桶上有 csv。另一方面,您是否建议我可以制作一些 Python 程序来下载文件处理并将其推送到我的 RDS 数据库,对其进行测试,然后将其推送到我应该在每个事件中启动和停止的 EC2 实例?
    • @Jonathan :恕我直言,有些任务可能不值得在 lambda 上投入成本和麻烦。您可能需要更多时间(代价高昂)来测试 lambda 功能和错误处理。 OTH,您可以部署及时且廉价的 EC2 实例,只需很少的测试和学习曲线。 serverlesscode.com/post/aws-lambda-limitationsdatawire.io/3-reasons-aws-lambda-not-ready-prime-time
    • 我在过去两天意识到了这一点。所以我想我会听从你的建议。我决定使用 ftplib、csv 和 eloquent 库编写一些 Python 代码,并按照您的建议将其上传到 EC2。只是一个问题……你能详细说明一下并行加载块和突发 I/O 吗?
    【解决方案4】:

    所以我让它像这样工作。

    我使用了 Python 和两个很棒的库。首先,我创建了一个 Python 代码来从 FTP 请求和下载 csv 文件,以便将其加载到内存中。第一个包是Pandas,这是一个分析大量数据的工具。它包括轻松从 csv 读取文件的方法。我使用包含的功能进行过滤和排序。我通过一个字段过滤了大 csv,并创建了大约 25 个新的较小的 csv 文件,这使我能够处理内存问题。我也使用了Eloquent,这是一个受 Laravel 的 ORM 启发的库。该库允许您使用 AWS 公共 DNS、数据库名称、用户名和密码创建连接,并使用简单的方法进行查询,而无需编写单个 Postgres 查询。最后,我创建了一个 T2 微型 AWS 实例,安装了 Pandas,Eloquent 更新了我的代码,就是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-26
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多