web-dev-qa-db-ja.com

コンピュータのネットワークに作業を分割するにはどうすればよいですか?

次のようなシナリオを想像してみてください。大量のデータを生成する中央コンピューターがあるとします。このデータは何らかの処理を経る必要がありますが、残念ながら生成より時間がかかります。処理がリアルタイムに追いつくように、より多くのスレーブコンピュータを接続します。

さらに、スレーブがジョブの途中でドロップアウトする可能性と、スレーブが追加される可能性を考慮する必要があります。中央コンピュータは、すべてのジョブが満足のいくように終了し、スレーブによってドロップされたジョブが別のジョブに再タスクされることを確認する必要があります。

主な質問は次のとおりです。これを実現するには、どのようなアプローチを使用すればよいですか。

しかし、おそらく次のことが答えに至るのに役立ちます。私がやろうとしていることに名前またはデザインパターンはありますか?

これらのコンピューターを相互に通信させるという目標を達成するには、どのような知識の領域が必要ですか? (例えば、私がある程度知っているデータベースで十分でしょうか、それとも私がまだ知っていないソケットを含みますか?)

そのようなシステムの例はありますか?主な質問は少し一般的ですので、開始点/参照点があるとよいでしょう。

注:私はc ++とウィンドウの制約を想定しているため、その方向を指すソリューションが評価されます。

11
Morpork

そのようなシステムの例はありますか?

はい。このパターンは、分散コンピューティング(または分散プログラミング、または分散後に配置したいクールなWord)として知られています。私の提案は、他のソリューションを検討する前に社内でこれを構築しないことです。さまざまなオプションについては、この スタックオーバーフローの質問 を参照してください。そして、計算された決定を行います。

12
Manoj R

他の回答で指摘されているように、このフィールドは 分散コンピューティンググリッドコンピューティング 、クラスターコンピューティング、および ハイパフォーマンスコンピューティング として知られています。

開始後にシステムのサイズを変更してワークロードに合わせることができる場合、それは " elastic "と呼ばれ、これは従来のグリッドコンピューティングとは異なります。これは、「 クラウドコンピューティング 」という用語の(マーケティングではない)理由の1つです。ユーザーは容量を計画する必要がなく、計算を実行するマシンの数と場所は機能しません。雲として彼に。

また、マスターが失敗したタスクを再スケジュールするという要件は、そのシステムの「 フォールトトレランス 」プロパティと呼ばれます。 ( この漫画 への必須リンク)

独自のプライベートクラウドを構築するには、どのアプローチを使用する必要がありますか?私の注文または好み:

  1. 独自のクラウドを構築しないでください。他の人が提供するインフラストラクチャを使用してください。 Amazonはこれを Virtual Private Cloud 、Rackspaceと呼んでいます Private Cloud ;他のオファーを見つけて比較できると思います。

  2. 独自の分散コンピューティングエンジンを構築しないでください。他の人が提供するエンジンを使用してください。マシンの使用を主張する場合は、少なくとも他の人が提供およびテストしたソフトウェアをできるだけ多く使用してください。 パイプインターフェース を介してC++から、または ストリーミングAPI を介して任意の実行可能ファイルからHadoopを使用できます。 Sparkの同様のストリーミングインターフェイス があります。

  3. すべてのコンポーネントを最初からコーディングしないでください。コミュニティのコンポーネントを使用します。何らかの理由で、これまでに読んだことがあり、独自のクラウドコンポーネントをロールアウトしたい場合は、C++の標準ライブラリから始めないでください。必要な主なコンポーネントは次のとおりです。

    • キューイングシステム コメントに記載 。マスターから処理ノードにタスクを送信し、処理ノードからマスターに結果確認を送信します。
    • 分散ファイルシステム。処理ノードはデータにアクセスして操作できます。

    どちらにも多くの選択肢があります。キューイングの場合、 RabbitMQ には ZeroMQ と同様にWindowsインストーラーがあります。分散ファイルシステムの場合、Windowsでは十分な経験がありません: 整理できるようですSMB共有をDFSに) が、ヒントを与えることはできません別の回答で述べたように、MongoDBなどの分散データベースをデータに使用することを考えることができます Windowsで実行されます

MPI(通常は OpenMPI実装 、通常は Boost wrapper を通じて)を使用することも考えられます)MPIプログラム自体はエラスティックでもフォールトトレラントでもありません。少なくとも、自分で対処する必要があります(少なくとも これを実現するためのメカニズムを提供します )。そのため、最初に、そのような特性を持つ配布用のフレームワークを評価します。

4
logc