并行处理大量数据

时间:2012-12-22 20:30:33

标签: python fabric boto data-processing

我是一名具有良好RDBMS经验的python开发人员。我需要处理相当大量的数据(大约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等新技术或学习新语言的时间表

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

5 个答案:

答案 0 :(得分:3)

您是否进行了一些性能测量:瓶颈在哪里?是CPU绑定,IO绑定,数据库绑定?

当它受CPU限制时,你可以尝试像pypy一样的python JIT。

当它受IO限制时,你需要更多的HD(并在它们上加上一些条带化的md)。

当它受DB绑定时,您可以尝试首先删除所有索引和键。

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

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:2)

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

你可以将它扩展到疯狂的水平,它一直很适合我。在您的情况下,我不知道您是将结果存储在S3中还是直接进入PostgreSQL。

答案 3 :(得分:1)

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

答案 4 :(得分: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