2012-12-22 6 views
5

私はかなり良いRDBMS経験を持つPython開発者です。かなり大量のデータ(約500GB)を処理する必要があります。データはs3バケットで約1200のcsvファイルに格納されています。私はPythonでスクリプトを書いており、それをサーバー上で実行できます。しかし、それはあまりにも遅いです。現在の速度とデータ量に基づいて、すべてのファイルを処理するのに約50日かかります(そして、その前に締め切りは間違いありません)。大量のデータを並列に処理する

注:処理は基本的なETLタイプのものです。何も恐ろしいものではありません。私はPostgreSQLの一時スキーマに簡単にポンピングしてスクリプトを実行することができます。しかし、再び、私の最初のテストから、これは遅くする方法だろう。

注:新しいPostgreSQL 9.1データベースが最終的な宛先になります。

私はバッチで(並行して)それらを試して実行するために、たくさんのEC2インスタンスをスピンアップしようと考えていました。しかし、これまで私はこのようなことをしていませんでしたので、アイデアなどを探していました。

また、私はPython開発者ですから、Fabric + botoが有望かもしれません。私は時々ボトーを使いましたが、ファブリックの経験は一度もありません。

これはおそらくHadoopにとっては素晴らしい仕事ですが、私はそれを知らず、それを雇う余裕もなく、タイムラインは学習曲線や雇用を考慮していません誰か。私はまた、一度の取引のようなものではないはずです。だから、私は本当に洗練されたソリューションを作る必要はありません。私はそれが働き、年末までにすべてのデータを得ることができるだけです。

また、私はこれが単純なスタックオーバーフローのような質問ではないことを知っています(「どのようにリストを逆にすることができますか?」)。しかし、私が望んでいることは、誰かがこれを読んで、「同じようなことをして、XYZを使って...いいですよ!

私はこのタスクを達成するために使うことができることを誰もが知っていると思います(私はPython開発者であり、HadoopまたはJavaを知らず、 Hadoopのような新技術の学習や新しい言語の学習を妨げるタイトなタイムライン)

ありがとうございます。私はどんな提案も楽しみにしています。

+0

生地+のboto

http://ipython.org/ipython-doc/stable/parallel/parallel_demos.html
確かに、この作業のために良い組み合わせのように見えます。マルチインスタンス化モジュールから 'Pool'を使用することで、各インスタンスでタスクを並列化することは価値があります(1200インスタンス、ファイルごとに1インスタンスが必要な場合を除き)。また、ファイルを解析して結果を編集する方法は、おそらく合計時間に大きな影響を与えます。 'numpy'を調べましたか? – goncalopp

+1

だから誰も考えられる提案を繰り返そうとしません - あなたの既存のスクリプトでやったことが遅すぎるということを記述できますか?そのため、私たちはそのルートを辿ることはできないと知っています:) –

+0

@JonClements - Bascially、私は2つのアプローチを試みました。私は、一時的なスキーマにデータを入れて(必要に応じて)インデックスを作成し、それに対してクエリを実行してデータを「マッサージ」し、要求されたフォーマットにすることを試みました。インデックスがPostgreSQLのキャッシュよりもはるかに大きかったと思うので、遅すぎました。注:私はHeroku上で動作する小さなPostgreSQLインスタンスを持っています。 (次のコメントに続きます) –

答えて

2

この種のバッチ作業には、しばしばSQS/S3/EC2の組み合わせを使用します。実行する必要のあるすべての作業について、SQSのメッセージをキューに入れます(適度に小さなチャンクにチャンクされます)。 SQSからのメッセージの読み取りを開始し、作業を実行して結果をS3に入れ、次にSQSからメッセージを削除するように構成されたN EC2インスタンスをスピンアップします。

これを狂気のレベルにスケールすることができ、いつも本当にうまく機能しています。あなたのケースでは、結果をS3に保存するのか、PostgreSQLに行くのかは分かりません。あなたはまた、StarCluster
StarClusterでEC2上で非常に簡単にipythonの並列コンピューティングを使用することができます

+0

ちょうど好奇心から、あなたはどのようにあなたのスクリプトをEC2インスタンスに手に入れますか?彼らはgit repoから引っ張ってもらえますか?または、スクリプトを上書きするだけですか? –

+0

私は多くのテクニックを使いました。ファイルをscpするためにParamikoベースのスクリプトを書くことができます。あなたはcloud-initを使用して、S3からスクリプトを引き出すことができます。 Fabricを使用することができます。 CloudFormationテンプレートを使用できます。多くの選択肢があります。 – garnaat

+0

返事をありがとう。うん。オプションのように思える。私が最初の質問で述べたように、私はFabricの使用に傾いていますが、あなたがここで何をしたのか不思議でした。 –

2

私はいくつかの時間前にこのような何かをした、と私のセットアップは、中間フォーマットに生のソースファイルを変換し

  • 1つのマルチコアインスタンス(X-大以上)、(XML/CSV)のようでした。コンバータスクリプトの(num-of-cores)コピーを並列に実行することができます。私のターゲットはmongoだったので、私は中間形式としてjsonを使いました。あなたの場合はSQLになります。

  • このインスタンスには、N個のボリュームが接続されています。ボリュームがいっぱいになると、ボリュームが分離され、2番目のインスタンスに(botoを介して)接続されます。

  • 2番目のインスタンスは、準備された(sql)データをdbにインポートするDBMSサーバーとスクリプトを実行します。私はポストグルについて何も知らないが、それはmysqlまたはmongoimportのようなツールを持っていると思う。もしそうなら、それを使ってPythonスクリプトを使ってクエリを作成する代わりに一括挿入を行います。

3

ボトルネックはどこですか? CPUバインド、IOバウンド、DBバウンドですか?

CPUにバインドされている場合、pypyのようなPython JITを試すことができます。

IOバインドされている場合、より多くのHDが必要です(それらにいくつかのストライピングmdを入れます)。

DBにバインドされている場合は、最初にすべてのインデックスとキーを削除できます。

先週、Openstreetmap DBを自分のサーバー上のpostgresインスタンスにインポートしました。入力データは約450Gでした。前処理(ここでJAVAで行った)は、postgresの 'copy'コマンドでインポートできる生データファイルを作成しました。インポート後、キーとインデックスが生成されました。

すべての生データをインポートするのに約1日かかりました。その後、キーとインデックスを構築するのに数日かかりました。

1

hadoopのメリットは、Amazon Elastic Map Reduceの形になります。あまりにも深くなることなく、パラレルで大量のデータボリュームにロジックを適用する方法(マップ段階)として見ることができます。
hadoop streamingと呼ばれるhadoop技術もあります。これは、任意の言語(Pythonなど)でスクリプト/実行可能ファイルを使用できるようにします。
有用なもう一つのハーフトップ技術は、HDFSとRDBMSの間でデータを移動するsqoopです。

+0

答えをありがとう。私の中でDEEEEEPを実行すると、HadoopとElastic MapReduceがここで使用するのが正しいことがわかります。しかし、私は達成しようとしているものとどのようにうまくいくかを頭の中で包み込むことはできません。私の問題の一部は、私が今までに見た事例のほとんどすべてが同じ愚かな単語カウント問題だということです。 Mineは実際にETL(抽出、変換、ロード)問題のほうが多いです。私はマップ関数がほとんどの変換を扱うことを容​​易に想像することができます。しかし、変換は顧客に依存します。したがって、単純な計算ではありません(例:(x * y)/ 2)。 –

関連する問題