2 - MapReduce: Implementierungstipps [ID:27112]
50 von 180 angezeigt

Hallo zusammen. In dieser Aufgabe solltet ihr ein Reproduce-Framework in Anlehnung einer

Patchier-DOOP implementieren. Einige Konzepte und Java-Eigenheiten, die euch dabei helfen

werden, stelle ich euch in diesem Video vor.

Damit euer Framework dem Anwendungsentwickler eine möglichst hohe Flexibilität bieten kann,

schauen wir uns zuerst das Konzept von Abstract Factories an. Danach gibt es einige Hinweise

zum Sortieren von Listen in Java und dem Zusammenführen von vorsortierten Listen. Future-Objekte

lassen sich zur Synchronisation der verschiedenen Reproduce-Phasen verwenden und zum Schluss

gibt es noch ein paar Infos zum Extrahieren von Daten aus Textdateien.

Ein Framework, wie das von euch zu implementierende Reproduce-Framework, stellt den Rahmen für

eine Anwendung bereit. Das Framework gibt dabei den grundsätzlichen Ablauf vor, lässt

aber gewisse Details zur freien Gestaltung offen. Damit kann man dann eine Vielzahl der

Anwendungen realisieren. Auch wenn das Framework üblicherweise Standardimplementierung für

viele seiner Schritte anbietet, liegt die Stärke in der Konfigurierbarkeit. Da muss

ein Framework eine hohe Flexibilität für den Anwendungsentwickler anbieten.

Im Falle von eurem Reproduce-Framework sollen folgende Schritte dabei konfigurierbar gestaltet

werden. Die Deserialisierung der Daten, also das Auslesen der Schlüsselwertpaare aus der

Datei, die Map- und Reduce-Funktion und das Sortierkriterium, mit welchem im Zwischenschritt

die Daten für die Reducer sortiert werden. Auch wenn ihr diese Schritte vom Entwickler

frei anpassbar gestalten wollt, muss euer Framework aber trotzdem Objekte der jeweiligen

Klasse für den Ablauf des MapReduceJob instanzieren. Da ihr bei der Implementierung des Frameworks

aber die Klassen, die der Anwendungsentwickler irgendwann später mal schreiben wird, noch

gar nicht kennen könnt, greift man hier auf das Konzept einer AbstractFactory zurück.

Eine Factory ist dabei der erste Schritt zur Lösung des Problems. Ihr müsst ein Objekt

instanzieren, das zwar eine bestimmte Schnittstelle zur Verfügung stellt, dessen genauen Typ

ihr aber noch nicht kennt. Eine Factory funktioniert dabei auf die Weise, dass sie die Instanzierung

eines Objekts in eine eigene Klasse kapselt. Hier ein Beispiel dazu. Es gibt die Klasse

WordCountMapper, die die Mapperschnittstelle implementiert. Wir möchten eine Instanz von

WordCountMapper erzeugen. Die WordCountFactory kapselt diese Erzeugung jetzt in eine eigene

Methode CreateMapper, die einen WordCountMapper erzeugt und diesen als Typ Mapper zurückgibt.

Das Framework, das die Methode CreateMapper aufruft, muss in diesem Moment also noch nichts

vom Datentyp WordCountMapper wissen. Er bekommt erst mal ein beliebiges Mapperobjekt zurück

und arbeitet damit. Dem Framework muss hier aber immer noch die Klasse WordCountFactory

bekannt sein, die ja doch wieder direkt mit der Anwendung zusammenhängt. Wir haben das

Problem mit einer reinen Factory also nur etwas verschoben, aber noch nicht gelöst.

Dafür brauchen wir eine weitere Abstraktionsschicht und verwenden eine sogenannte AbstractFactory.

Hier erzeugen wir eine weitere Schnittstelle für die Factory selbst. Für unser Beispiel

gibt es neben der gerade schon verwendeten Schnittstelle Mapper also noch die Schnittstelle

MapperFactory, die die Methode CreateMapper anbietet. An der Implementierung unserer WordCountKlassen

ändert sich dabei kaum etwas. Nur unsere WordCountFactory muss jetzt das neue Interface

MapperFactory implementieren. Unser Framework kann jetzt die Schnittstelle MapperFactory

verwenden, um sich eine Instanz eines Mappers zu erzeugen und muss dabei weder von der Factory

noch vom Mapper wissen, welchen tatsächlichen Typ er dann später eigentlich in der Hand

hat. Die echte Instanz unserer Factory-Klasse braucht das Framework ja erst bei der eigentlichen

Ausführung. Dort kann sie dann beispielsweise im Framework-Konstruktor oder über eine Methode

übergeben werden. In der Aufgabe stellt die Klasse mwdrop diese Factory zur Konfiguration

dar.

Als nächstes schauen wir uns das Sortieren von Elementen in Java an. Die Standardschnittstelle

zum Vergleichen von Objekten ist Comparable, die die Methode compareTo implementiert. Die

meisten Standardklassen von Java haben dieses Interface bereits mit sinnvollen Sortierregeln

implementiert. Wie im Grundlagenvideo von Java erwähnt, stellt euch die Klasse Collections

Teil eines Kapitels:
MapReduce

Zugänglich über

Offener Zugang

Dauer

00:13:38 Min

Aufnahmedatum

2020-12-22

Hochgeladen am

2020-12-22 13:19:53

Sprache

de-DE

Konzepte und Tipps zur Implementierung von MapReduce in Java

Einbetten
Wordpress FAU Plugin
iFrame
Teilen