import com.google.common.base.Stopwatch; import com.hazelcast.config.Config; import com.hazelcast.core.*; import com.hazelcast.mapreduce.Job; import com.hazelcast.mapreduce.JobTracker; import com.hazelcast.mapreduce.KeyValueSource; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.concurrent.TimeUnit; public class HazelcastMapReducerJob { private final static int NUMBER_OF_FILES = 10; public static void main(String[] args) throws Exception { Config cfg = new Config(); cfg.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(false); cfg.getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(true); cfg.getNetworkConfig().getJoin().getTcpIpConfig().addMember("127.0.0.1"); //cfg.getManagementCenterConfig().setEnabled(true).setUrl("http://localhost:8080"); HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg); try { fillMapWithData(instance); Stopwatch timer = Stopwatch.createStarted(); double average = mapReduceAverage(instance); timer.stop(); System.out.println("All content averages up to " + average); System.out.println("Time elapsed " + timer.elapsed(TimeUnit.MILLISECONDS)); } finally { Hazelcast.shutdownAll(); } } private static double mapReduceAverage(HazelcastInstance hazelcastInstance) throws Exception { JobTracker jobTracker = hazelcastInstance.getJobTracker("default"); IMap<String, String> map = hazelcastInstance.getMap("numbers"); KeyValueSource<String, String> source = KeyValueSource.fromMap(map); Job<String, String> job = jobTracker.newJob(source); ICompletableFuture<Double> future = job .mapper(new TokenizerMapper()) .combiner(new NumberCountCombinerFactory()) .reducer(new NumberCountAndOpReducerFactory()) .submit(new AverageCollator()); future.andThen(finishInfoCallback()); return future.get(); } private static ExecutionCallback<Double> finishInfoCallback() { return new ExecutionCallback<Double>() { @Override public void onResponse(Double finished) { System.out.println("Calculation finished!"); } @Override public void onFailure(Throwable throwable) { throwable.printStackTrace(); } }; } private static void fillMapWithData(HazelcastInstance instance) throws IOException { IMap<String, String> map = instance.getMap("numbers"); for (int fileNumber = 1; fileNumber <= NUMBER_OF_FILES; fileNumber++) { String numbersString = new String(Files.readAllBytes(Paths.get("../FileWithNumbersGenerator/random_numbers_" + fileNumber + ".txt"))); map.put(String.valueOf(fileNumber), numbersString); } } }