In der aktuellen Version 3.2 steht in Hazelcast nun auch die Möglichkeit zur Verfügung, eine Map&Reduce API zur Verarbeitung zu verwenden.
Die bisher häufig verwendete externe Erweiterung CastMapR ist hierdurch überflüssig und wurde durch eine Hadoop ähnlich API ersetzt, bietet aber im Gegensatz zu Hadoop ein in-memory realtime-processing. Map and Reduce Operationen werden hierbei auf allen Knoten konkurrierend ausgeführt.
Map&Reduce in Hazelcast adressiert Szenarien in welchen der EntryProcessor nicht optimal ist, wie in Data Transforming Szenarien. Da kein explizites Locking benötigt wird, eignet sich das System auch hervorragend für lang laufende Operationen.
Durch die Streaming-API ist die Verwendung intuitiv und einfach.
Als Datenquelle dient eine Implementierung des KeyValueSource Interfaces. Für die gängigen Anwendungsszenarien wie die Verarbeitung einer IMap oder IList stehen entsprechende Implementierungen zur Verfügung. Es können aber auch eigene Implementierungen erzeugt werden.
KeyValueSource source = KeyValueSource.fromMap( map );
Eine Streaming API ermöglicht eine einfache Komposition von Mappern und Reducern.
JobTracker jobTracker = hazelcastInstance.getJobTracker("default"); Job job = jobTracker.newJob( source ); job.mapper( new MyMapper() ).reducer( new MyReducerFactory() ).submit();
Die eigentlichen Mapper und Reducer Klassen müssen nur noch entsprechende Interfaces implementieren
public class MyMapper implements Mapper { @Override public void map(String key, String document, Context context) { // ... } }
public class MyReducerFactory implements ReducerFactory { @Override public Reducer newReducer( String key ) { return new MyReducer(); } private class MyReducer extends Reducer { @Override public void reduce( Long value ) {...} @Override public Long finalizeReduce() {...} } }


Hey kurzer aber schöner Artikel :) Ich freue mich, dass die API Anklang findet und gefällt :)