对于一个小型个人项目,我每5分钟抓取一些数据并将其保存在SQL数据库中。到目前为止,我一直在结合使用小型EC2 AWS实例和100GB EBS存储。这对于抓取一直很好,但是由于EC2实例没有足够的内存,因此无法用于分析结果数据。
数据分析只是不定期地进行,因此花24/7拥有一个更大的EC2实例会很浪费,因此我正在寻找更灵活的方法。通过阅读,我了解到:
我认为这是AWS相当普遍的用例,因此我希望尝试朝正确的方向获取一些指针。有什么我可以忽略的选项适合我的问题吗? EFS是正确的方法吗?
谢谢!
答案 0 :(得分:1)
据我所知,S3和Athena是一个不错的选择。我不确定您是否担心不使用S3,但是一旦您可以将抓取的数据保存在S3中,就可以使用Athena(按查询付费)对其进行分析。
或者,您可以使用RedShift保存数据并分析与ec2按需定价模型类似的按需服务。
此外,您可以使用Kenisis Firehose,该工具可用于在提取数据时实时分析数据。
答案 1 :(得分:1)
您的搜寻工作人员应将数据存储在Amazon S3中。这样,可以扩展(甚至关闭)工作人员实例,而不必担心数据存储。将过程数据(例如,已刮取的内容,下一步要刮取的位置)保存在DynamoDB这样的数据库中。
当您需要查询保存到Amazon S3的数据时,如果存储为可读格式,则最好使用Amazon Athena (CSV,ORC等)。
但是,如果您需要读取非结构化数据,则您的应用程序可以通过下载和使用文件或将其作为流读取,直接直接访问文件S3 。对于这种类型的处理,您可以启动具有大量资源的大型EC2实例,然后在不使用它时将其关闭。更好的是,将其作为 Spot实例启动以节省资金。 (这意味着您的系统将需要处理可能在中途停止的情况。)
答案 2 :(得分:1)
以前的用户的回答很好。让我们按选项细分。在我看来,您的初始堆栈是您在EC2中安装的自定义SQL数据库。
将数据库移至RDS,这将为您带来很多好处,但是我们正在寻找的主要对象是只读副本,如果您的阅读量有所增长,则可以创建其他只读副本并将其放在负载均衡器之后。此设置是没有太多代码更改的最低要求。
使用EFS并非一帆风顺,没有EFS的错误。有些数据库将唯一的ID保存到文件系统,这意味着您无法共享硬盘驱动器。 EFS是一项服务,会给每个读/写操作带来一些延迟。根据您安装的数据库分发的方式,甚至可能无法实现。
让工作人员保存到S3而不是SQL也是可行的,但这意味着重写您的Web抓取工具。您可以多次在同一键上调用S3-> PutObject,它将覆盖先前的对象。然后,您将需要重写分析工具以查询S3。此选项非常好,并且在“运营成本”方面可能是最便宜的,但这意味着您必须熟悉S3,更重要的是,您需要熟悉Athena。您还需要弄清楚如何为应用程序保存新数据和最佳文件格式。您可以从常规JSON或CSV Blob开始,然后以较低的成本迁移到Apache Parquet。 (有关该声明如何意味着节省的更多信息,请参见此处:https://aws.amazon.com/athena/pricing/)
RedShift用于BigData,我要等到查询常规SQL出现问题(每次查询需要几秒钟),然后再开始研究它。当然,它可以让您以便宜的价格进行查询,但是您可能必须设置一个侦听SQL(或由SQL触发)的管道,然后更新RedShift。原因是RedShift会根据您的查询需求进行扩展,并且您可以轻松启动多台计算机以加快查询速度。