Amazon EC2 + S3 + Python + Scraping--这是最便宜的方法吗?

Amazon EC2 + S3 + Python + Scraping--这是最便宜的方法吗?

我利用了亚马逊的 AWS 产品,如果我没有误解的话,请从更高层面解释一下这一点。

所以我在本地机器上有一些 Python 抓取脚本。我想使用 AWS 来实现超快的互联网连接和更便宜的价格——双赢!

  • 我知道我可以在 EC2 上部署 centOS/Ubuntu 实例。安装必要的 Python 库。使用 boto(Python)启动和停止实例以节省成本。到目前为止我的想法正确吗?(可行吗?)

  • 我将 CRON 一些脚本,这些脚本将开始获取(抓取)HTML 文件,以便稍后进行解析。因此,这些 HTML 文件将被复制到 S3 进行存储(或者我应该将它们转储到我的本地计算机,因为这是我将在 MySQL 中进行解析和存储的方式?)。

请告知我的假设和我花几个小时阅读/谷歌搜索有关 AWS 服务所获得的一点知识是否有意义。

答案1

您的设置的基本前提似乎不错,但是您可能需要考虑一些因素。

首先,EC2 网络(和 I/O)带宽取决于实例类型。如果您希望使用 t1.micro 实例,请不要期望“超快互联网连接”——即使使用 m1.small,您也可能无法看到您想要的性能。此外,请记住,您需要为 EC2 上使用的带宽付费(而不仅仅是实例时间)。

关于您的第一点,在 EC2 实例上设置 Python 应该没有什么困难。但是,潜在的困难来自于协调您的实例。例如,如果您有 2 个正在运行的实例,您将如何在它们之间分配任务?每个实例如何“知道”另一个实例做了什么(假设您不会手动划分 URL 列表)。此外,如果您要启动一个实例,其中一个 EC2 实例将负责处理该实例还是您的本地计算机将处理它(如果它是其中一个 EC2 实例,您如何确定哪个实例将负责该任务(即防止每个实例都执行“启动”任务)以及如何重新分配任务以包含新实例?您如何确定要自动终止哪些实例?

毫无疑问,以上所有方法都是可行的(corosync/heartbeat、pacemaker、自动缩放等),但最初很容易被忽视。无论如何,如果您正在寻找“最佳价格”,您可能希望使用现货实例(而不是按需实例),但是,要使其发挥作用,您确实需要一个相当强大的架构。(值得注意的是,现货价格波动很大 - 有时超过按需价格;根据您工作的时间范围,您要么希望设置较低的最高现货价格,要么定期(每小时)确定最佳方法(现货/按需)以最大限度地降低成本。)虽然我目前无法确认,但最简单(和最便宜)的选项可能是 AWS 的自动缩放。您需要设置 Cloudwatch 警报(但 Cloudwatch 确实提供了 10 个免费警报),并且自动缩放本身没有与之相关的成本(除了新实例的成本和 Cloudwatch 成本)。

鉴于我真的不知道你的工作范围,我可能会问为什么不简单地使用 EC2 进行解析和处理。特别是如果解析很复杂,页面的获取速度比处理速度快,并且你有大量页面(可以推测,否则你不会费力设置 AWS),那么在 EC2 上简单地处理页面可能更有效率,当一切完成后,下载数据库的转储。可以说,这可能会简化一些事情 - 让一个实例运行 MySQL(数据存储在 EBS 卷上),每个实例查询 MySQL 实例以获取下一组记录(并可能将这些记录标记为保留),获取和处理,并将数据保存到 MySQL。

如果您不打算在 EC2 上运行 MySQL,则可以将 HTML 文件存储在 S3 上(如您所提到的),也可以将它们保存在 EBS 卷上。S3 的优点是您不需要预先分配存储(如果您不知道要处理的数据大小,则特别有用)- 您需要为 PUT/GET 和存储付费;缺点是速度 - S3 不打算用作文件系统,并且(即使您可以将其安装为文件系统)将每个单独的文件保存到 S3 会相当低效(因为您需要积累几页然后将它们上传到 S3)。此外,如果您有大量文件(数万个),则获取所有文件名等的处理可能会很慢。 EBS 卷旨在用作附加到实例的存储 - 优势在于速度 - 传输速率和它具有“文件系统”的事实(因此读取文件列表等很快) - EBS 卷在实例终止后仍然存在(EBS 根卷除外,默认情况下不是(但可以设置))。 EBS 卷的缺点是您必须预先分配一定数量的存储(无法动态修改) - 并且您需要为该存储量付费(无论是否全部使用);您还需要支付 I/O 操作费用(此外,EBS 卷的性能取决于网络速度 - 因此实例越大,EBS 性能越好)。 EBS 的另一个优点是,作为文件系统,您可以非常轻松地执行诸如对文件进行 gzip 之类的任务(我想如果您正在下载大量 html 页面,您将不想稍后获取 S3 的单个文件)。

我实际上并不打算推测这些可能性(请记住,在非常大的规模上,像 map-reduce/hadoop 之类的东西将用于管理这种任务),但只要您有一种分区任务的方法(例如 MySQL 实例)和管理实例的扩展(例如自动扩展),您的想法就应该可以正常工作。

答案2

您可以通过 SQS 与不同的实例进行交互。它是一种排队服务。您可以将输入 URL 排队到 SQS。每个实例将按顺序从 SQS 获取 URL。但 SQS 不会将相同的输入提供给多个实例。这就是这里的主要优势。

相关内容