1

Startcluster / qsub / grid engineを使用して並列ジョブを実行するのは初めてで、同じことに関する他のいくつかの投稿を読んでみました。特定の要件に合わせてスケーラブルなソリューションを構築する方法がまだわかりません。同じことを進める前に、もう少し提案を取り入れたいと思います。

これが私の要件です:

  1. 私は巨大なtarファイルを持っています[〜40-50 GB、最大100GBになる可能性があります]----->ここでできることはあまりありません。私はその巨大な単一のtarファイルを入力として受け入れました。

  2. tarを解凍して解凍する必要があります----->tarxvftarfilename.tar|を実行します。pbzip -dを並列にして、同じものを解凍して解凍します。

  3. この解凍の出力は、たとえば数十万ファイル、約50万ファイルです。

  4. この非圧縮ファイルは処理する必要があります。すべてのファイルを取り込んで処理し、5つの異なるファイルを出力できるモジュラーコードがあります。

Tarファイル-----並列非圧縮--->非圧縮ファイル-----並列処理--->処理されたファイルごとに5つの出力ファイル

  1. 私は現在、16コアで実行される並列Pythonスクリプトを持っています。16GBのメモリは、この非圧縮ファイルのリストを取り込んで、同じものを並列処理します。

  2. 問題は、どのようにシームレスにスケーリングするかです。たとえば、コードが10時間実行されていると言っていて、それに8コアマシンをもう1つ追加したい場合、プロセッサの数を事前に知っている必要があるため、並列Pythonでそれを行うことはできません。

  3. 同時に、現在のクラスターに動的にノードを追加する場合、データのアクセス可能性と読み取り/書き込み操作はどうですか?

それで、私は星団とqsubを読んで基本的な実験をしました。qsubを介して複数のジョブを送信できることはわかりますが、非圧縮の入力フォルダーから入力ファイルを取得するにはどうすればよいですか?

たとえば、forループでファイル名を1つずつ選択してqsubコマンドに送信するscript.shを作成できますか?別の効率的な解決策はありますか?

たとえば、それぞれ16個のCPUを搭載した3台のマシンがあり、48個のジョブをキューに送信した場合、qsubはクラスターの異なるCPUでそれらを自動的に起動するか、-nporteコマンドなどの並列環境パラメーターを使用して番号を設定する必要があります。それぞれのクラスター内のCPUの数。PythonスクリプトをMPIで実行可能にする必要がありますか?

要約すると、入力として数十万のファイルがあり、それらをマルチコアマシンのジョブキューに送信したいと思います。マシンを動的に追加すると、ジョブは自動的に分散されます。

もう1つの大きな課題は、500,000の奇数操作のすべての出力を最後に集約する必要があるということです。出力が書き出されるときに、並列ジョブの出力を集約する方法についての提案はありますか?

私はいくつかのシナリオをテスト実行していますが、同様のシナリオで実験した人がいるかどうか知りたいです。

Hadoopプラグインを使用した提案はありますか?http://star.mit.edu/cluster/docs/0.93.3/plugins/hadoop.html

事前にKarthickに感謝します

4

2 に答える 2

0

動的スケーリングに使用できるさまざまなオプションについてしばらく調査した後、Queue メカニズムを使用して複数のワーカーにジョブを分散することにしました。

Job_Manager - 入力を読み取り、ジョブを構築し、ジョブをキューに追加します SQS キューはキュー サービスです ワーカー プロセス - キューをリッスンし、出力を処理します。

入力/出力ドライブは NFS であり、すべてのサーバー/クライアントで使用できます。

動的にスケーリングするには、/exports に NFS クライアント情報を追加し、サーバーを再起動します。アクティブなクライアントには、それぞれの fstab に rw,hard,intr 構成があります。新しいクライアントで n 個のワーカー プロセスを起動することにより、より多くのワーカーがプロセスに追加されます。

これまでのところ、信頼性が高く、スケーリングも良好です。3 台のマシンで 90 近いワーカーを起動し、5 時間以内に 200,000 個のファイルを処理することができました。以前は、データを分散して複数のノードにワーカーを実行できなかったため、同じように 24 時間近くかかっていました。

于 2013-03-23T04:49:18.430 に答える
0
  1. I/O とデータ共有。I/O が少ない場合は、データをマスター ノードに残しておき、nfs を使用してノード間で共有することができます。I/O が多い場合は、S3 バケットを使用することをお勧めします。

  2. 配布: 複数の qsub を起動する bash スクリプトは正しいことです。単一のファイルで呼び出すか、一度にいくつかのファイルで呼び出すかはあなた次第です。

  3. スケーリング: クラスターで実行されている並列ジョブを異なるタスクとして表示します。各ノードでアプリケーションの 1 つ以上のインスタンスを実行するかどうかは、ユーザー次第です。例: cr1.8xlarge ノードを使用する場合、32 個のコアがあります。そこで、32 コアを使用してアプリの 1 つのインスタンスを起動するか、8 コアを使用してアプリの 4 つのインスタンスを起動できます。Open Grid Engine 内の各ノードの「スロット」構成を参照してください。(複数のノードのコアを組み合わせてアプリの 1 つの大きなインスタンスを実行したい場合は、私はそれを実行したことがないので、それについてはお手伝いできません。) 次に、ノードを追加するには、「addnode」を使用できます。 StarCluster からのコマンド。ノードが起動すると、OGS はそこにもジョブを自動的に分散します。また、StarCluster ロードバランサーを使用してノードを自動的に追加/削除することもできます。

だから、ここに私の提案があります。1. ファイルを S3 に抽出します。2. StarCluster を起動します 3. bashscript を使用して、いくつかのファイルごとにジョブを qsub します (1 つのファイルごとにジョブを実行するよりも、ジョブが 10 個のファイルを処理する方が効率的かもしれません) 4. アプリケーションは s3 に I/O する必要があります. 5. キューが空になったら、スクリプトで結果を調べて、すべてのジョブが正常に実行されたことを確認します。出力が欠落している場合は、ジョブを再スケジュールできます。

  • 集計方法がわからないのでわかりません。
  • 私はhadoopを使ったことがないので、そこも手伝うことはできません。
  • Python スクリプトを MPI 実行可能にする必要はありません。
  • 異種クラスターを使用する場合、最初から各ノードで使用できるコアの数がわかっています。
  • 32 個のコアを持つノードを 4 個のスロットを持つように定義する場合、ジョブはそれぞれ最大 8 個のコアを使用する必要があります。
于 2013-03-12T15:35:58.017 に答える