02.11.2013 Aufrufe

Verteilte Auswertung von RDF-Graphen mit MapReduce und ...

Verteilte Auswertung von RDF-Graphen mit MapReduce und ...

Verteilte Auswertung von RDF-Graphen mit MapReduce und ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

4.2 Auswerten der Anfragen<br />

jeweils einen eigenen Mapper zuzuweisen. Dies funktioniert problemlos, wenn die Daten<br />

vom HDFS <strong>und</strong> Cassandra geladen werden sollen, was ab dem zweiten Join der<br />

Fall ist. Der erste Join, bei dem aus zwei Spaltenfamilien die Daten geladen werden,<br />

bereitet jedoch Probleme. Die Ursache befindet sich hauptsächlich in den Klassen<br />

ColumnFamilyInputformat <strong>und</strong> JoinConfigHelper. Diese Klassen sind so ausgelegt,<br />

dass nur eine Spaltenfamilie <strong>und</strong> SlicePredicate pro Job ausgewählt werden kann. Es<br />

wurde versucht die Klassen um diese Funktionalität zu erweitern. Dies gelang auch<br />

für kleinere Inputdateien. Ab einer bestimmten Größe der Input-Dateien schlugen<br />

die Jobs <strong>mit</strong> einer OutOfMemory-Ausnahme fehl. Eine Implementierung gestaltete<br />

sich so<strong>mit</strong> schwierig <strong>und</strong> konnte aus Zeitgründen nicht fertiggestellt werden, da<br />

tiefgreifendere Änderungen am bereitgestellten Quellcode nötig gewesen wären.<br />

Ein Map-Side-Merge-Join hat viele Gemeinsamkeiten <strong>mit</strong> dem implementierten Map-<br />

Side-Join. Bei einem solchen Verb<strong>und</strong> wird ebenfalls auf die Reduce-Phase verzichtet.<br />

Allerdings wird versucht durch gezieltes Partitionieren <strong>und</strong> Sortieren der Daten<br />

den Verb<strong>und</strong> schon beim Laden der Daten in den Mapper zu sortieren. Es gibt<br />

verschiedene Vorraussetzungen für einen Map-Side-Merge-Join [15]:<br />

1. Beide Datensätze müssen identisch partitioniert <strong>und</strong> sortiert sein. Ist dies der<br />

Fall muss der Verb<strong>und</strong> der ersten Partition des ersten Datensatzes <strong>mit</strong> der<br />

ersten Partition des zweiten Datensatzes berechnet werden. Anschließend wird<br />

der Verb<strong>und</strong> der weiteren Partitionen berechnet bis schließlich der gesamte<br />

Verb<strong>und</strong> berechnet worden ist.<br />

2. Der Typ der Input- <strong>und</strong> Output-Schlüssel muss identisch sein, da sonst die<br />

Daten nicht identisch partitioniert würden.<br />

Das Hadoop-Framework stellt zu diesem Zweck die Klasse CompositeInputformat<br />

bereit. Zunächst trat das gleiche Problem wie beim Reduce-Side-Join auf, da die<br />

Daten aus mehreren Spaltenfamilien geladen werden müssen. Ein weiteres Problem<br />

betraf die Ordnung <strong>und</strong> Partitionierung. Datensätze werden in Cassandra prinzipiell<br />

so geordnet, wie sie geschrieben werden. In der Regel erfolgt also keine Ordnung der<br />

Schlüssel. Verwendet man den OrderPreservingPartitioner, ist zwar eine Ordnung<br />

gegeben, die Daten werden aber dann nicht mehr gleichmäßig im Cluster verteilt.<br />

Außerdem werden nicht alle Datensätze über den Zeilenschlüssel verb<strong>und</strong>en. Insgesamt<br />

wären sowohl tiefgreifendere Änderungen am Quelltext vorzunehmen, als auch<br />

das Speicherverfahren soweit abzuändern, da<strong>mit</strong> die Daten richtig partitioniert würden.<br />

29

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!