5

我是一名 Python 开发人员,具有很好的 RDBMS 经验。我需要处理相当大量的数据(大约 500GB)。数据位于 s3 存储桶中的大约 1200 个 csv 文件中。我用 Python 编写了一个脚本,可以在服务器上运行它。但是,速度太慢了。根据目前的速度和数据量,通过所有文件大约需要 50 天(当然,截止日期在此之前是很好的)。

注意:处理是您的基本 ETL 类型的东西 - 没什么可怕的幻想。我可以轻松地将其泵入 PostgreSQL 中的临时模式,然后在其上运行脚本。但是,再一次,从我最初的测试来看,这会变慢。

注意:一个全新的 PostgreSQL 9.1 数据库将是它的最终目的地。

因此,我正在考虑尝试启动一堆 EC2 实例以尝试分批(并行)运行它们。但是,我以前从未做过这样的事情,所以我一直在四处寻找想法等。

同样,我是一名 python 开发人员,所以 Fabric + boto 似乎很有希望。我不时使用boto,但从未使用过Fabric。

我从阅读/研究中知道,这对于 Hadoop 来说可能是一项很棒的工作,但我不知道,也负担不起雇用它完成的费用,而且时间线不允许学习曲线或雇用某人。我也不应该,这是一种一次性的交易。所以,我不需要构建一个非常优雅的解决方案。我只需要让它工作并能够在今年年底之前获得所有数据。

另外,我知道这不是一个简单的 stackoverflow 问题(类似于“如何在 python 中反转列表”)。但是,我希望有人读到这篇文章并“说,我做了类似的事情并使用 XYZ ......这太棒了!”

我想我要问的是有没有人知道我可以用来完成这项任务的任何东西(鉴于我是一名 Python 开发人员,我不知道 Hadoop 或 Java - 并且有一个紧迫的时间表可以防止我正在学习 Hadoop 等新技术或学习一门新语言)

谢谢阅读。我期待任何建议。

4

5 回答 5

3

您是否进行了一些性能测量:瓶颈在哪里?是 CPU 限制、IO 限制还是 DB 限制?

当它受 CPU 限制时,您可以尝试使用 pypy 之类的 python JIT。

当它是 IO 绑定时,您需要更多的 HD(并在它们上放置一些条带化 md)。

当它是数据库绑定时,您可以尝试先删除所有索引和键。

上周我将 Openstreetmap 数据库导入到我服务器上的 postgres 实例中。输入数据约为450G。预处理(在这里用 JAVA 完成)刚刚创建了可以使用 postgres 'copy' 命令导入的原始数据文件。导入后生成密钥和索引。

导入所有原始数据大约需要一天时间 - 然后需要几天时间来构建键和索引。

于 2012-12-22T20:58:57.760 回答
2

我前段时间做过这样的事情,我的设置就像

  • 一个多核实例(x-large 或更多),将原始源文件 (xml/csv) 转换为中间格式。您可以在其上并行运行转换器脚本的 (num-of-cores) 副本。由于我的目标是 mongo,所以我使用 json 作为中间格式,在您的情况下它将是 sql。

  • 此实例附加了 N 个卷。一旦卷变满,它就会分离并附加到第二个实例(通过 boto)。

  • 第二个实例运行一个 DBMS 服务器和一个将准备好的(sql)数据导入数据库的脚本。我对 postgres 一无所知,但我猜它确实有一个类似mysqlor的工具mongoimport。如果是,请使用它进行批量插入,而不是通过 python 脚本进行查询。

于 2012-12-22T20:48:49.020 回答
2

我经常将 SQS/S3/EC2 组合用于这种类型的批处理工作。在 SQS 中为所有需要执行的工作排队消息(分成一些相当小的块)。启动 N 个 EC2 实例,这些实例配置为开始从 SQS 读取消息、执行工作并将结果放入 S3,然后才从 SQS 中删除消息。

你可以把它扩大到疯狂的水平,它对我来说一直很有效。就您而言,我不知道您是将结果存储在 S3 中还是直接转到 PostgreSQL。

于 2012-12-23T16:39:45.730 回答
1

您可能会从 Amazon Elastic Map Reduce 形式的 hadoop 中受益。无需太深入,它可以被视为一种在并行(Map 阶段)中将一些逻辑应用于海量数据的方法。
还有一种称为 hadoop 流的 hadoop 技术——它可以使用任何语言(如 python)的脚本/可执行文件。
您会发现另一个有用的 hadoop 技术是 sqoop - 它在 HDFS 和 RDBMS 之间移动数据。

于 2012-12-23T09:18:58.053 回答
1

您还可以ipython在 EC2 上非常轻松地使用并行计算,StarCluster
StarCluster它是一个用于创建和管理托管在 Amazon 的 EC2 上的分布式计算集群的实用程序。

http://ipython.org/ipython-doc/stable/parallel/parallel_demos.html
http://star.mit.edu/cluster/docs/0.93.3/index.html
http://star.mit.edu/ cluster/docs/0.93.3/plugins/ipython.html

于 2012-12-23T17:37:30.587 回答