私は分散マップドローイングプログラムを次のデザインを持つJava 8 map-reduceフレームワークを使ってJavaで書こうとしています:Javaのソケットを介して(パラレル)ストリームを送信
クライアント3つのマッパー(それぞれ異なるマシン/スタンドアロンJavaアプリケーション)にデータを送信します。マッパーは、データのリストからparallelStream()
を作成して、データを並行して処理します。
各マッパーは、parallelStreamで.map(...)
を呼び出す必要があります。次に、マッピングされたデータを別のノードReducerに送信するという考え方です。
リデューサーはStreamを取得し、.reduce(...)
を呼び出し、最後に.get()
を呼び出してクライアントに返されます。
私のプログラムは、同じプログラムで.map(...).reduce(...).get()
を呼び出すと機能しますが、私は別のレデューサーノードを持つことができます。
ソケットプログラミングで新しく、またJava 8を使用しているときに、 "java.io.NotSerializableException:java.util.stream.ReferencePipeline $ 3"をスローするため、ソケットを介してストリームを送信する際に問題があります。 WriteObject
でストリームを書き込もうとする瞬間です。
ここに進むにはどうすればよいですか?ストリームを別のものに変えて送信してから、Reducer
ノードでストリームを再びストリームにすることはできますか? ObjectOutputStream
よりもストリームを送信する方が良いでしょうか?
どのようなアイデアも非常に高く評価されています。どうもありがとうございました!
P .:ストリームはStream<Map<String, Integer>>
です。
ストリームを通常のコレクションまたは配列にダンプする必要があります。ストリーム自体は送信できません。それは計算であり、データではありません。 –
それを明確にしていただきありがとうございます。私がJava 8の仕組みを理解していれば、map()。 .reduce()は同じマシンで同時に動作するはずですか? 私がやったことは、マップを作成するためにreduceとも呼ばれているのですか?またマップを3つのマップを結合する「減速機」に送りました。これは良い練習ですか? –
あなたが 'Stream'を使って何をしているのかは、そのマシンにとってローカルであり、あなたがそのマシンで何をしたいのかを、あなたが他の場所に送る前に終了したはずです。 –