EC2 适用于从 FTP 同步大型 CSV 文件
EC2 suitability for synching large CSV files from an FTP
我每周必须执行两次任务。该任务包括从 public ftp 服务器获取一个 1.4GB 的 csv 文件。然后我必须对其进行处理(应用一些过滤器、丢弃一些行、进行一些计算),然后将其同步到托管在 AWS RDS 上的 Postgres 数据库。对于每一行,我必须在数据库中检索一个 SKU 条目并确定它是否需要更新。
我的问题是 EC2 是否可以作为我的解决方案。我主要关心的是内存。我已经搜索了一些解决方案 https://github.com/goodby/csv,它们通过逐行获取而不是将其全部拉入内存来处理此问题,但是如果我尝试直接读取 .csv,它们将不起作用来自 FTP。
任何人都可以提供一些见解吗? AWS EC2 是解决这个问题的好平台吗?你会如何处理 csv 大小和内存限制的问题?
您将无法直接从 FTP 流式传输文件,相反,您将复制整个文件并将其存储在本地。使用 curl 或 ftp 命令可能是最有效的方法。
一旦你这样做了,你将需要编写某种程序来一次读取一行或几行文件,如果你可以并行工作的话。有可用的 ETL 工具可以使这变得容易。使用 PHP 可以工作,但对于此类工作来说这不是一个非常有效的选择,并且您的并行化选项有限。
当然,您可以在 EC2 实例上执行此操作(您几乎可以执行任何您可以在 EC2 中提供代码的操作),但是如果您只需要每周 运行 执行两次任务,则 EC2实例将闲置,吃钱,其余时间,除非您为每个任务手动停止和启动它 运行。
一个scheduled AWS Lambda function这里可能更划算,更合适。您的代码选项稍微受限一些,但您可以为 Lambda 函数提供相同的 IAM 权限来访问 RDS,并且它在计划或调用时仅 运行s。
FTP 协议不支持 "streaming"。您不能逐块读取 Ftp 个块中的文件。
老实说,如果你每周只运行两次,下载文件并触发运行更大的实例没什么大不了的,你只需选择r3.large(它的成本低于0.20/hour ), 尽快执行并停止。与 EBS 相比,内部 SSD 磁盘 space 应该为您提供最好的 I/O。
只需确保您的 OS 和代码部署在 EBS 中以供将来重用(除非您有自动代码部署机制)。并且您必须确保 RDS 能够处理突发 I/O,否则它将成为瓶颈。
更好的是,使用 r3.large 实例,您可以将 CSV 文件拆分成更小的块,并行加载它们,然后在一切完成后关闭实例。之后您只需支付最低的根 EBS 存储成本。
如果过程很长,我不会建议 lambda,因为 lambda 只意味着短而快的处理(它会在 300 秒后终止)。
(更新):
如果你打开一个文件,简单的解析方法就是顺序读取它,它可能不会把整个 CPU 充分利用。您可以按照参考文献 answer here 拆分 CSV 文件。
然后使用相同的脚本,您可以通过将一些进程发送到后台进程来同时调用它们,下面的示例显示将 python 进程置于后台 Linux 下。
parse_csvfile.py csv1 &
parse_csvfile.py csv2 &
parse_csvfile.py csv3 &
因此,单个文件顺序 I/O 将利用多个文件。另外,分割文件在SSD下应该是小菜一碟。
所以我让它像这样工作。
我使用了 Python 和两个很棒的库。首先,我创建了一个 Python 代码来从 FTP 请求和下载 csv 文件,这样我就可以将它加载到内存中。第一个包是 Pandas, which is a tool to analyze large amounts of data. It includes methods to read files from a csv easily. I used the included features to filter and sort. I filtered the large csv by a field and created about 25 new smaller csv files, which allowed me to deal with the memory issue. I used as well Eloquent,这是一个受 Laravel 的 ORM 启发的库。该库允许您使用 AWS public DNS、数据库名称、用户名和密码创建连接,并使用简单的方法进行查询,而无需编写单个 Postgres 查询。最后,我创建了一个 T2 微型 AWS 实例,安装了 Pandas 并 Eloquent 更新了我的代码,仅此而已。
我每周必须执行两次任务。该任务包括从 public ftp 服务器获取一个 1.4GB 的 csv 文件。然后我必须对其进行处理(应用一些过滤器、丢弃一些行、进行一些计算),然后将其同步到托管在 AWS RDS 上的 Postgres 数据库。对于每一行,我必须在数据库中检索一个 SKU 条目并确定它是否需要更新。
我的问题是 EC2 是否可以作为我的解决方案。我主要关心的是内存。我已经搜索了一些解决方案 https://github.com/goodby/csv,它们通过逐行获取而不是将其全部拉入内存来处理此问题,但是如果我尝试直接读取 .csv,它们将不起作用来自 FTP。
任何人都可以提供一些见解吗? AWS EC2 是解决这个问题的好平台吗?你会如何处理 csv 大小和内存限制的问题?
您将无法直接从 FTP 流式传输文件,相反,您将复制整个文件并将其存储在本地。使用 curl 或 ftp 命令可能是最有效的方法。
一旦你这样做了,你将需要编写某种程序来一次读取一行或几行文件,如果你可以并行工作的话。有可用的 ETL 工具可以使这变得容易。使用 PHP 可以工作,但对于此类工作来说这不是一个非常有效的选择,并且您的并行化选项有限。
当然,您可以在 EC2 实例上执行此操作(您几乎可以执行任何您可以在 EC2 中提供代码的操作),但是如果您只需要每周 运行 执行两次任务,则 EC2实例将闲置,吃钱,其余时间,除非您为每个任务手动停止和启动它 运行。
一个scheduled AWS Lambda function这里可能更划算,更合适。您的代码选项稍微受限一些,但您可以为 Lambda 函数提供相同的 IAM 权限来访问 RDS,并且它在计划或调用时仅 运行s。
FTP 协议不支持 "streaming"。您不能逐块读取 Ftp 个块中的文件。
老实说,如果你每周只运行两次,下载文件并触发运行更大的实例没什么大不了的,你只需选择r3.large(它的成本低于0.20/hour ), 尽快执行并停止。与 EBS 相比,内部 SSD 磁盘 space 应该为您提供最好的 I/O。
只需确保您的 OS 和代码部署在 EBS 中以供将来重用(除非您有自动代码部署机制)。并且您必须确保 RDS 能够处理突发 I/O,否则它将成为瓶颈。
更好的是,使用 r3.large 实例,您可以将 CSV 文件拆分成更小的块,并行加载它们,然后在一切完成后关闭实例。之后您只需支付最低的根 EBS 存储成本。
如果过程很长,我不会建议 lambda,因为 lambda 只意味着短而快的处理(它会在 300 秒后终止)。
(更新): 如果你打开一个文件,简单的解析方法就是顺序读取它,它可能不会把整个 CPU 充分利用。您可以按照参考文献 answer here 拆分 CSV 文件。
然后使用相同的脚本,您可以通过将一些进程发送到后台进程来同时调用它们,下面的示例显示将 python 进程置于后台 Linux 下。
parse_csvfile.py csv1 &
parse_csvfile.py csv2 &
parse_csvfile.py csv3 &
因此,单个文件顺序 I/O 将利用多个文件。另外,分割文件在SSD下应该是小菜一碟。
所以我让它像这样工作。
我使用了 Python 和两个很棒的库。首先,我创建了一个 Python 代码来从 FTP 请求和下载 csv 文件,这样我就可以将它加载到内存中。第一个包是 Pandas, which is a tool to analyze large amounts of data. It includes methods to read files from a csv easily. I used the included features to filter and sort. I filtered the large csv by a field and created about 25 new smaller csv files, which allowed me to deal with the memory issue. I used as well Eloquent,这是一个受 Laravel 的 ORM 启发的库。该库允许您使用 AWS public DNS、数据库名称、用户名和密码创建连接,并使用简单的方法进行查询,而无需编写单个 Postgres 查询。最后,我创建了一个 T2 微型 AWS 实例,安装了 Pandas 并 Eloquent 更新了我的代码,仅此而已。