Verteilte Auswertung von RDF-Graphen mit MapReduce und ...
Verteilte Auswertung von RDF-Graphen mit MapReduce und ...
Verteilte Auswertung von RDF-Graphen mit MapReduce und ...
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