1

簡単に言えば、プロセスとの間でデータを読み書きする Java プロセスがあります。データを取得して処理し、Java がデータベースに書き込むことができるように Java に戻す必要がある C++ プログラムがあります。

Java プログラムは Hadoop からデータをプルするため、Hadoop プロセスが開始されるとデータが殺到しますが、実際の処理 (C++ プログラムによって行われる) ではすべてのデータを一度に処理することはできません。そのため、フローを制御する方法も必要です。また、問題を複雑にするために (ただし、私の作業は単純化します)、私は Java の作業を行い、友人は C++ の作業を行い、プログラムをできるだけ独立させようとしています。

それが問題です。Google プロトコル バッファを見つけました。プログラム間でデータを渡すのはかなりクールに思えますが、データを保存する Java プログラムがどのように C++ プログラムの処理をトリガーできるか、そして C++ プログラムが結果を保存するときに Java プログラムがどのようにトリガーされるかはわかりません。結果を保存します (これは 1 つまたはいくつかのレコード用ですが、数十億のレコードを処理する予定です)。

この問題への最善のアプローチは何ですか? これを行う簡単な方法はありますか?

4

2 に答える 2

3

最も簡単な方法は、TCP ソケット接続を使用することです。Java プログラムは完了したいときに送信し、C++ プログラムは結果を返します。

于 2012-10-15T17:39:45.767 に答える
1

このソリューションをスケーリングしたいので、ZMQ を使用することをお勧めします。

Java アプリに Hadoop からデータをプルさせます。

次に、PUSH ソケットを使用してデータをプッシュします。

ここでは、PULL ソケットとして接続を受け入れてこのデータを処理する、必要な数の C++ ワーカーを配置します。これは、必要なだけ多くの異なるプロセッサ/コア/などに拡張できます。

各ワーカーが終了すると、PUSH ソケットで結果をプッシュし、PULL ソケットで情報を受け取る「格納」Java プログラムに渡します。

この例のようになります(標準的な分割統治法)

このプロセスは、使用可能なワーカーがない場合に最初の Java プログラムがブロックされる (ただし、処理は続行される) ため、必要な数のワーカーに拡張できます。終了する Java プログラムが高速である限り、これが非常にうまくスケーリングされることがわかります。

zmq_pollデバイスを使用するだけで、発行プログラムと保存プログラムを同じプログラムに含めることができます:)

于 2012-10-15T18:26:07.347 に答える