...
1) Each process computes the value of Pi locally, and 2) sends it to master task using send() function. Then, 3) the master task can recieve the messages using sync() function. Finally, we can calculate the average value of sum of PI values from each peers as below:
Code Block | ||
---|---|---|
| ||
@Override public void bsp( BSPPeer<NullWritable, NullWritable, Text, DoubleWritable> peer) throws IOException, SyncException, InterruptedException { int in = 0, out = 0; for (int i = 0; i < iterations; i++) { double x = 2.0 * Math.random() - 1.0, y = 2.0 * Math.random() - 1.0; if ((Math.sqrt(x * x + y * y) < 1.0)) { in++; } else { out++; } } double data = 4.0 * (double) in / (double) iterations; DoubleMessage estimate = new DoubleMessage(peer.getPeerName(), data); peer.send(masterTask, estimate); peer.sync(); } @Override public void setup( BSPPeer<NullWritable, NullWritable, Text, DoubleWritable> peer) throws IOException { // Choose one as a master this.masterTask = peer.getPeerName(peer.getNumPeers() / 2); } public void cleanup( BSPPeer<NullWritable, NullWritable, Text, DoubleWritable> peer) throws IOException { if (peer.getPeerName().equals(masterTask)) { double pi = 0.0; int numPeers = peer.getNumCurrentMessages(); DoubleMessage received; while ((received = (DoubleMessage) peer.getCurrentMessage()) != null) { pi += received.getData(); } pi = pi / numPeers; peer .write(new Text("Estimated value of PI is"), new DoubleWritable(pi)); } } } |