5

私はRDBMSの経験がかなり豊富なPython開発者です。かなり大量のデータ(約500GB)を処理する必要があります。データは、s3バケット内の約1200のcsvファイルに保存されています。私はPythonでスクリプトを作成し、サーバー上で実行できます。ただし、遅すぎます。現在の速度とデータ量に基づくと、すべてのファイルを処理するのに約50日かかります(もちろん、締め切りはそれよりかなり前です)。

注:処理は、基本的なETLタイプのものの一種であり、ひどいものではありません。PostgreSQLの一時スキーマに簡単にポンプで送り、スクリプトを実行することができます。しかし、繰り返しになりますが、私の最初のテストから、これは遅くなる方法です。

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

そのため、EC2インスタンスの束をスピンアップして、それらをバッチで(並行して)実行しようと考えていました。でも、こんなことをしたことがないので、アイデアなどを探していました。

繰り返しになりますが、私はPython開発者なので、Fabric+botoが有望であるように思われます。私は時々botoを使用しましたが、Fabricの使用経験はありません。

読書/調査から、これはおそらくHadoopにとって素晴らしい仕事だと思いますが、私はそれを知らず、それを採用する余裕がなく、タイムラインでは学習曲線や誰かを採用することができません。私もそうすべきではありません、それは一種の一度限りの取引です。したがって、本当にエレガントなソリューションを構築する必要はありません。私はそれが機能し、年末までにすべてのデータを取得できるようにする必要があります。

また、これは単純なスタックオーバーフローではないことを私は知っています-一種の質問(「Pythonでリストを逆にする方法」のようなもの)。しかし、私が望んでいるのは、誰かがこれを読んで、「たとえば、私は似たようなことをしてXYZを使用する...それは素晴らしいことです!」ということです。

私が求めているのは、このタスクを実行するために使用できることを誰かが知っていることだと思います(私がPython開発者であり、HadoopまたはJavaを知らない場合、 Hadoopのような新しいテクノロジーを学んだり、新しい言語を学んだりします)

読んでくれてありがとう。ご提案をお待ちしております。

4

5 に答える 5

3

いくつかのパフォーマンス測定を行いましたか:ボトルネックはどこにありますか?CPUバウンド、IOバウンド、DBバウンドですか?

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

IOバウンドの場合、より多くのHDが必要になります(そしてそれらにストライピングmdを配置します)。

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

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

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

于 2012-12-22T20:58:57.760 に答える
2

私は少し前にこのようなことをしました、そして私のセットアップは次のようでした

  • 生のソースファイル(xml / csv)を中間形式に変換する1つのマルチコアインスタンス(x-large以上)。コンバータースクリプトの(コア数)コピーを並行して実行できます。私のターゲットはmongoだったので、中間形式としてjsonを使用しました。あなたの場合はsqlになります。

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

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

于 2012-12-22T20:48:49.020 に答える
2

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

これをクレイジーなレベルにスケーリングすることができ、それは常に私にとって本当にうまくいきました。あなたの場合、結果をS3に保存するのか、PostgreSQLに直接アクセスするのかはわかりません。

于 2012-12-23T16:39:45.730 に答える
1

Amazon ElasticMapReduceの形でhadoopの恩恵を受けるかもしれません。深くなりすぎることなく、パラレル(マップステージ)の大量のデータボリュームにロジックを適用する方法と見なすことができます。
また、Hadoopストリーミングと呼ばれるHadoopテクノロジーもあります。これにより、任意の言語(Pythonなど)でスクリプト/実行可能ファイルを使用できるようになります。
便利なもう1つのHadoopテクノロジーはsqoopです。これは、HDFSとRDBMSの間でデータを移動します。

于 2012-12-23T09:18:58.053 に答える
1

また、AmazonのEC2でホストされる分散コンピューティングクラスターを作成および管理するためのユーティリティである ipythonEC2での並列コンピューティングを非常に簡単に使用できます。StarCluster
StarCluster

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 に答える