Text - PVS: Parallel and Distributed Systems Group at Heidelberg

Werbung
Ruprecht-Karls-Universität Heidelberg
Institut für Informatik
Lehrstuhl für Parallele und Verteilte Systeme
Bachelorarbeit
Einbindung des Mahout-Frameworks in das
KNIME-Workflowsystem zwecks Analyse
großer Datenmenge
Name:
Matrikelnummer:
Betreuer:
Datum der Abgabe:
Max Ernst
2743117
Prof. Dr. Artur Andrzejak, Dipl.-Math. Lutz Büch
30.07.2014
Ich versichere, dass ich diese Bachelor-Arbeit selbstständig verfasst und nur die angegebenen
Quellen und Hilfsmittel verwendet habe.
Heidelberg, 30.07.2014
Zusammenfassung
In der heutigen Zeit gewinnt Data-Mining immer mehr an Bedeutung. Dabei wird versucht,
aus einem Datenbestand neue Muster zu erkennen. Data-Mining Tools wie „KNIME“ (Konstanz Information Miner) bieten dem Benutzer eine grafische Oberfläche für die Verarbeitung
der Daten mit Hilfe des maschinellen Lernens an. Aus Speicherplatzgründen ist es jedoch nur
möglich relativ kleine Datenmengen zu verarbeiten.
Auf der anderen Seite benutzt die neue Generation der parallelen Algorithmen für maschinelles Lernen das Map-Reduce Paradigma, um eine hohe Skalierbarkeit, insbesondere
für große Daten, zu erlangen. So wurden, zum Beispiel, in dem Projekt Apache Mahout
(http://mahout.apache.org/) eine Vielzahl von Algorithmen implementiert, die das Framework
Hadoop benutzen. Schwierigkeiten, die sich dabei ergeben, sind zum Einen, dass viel Zeit
sowohl für die Einrichtung und Konfiguration als auch in die Einarbeitung von Mahout investiert werden soll, bevor damit angefangen zu arbeiten werden kann und zum Anderen, dass
der Output nicht so einfach in ein KNIME Workflow übernommen werden kann.
In dieser Arbeit werden für die freie Software „KNIME“ (Konstanz Information Miner) Knoten mit einer Anbindung an Mahout implementiert, um die Datenanalyse von großen Datenmengen dem Benutzer zu ermöglichen.
Mit dem Einsatz von Mahout werden große Daten außerhalb von KNIME verarbeitet und nur
eine kleine Datenmenge als Output dem nächsten Knoten übergeben.
Die Verwendung von Mahout innerhalb eines KNIME-Knotens bietet den Vorteil, dass die
Verarbeitung der Daten über Mahout in ein KNIME-Workflow eingebunden werden kann.
Das Ganze wird in Form einer virtuellen Maschine dem Benutzer zur Verfügung stehen.
Abstract
Today data mining is becoming increasingly important. It attempts to identify new patterns
from a data sets. Data mining tools such as „KNIME“ (Konstanz Information Miner) provide
the user with a graphical interface for processing the data with the help of machine learning.
Space reasons, however, it is only possible to process relatively small amounts of data.
On the other hand, the new generation of parallel algorithms for machine learning uses the
Map-Rreduce paradigm to achieve high scability. Variety of algorithms in Apache Mahout
Project, for example, were implemented using the Hadoop framework. One problem is that a
lot of time both should be invested for the installation and configuration as well as the incorporation of Mahout, before it can be started to work and secondly, that the output can not be
iii
used so easily in a KNIME workflow.
In this work nodes for the free software „KNIME“(Konstanz Information Miner) with a
connection to Mahout to simplify the data analysis of large data sets will be implemented.
With the use of Mahout large data are processed outside of KNIME and only a small amount
of data passed as output to the next node.
Using Mahout within KNIME node has the advantage that the processing of data on Mahout
can be integrated in a KNIME workflow.
The whole work will be available within a virtual machine.
iv
Inhaltsverzeichnis
Abbildungsverzeichnis
vii
Tabellenverzeichnis
viii
1
2
Einleitung
1
1.1
Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.2
Ziele der Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.3
Aufbau der Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
Grundlagen
4
2.1
Related Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.2
Parallele Algorithmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.3
Map-Reduce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
2.3.1
Vorgehensweise . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.3.2
Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
Apache Hadoop Framework . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.4.1
Job- und TaskTracker . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.4.2
Hadoop Distributed File System . . . . . . . . . . . . . . . . . . . .
8
2.5
KNIME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.6
Clustering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
2.7
Recommender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
2.8
Mahout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
2.4
3
Implementierung und Ausführung Mahout-Knoten
12
3.1
Mahout-Knoten Aufbau . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
3.2
Oracle VM VirtualBox Einrichtung . . . . . . . . . . . . . . . . . . . . . . .
13
3.3
Mahout-KMeans-Knoten Ausführung . . . . . . . . . . . . . . . . . . . . .
14
3.4
Ausführung innerhalb eines Hadoop-Clusters . . . . . . . . . . . . . . . . .
17
3.5
Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
v
Inhaltsverzeichnis
3.6
4
5
22
4.1
22
Beschreibung Mahout-Knoten . . . . . . . . . . . . . . . . . . . . . . . . .
Szenario und Evaluation
5.2
7
Szenario . . . . . . . . . .
5.1.1 KNIME K-Means .
5.1.2 Mahout K-Means .
Evaluation . . . . . . . . .
5.2.1 Einzelinstanz . . .
5.2.2 Cluster . . . . . .
27
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
27
27
29
30
30
35
Schlussbetrachtung
38
6.1
6.2
38
38
Ergebnisse dieser Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Anhang
Literaturverzeichnis
vi
20
Workflow aus Mahout-Knoten
5.1
6
Fehlerbehebung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
40
Abbildungsverzeichnis
2.1
2.2
2.3
Pervasive Big Data & AnalyticsTM . . . . . . . . . . . . . . . . . . . . . . .
Datenfluss beim Map-Reduce Verfahren . . . . . . . . . . . . . . . . . . . .
KNIME Workflow (http://www.knime.org/screenshots) . . . . . . . . . . . .
5
6
9
3.1
3.2
3.3
Mahout-Knoten Dialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mahout-KMeans-Knoten Beispiel . . . . . . . . . . . . . . . . . . . . . . .
CSV Writer Ausgabe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
20
20
4.1
4.2
4.3
4.4
4.5
4.6
4.7
Mahout Workflow . . . . . . . . . . .
Konfiguration Start-Knoten . . . . . .
Konfiguration Input-Knoten . . . . .
Konfiguration Clustering-Knoten . . .
Konfiguration Fetch-Knoten . . . . .
Konfiguration Stop-Knoten . . . . . .
Konfiguration Recommender-Knoten .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
23
23
24
25
25
26
26
5.1
5.2
5.3
5.4
5.5
5.6
KNIME K-Means vor der Ausführung . . . . . . . . . . . . . .
KNIME K-Means nach der Ausführung . . . . . . . . . . . . .
Mahout K-Means vor der Ausführung . . . . . . . . . . . . . .
Mahout K-Means nach der Ausführung . . . . . . . . . . . . .
K-Means Java heap space overflow . . . . . . . . . . . . . . . .
Verarbeitungsgeschwindigkeit Einzelinstanz und Hadoop Cluster
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
28
28
29
30
32
36
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
vii
Tabellenverzeichnis
5.1
5.2
5.3
viii
Vergleich K-Means KNIME und Mahout (Laufzeiten) . . . . . . . . . . . . .
Vergleich K-Means Mahout und Mahout Workflow (Laufzeiten) . . . . . . .
Vergleich K-Means Mahout Einzelinstanz und Cluster . . . . . . . . . . . . .
31
34
35
1 Einleitung
1.1 Motivation
In der heutigen Zeit werden immer schnellere Rechenleistungen verlangt und vorausgesetzt. In
den letzten Jahrzehnten sind Prozessoren und Arbeitsspeicher um Vielfaches schneller geworden, Festplatten besitzen Kapazitäten, die man vor einiger Zeit noch für unmöglich gehalten
hat, was wiederum dazu führt, dass schnellere Prozessoren mit mehr Daten belastet werden.
Die Datenmengen werden tendenziell immer größer und sind leichter verfügbar (Stichwort
"Big Data") und wegen des begrenzten Hauptspeichers muss auf verteilte Systeme ausgewichen werden.
Bei sehr großen Datenmengen findet häufig das von Google eingeführte Framework „MapReduce“ den Einsatz. Dabei werden die Daten auf mehrere Rechner innerhalb eines Rechnerverbands (Computercluster) verteilt, separat verarbeitet und die Ergebnisse dann zusammengefügt. Innerhalb eines Rechners werden die Daten z.B. auf mehrere Kerne verteilt.
Das Problem mit den großen Datenmengen und Verarbeitungszeit stellt sich auch bei der Clusteranalyse, Klassifikationsverfahren und allgemein im Bereich des maschinellen Lernens.
Die Apache Mahout Sammlung bietet eine Menge von skalierbaren Algorithmen, um Klassifikatoren zu trainieren / testen, aber auch um Cluster zu bilden. Durch das Hinzufügen weiterer
Knoten / Rechnern steigt auch proportional die Leistung.
Bei einer Verteilung von Daten bringt uns Map-Reduce nicht nur schnellere Verarbeitung mit
sich, sondern auch die Sicherheit, dass alle Daten verarbeitet werden. Beim Ausfall eines Knotens muss sichergestellt werden, dass Daten, die diesem Rechner zugewiesen wurden, nicht
ins Leere gehen, sondern einem anderen Knoten zugewiesen und über diesen zum Output
weitergeleitet werden. Wäre dies nicht der Fall, so könnten manche Daten verloren gehen und
das Ergebnis letztendlich verfälscht werden.
Alle diese Eigenschaften machen Mahout zu einem mächtigen und ziemlich stabilen Werkzeug. Jedoch bietet Mahout keine grafische Benutzeroberfläche.
Für eine Datenanalyse mit grafischer Oberfläche wird oft das Werkzeug „KNIME“ eingesetzt.
Dem Benutzer ist es möglich, mit Hilfe unterschiedlicher Knoten, Workflows zu bilden. Jeder
1
1 Einleitung
Knoten verarbeitet die Daten auf seine vordefinierte Art und Weise. Sind die Daten „klein“,
können sie innerhalb eines Knotens erfolgreich verarbeitet werden, bei etwas größeren (dabei
handelt es sich um Daten, die wesentlich kleiner als 1 GB groß sind) oder ganz großen Daten
(Tera-, Petabyte...) wird der Knoten die Ausführung einfach abbrechen, da der Speicher für
die Verarbeitung nicht ausreichend vorhanden ist.
In dieser Arbeit werden neue KNIME-Knoten für das Clustern großer Datenmengen implementiert, die die Verarbeitung nicht intern ausführen, sondern einen Mahout Prozess starten,
der die Daten verarbeitet, und das Ergebnis an den nächsten Knoten übergibt. Somit wird die
Vorteile von Mahout (Verarbeitung großer Datenmengen) und KNIME (Datenanalyse über
grafische Benutzeroberfläche) miteinander kombiniert.
1.2 Ziele der Arbeit
In dieser Arbeit wird eine Schnittstelle zwischen KNIME und Mahout gebildet, um parallele
Mahout-Algorithmen von KNIME aus starten zu können.
Mahout enthält Algorithmen, die auf Hadoop Plattform ausgeführt werden und somit Verteilung der Daten und ihre Verarbeitung auf mehrere Rechner erlaubt. Aber auch wenn die Daten
auf einem Rechner verarbeitet werden, ist es möglich viel größere Datensätze zu übergeben
als es von KNIME standardmäßig vorgesehen ist. Dafür muss Hadoop und Mahout konfiguriert werden. Für die Mahout Einrichtung muss der Benutzer viel Zeit aufwenden. Das erste
Ziel ist also, die Einrichtung und Arbeit mit Mahout zu vereinfachen, so dass sich der Benutzer nur mit der Verarbeitung seiner Daten beschäftigen muss.
KNIME bietet die Möglichkeit, verschiedene Algorithmen über grafische Knoten auszuführen. D.h. der Benutzer kann alle Einstellungen über die grafische Benutzeroberfläche vornehmen, ohne tiefe Kenntnisse in den Terminalbefehlen zu haben. Es fehlt jedoch die Schnittstelle zwischen Mahout und KNIME, es ist also nicht möglich einen Mahout-Befehl in einem
KNIME-Knoten und somit in einem Workflow auszuführen. Ein weiteres Ziel ist somit einen
Mahout-Knoten für KNIME zu erstellen, welcher nur die Eingangsdaten benötigt und die
Ausgabe innerhalb eines Workflows weiterleitet oder in ein vom Benutzer eingegebenes Verzeichnis schreibt.
Der Mahout-Knoten soll Mahout und KNIME vereinigen. Beispielhaft wurde der K-Means
Algorithmus integriert, bei dem der Benutzer als Eingabedaten die Vektoren, die Anzahl der
Cluster und ggf. maximale Anzahl der Iterationen übergibt. Es wird als gewöhnlicher KNIMEKnoten ausgeführt und die Ausgabe kann wiederum als Eingabe in weiteren Knoten verwendet werden.
2
1.3 Aufbau der Arbeit
1.3 Aufbau der Arbeit
In Kapitel 2 werden grundlegende Methoden und Konzepte für diese Arbeit vorgestellt. Diese Grundlagen sollen dem Verständnis über eingesetzte Frameworks und damit verbundenen
Themen helfen und sich dahinter befindliche Abläufe kurz vorstellen.
Kapitel 3 beschreibt die Umsetzung der Anforderungen und Einsatzmöglichkeiten der entwickelten Knotenen. Ebenfalls wird auf die Konfiguration der Knoten, mögliche Fehler und
dazugehörige Lösungen eingegangen. Diese Knoten dienen als Prototypen und werden im
nächsten Schritt in weitere Knoten zerteilt.
4 Kapitel beschreibt weitere Entwicklung der Knoten, die den Aufbau der Workflows, durch
das Trennen der Ausführungen einzelner Aufgaben, flexibler macht.
Im Kapitel 5 wird ein mögliches Szenario für den Einsatz des Mahout Knotens präsentiert.
Zusätzlich findet noch ein Vergleich zwischen dem standardmäßigen K-Means Knoten aus
KNIME und dem Mahout K-Means Knoten statt.
3
2 Grundlagen
Die in diesem Kapitel vorgestellte Bereiche sollen das Verständnis über Technologien, die
in dieser Arbeit eingesetzt werden, erweitern und letztendlich den Sinn und den Zweck dieser Arbeit erläutern. Eingesetzte Verfahren aus der Mahout-Sammlung zur Datenanalyse wie
Clustering und Recommender werden beschrieben.
2.1 Related Works
Das Problem mit der Verarbeitung großer Datenmengen bei KNIME ist nicht neu, deswegen
werden KNIME Erweiterungen von Pervasive Big Data & AnalyticsTM für verteilte Frameworks wie Hadoop entwickelt. „Pervasive RushAnalytics for KNIME“ wurde mit dem Ziel
entwickelt, den maximalen Vorteil aus der Infrastruktur der parallelen Verarbeitung zu erzielen und damit eine höhere Verarbeitungsgeschwindigkeit zu erreichen. [3]
Abbildung 2.1 zeigt, dass RushAccelerator for KNIME 2 bis 10 und RushAnalytics 10 bis
100 Mal schneller als KNIME sind.
Im Download Center werden unterschiedliche Versionen zur Verfügung gestellt und können
nach einer Anmeldung als virtuelle Maschinen heruntergeladen werden.
2.2 Parallele Algorithmen
Ein Algorithmus heißt parallel, wenn er erstens so in Einzelschritte zerlegt werden kann, dass
diese auf verschieden Prozessoren (Rechner) verteilt werden können, und wenn zweitens diese Prozessoren unabhängig und gleichzeitig arbeiten. [10]
Diese Vorgehensweise wird z.B. von Google zum Einsatz gebracht, um extrem große Datenmengen verarbeiten zu können, bräuchte eine einzelne Maschine mehrere Jahre, um Suchindexe zu erstellen. So eine lange Verarbeitungszeit würde dazu führen, dass Google die Daten
niemals aktuell halten könnte, deswegen wird mit parallelen Algorithmen gearbeitet, die es
möglich machen, große Datenmenge auf viele Maschinen zu verteilen. Parallele Algorithmen
werden auch bei Mahout (Abschnitt 2.8) eingesetzt.
4
2.3 Map-Reduce
Abbildung 2.1: Pervasive Big Data & AnalyticsTM
Bei parallelen Algorithmen werden die Daten zerlegt und getrennt voneinander verarbeitet,
was uns zum nächsten Begriff führt - Map-Reduce.
2.3 Map-Reduce
Map-Reduce ist ein Framework für nebenläufige Berechnungen über große Datenmengen. Es
wurde von Jeffrey Dean und Sanjay Ghemawa im Jahr 2004 bei Google entwickelt.
Dadurch, dass die Daten auf mehrere Rechner verteilt werden, ist es möglich große Datenmengen in kurzer Zeit zu bearbeiten.
Ein weiterer Vorteil ist, dass man keine spezielle High-End Server bereitstellen muss, sondern
auf handelsüblichen Computern die Verarbeitung durchführen kann.
Wie der Name schon sagt, besteht Map-Reduce aus zwei Phasen: Map und Reduce, genau so
heißen die Funktionen, die nebenläufig verwendet werden.
Die map() Funktion berechnet die Werte für alle Eingabeelemente und stellt sie in modifizierter Form wieder dar. Die reduce() Funktion fasst die Ergebnisse zusammen und reduziert sie
auf eine Ausgabedatei(-wert).
5
2 Grundlagen
Abbildung 2.2: Datenfluss beim Map-Reduce Verfahren
2.3.1 Vorgehensweise
Abbildung 2.2 stellt Map- und Reducephasen mit jeweiligen Ergebnissen dar, einzelne Schritte sind im Folgenden erklärt:
• Daten werden auf unterschiedliche Map-Prozesse verteilt und parallel berechnet
• Berechnungen werden als Zwischenergebnisse gespeichert, wobei jede Map-Funktion
ihre Ergebnisse auf jedes Zwischenergebnis verteilen kann
• sind alle Map-Prozesse fertig, ist die Map-Phase zu Ende
• nun beginnt die Reduce-Phase, die aus jedem Zwischenergebnis ein Endergebnis berechnet, Reduce-Prozesse laufen ebenfalls parallel ab
Die Map-Phase stellt Zwischenergebnisse als Schlüssel-Wert-Paare dar und die Reduce-Phase
fasst diese zusammen und gibt auch Schlüssel-Wert-Paare aus. Formal gesehen ist MapReduce-Framework eine Abbildung:
(K × V)∗ → (L × W)∗
[(k1 , v1 ), ..., (kn , vn )] 7→ [(l1 , w1 ), ..., (lm , wm )],
wobei K und L Schlüssel, V und W Werte enthalten.
6
2.4 Apache Hadoop Framework
2.3.2 Beispiel
Man kann sich viele Anwendungen für das parallele Berechnen vorstellen, an dieser Stelle
wird das gängigste Einführungsbeispiel vorgestellt. Das „Hello World!“ Beispiel aus der Programmierung ist in Map-Reduce das Beispiel Wörter in einem Text zu zählen, d.h. es wird
gezählt wie oft jedes Wort in einem Text vorkommt.
In der Map-Phase wird der Text geteilt und verschiedenen Rechnern zugeteilt, jeder Rechner
berechnet Anzahl Wörter, die in seinem Teil vorkommen und legt sie als Zwischenergebnisse
im Speicher ab. So kann es vorkommen, dass das Wort „ich“ vom ersten Map-Prozess 5 mal
gezählt wurde und vom zweiten Map-Prozess 7 mal, d.h. es sind 2 Ergebnisse, die aber zusammengefasst werden sollen, was auch die einzelnen Reduce-Phasen machen und als Ergebnis
eine Liste aus Wörtern (Schlüsseln) und der jeweiligen Anzahl (Werte) ausgeben.
Pseudo-Code:
map(String key, String value):
// key: document name
// value: document contents
for each word w in value:
EmitIntermediate(w, "1");
reduce(String key, Iterator values):
// key: a word
// values: a list of counts
int result = 0;
for each v in values:
result += ParseInt(v);
Emit(AsString(result));
2.4 Apache Hadoop Framework
Map-Reduce Framework nimmt dem Entwickler viel Arbeit ab, so müssen nur die Map- und
Reducefunktionen implementiert werden, alles andere, wie Fehlerbehandlungen, Scheduling
Verfahren für die Jobverteilung und Koordination, d.h. technische Details werden vom System
erledigt. Ein konkretes Framework wird in diesem Abschnitt vorgestellt.
Das von Google entwickelte Map-Reduce Framework ist kostenpflichtig und urheberrechtlich geschützt, deswegen wird an dieser Stelle das Open-Source, in Java entwickeltes Framework der Apache Foundation verwendet.
7
2 Grundlagen
Es stehen 3 Modi zur Verfügung, in denen Hadoop-Framework gestartet werden kann:
• Standalone mode: Programm startet in einem einzigen Prozess
• Pseudo-distributed mode: Programm startet auf einem Rechner, wird jedoch in mehrere
Java Prozesse gesplittet
• Cluster mode oder Fully distributed: läuft auf einem Cluster aus mehreren Rechnern
Hadoop ist offen für alle Entwickler, bietet eine sehr hohe Fehlertoleranz und eignet sich damit
bestens für diese Arbeit.
2.4.1 Job- und TaskTracker
In einem Framework gibt es zwei Arten von Prozessen, die für die Verarbeitung der Daten
zuständig sind - der eine wird als JobTracker-Prozess bezeichnet, alle andere Prozesse werden
TaskTracker-Prozesse genannt (Google verwendet dazu die Begriffe Master und Worker.).
Der JobTracker-Prozess weist den einzelnen Rechnern im Cluster Jobs zu, welche wiederum Map- oder Reducefunktionen sind. Nach der Zuweisung werden die Daten mit Hilfe von
Remote Method Invocation (RMI) aus dem Speicher gelesen und verarbeitet. Nachdem alle
Map- und Reduceprozesse beendet sind, weckt der JobTracker ein Benutzerprogramm auf,
dass alle Daten berechnet wurden und weitergeleitet werden können.
Es gibt also genau einen JobTracker und mehrere TaskTracker; JobTracker bekommt Mapund Reducefunktionen, die er an einzelne Knoten (TaskTracker) verteilt. Dem JobTracker ist
bekannt, an welchem Knoten welche Daten zu finden sind, dies wird bei der Arbeitszuweisung berücksichtigt, wodurch das Verschicken der Daten über das Netzwerk vermieden und
Zeit gespart wird. Daten werden nur in dem Fall zum nächsten Rechner im Cluster geschickt,
falls auf einem anderen momentan keine Funktion ausgeführt werden kann.
2.4.2 Hadoop Distributed File System
Hadoop Distributed File System (HDFS) ist von Apache entwickeltes Dateisystem. Es wird
eigenes Dateisystem verwendet, da es speziell für große Datenmengen auf verteilten Rechnern
erstellt wurde. Die Verteilung auf die Cluster wird möglichst optimal durchgeführt und die
Zugriffszeiten sind sehr kurz.
In einem Cluster gibt es unterschiedliche Typen von Knoten mit jeweiligen Aufgaben,
auf die sie spezialisiert sind. Der sogenannte „NameNode“ ist für die Steuerung des Namespaces, Metadaten des Dateisystems und Rechenzugriffe zuständig. Auf den „DataNodes“
8
2.5 KNIME
werden tatsächliche Daten, die bearbeitet werden, gespeichert. Als letztes existiert noch ein
„SecondaryNameNode“, der die Änderungen des ursprünglichen Dateisystems als Log-Files
speichert.
2.5 KNIME
KNIME ist eine freie Software, die in solchen Bereichen wie Mathematik, Bioinformatik,
Statistik usw. für die Datenanalyse eingesetzt wird. Dabei bietet es zahlreiche Verfahren des
maschinellen Lernens und Data-Mining an.
Ein Workflow in KNIME besteht aus Knoten, die Daten verarbeiten, und Kanten, die einen
Datenfluss darstellen. Ein Knoten kann sowohl eine als auch mehrere Eingangskanten als Input haben, genauso ist es aber möglich zu verarbeitende Daten von der Festplatte zu laden
(zumindest der erste Knoten bekommt seine Daten nicht von einem anderen Knoten).
Abbildung 2.2 zeigt die Arbeitsfläche von KNIME. Auf der linken Seite werden unterschied-
Abbildung 2.3: KNIME Workflow (http://www.knime.org/screenshots)
liche Knoten kategorisiert aufgelistet, die je nach Art der Analyse und den Eingangsdaten
ausgewählt werden können.
Im mittleren Bereich wird der ganze Workflow dargestellt. Die Knoten können unterschiedliche Status besitzen, dies sieht man an der Farbe, die sich unter dem Knoten befindet: gelb
9
2 Grundlagen
bedeutet, dass der Knoten notwendige Daten enthält und bereit für die Ausführung ist; bei rot
müssen noch Daten angegeben werden; grün - der Knoten wurde bereits ausgeführt.
2.6 Clustering
Clustering - Datensätze werden nach ihrer Ähnlichkeit dermaßen in Cluster unterteilt, dass ein
Cluster Datensätze enthält, die zueinander ähnlich und möglichst unterschiedlich zu den Datensätzen aus anderen Clustern sind. Wie ähnlich die Datensätze zueinander sind wird durch
eine Distanzfunktion bestimmt, z.B. durch die Euklidische Distanzfunktion.
Im Gegensatz zur Klassifikation sind die Cluster am Anfang unbekannt, es findet also kein
Lernvorgang mit Trainingsdaten statt. Es ist jedoch möglich die Anzahl der Cluster und die
Distanzfunktion innerhalb dieser Cluster zu bestimmen.
Als ein Beispiel, wird an der Stelle ein einfaches Clusteringverfahren K-Means vorgestellt.
K-Means ist ein einfaches und das meistverbreitete Clusteringverfahren. Jeder Cluster bei
K-Means besitzt seinen eigenen Schwerpunkt, den sogenannten „Centroid“. Anzahl der Cluster wird vor der Ausführung angegeben, die Schwerpunkte werden dann zufällig verteilt. Das
Ziel dabei ist es, den durchschnittlichen quadratischen Abstand vom Schwerpunkt zu minimieren, indem iterativ jeder Datensatz einem Cluster zugewiesen wird und anschließend die
Schwerpunkte neuberechnet werden.
Der letzte Schritt wird solange ausgeführt, bis eine bestimmte Anzahl von Iterationen erreicht
ist oder bis die Schwerpunkte sich nicht mehr bewegen.
Einsatzgebiet von K-Means ist oft in der Computergraphik die Bildsegmentierung. Das Bild
wird in bestimmte Bereiche (Segmente) unterteilt, in welchen die Bildpunkte gemeinsame
Eigenschaften besitzen. Welche Eigenschaften es sind, hängt vom Kontext ab; auf den Röntgenbildern z.B. werden zusammengehörende Elemente über Farbintensität den Clustern zugeordnet.
Es existieren unterschiedliche Variationen von K-Means wie z.B. K-Means++, bei dem
versucht wird bessere Startpunkte zu finden, oder Fuzzy K-Means, wo jeder Datensatz nicht
einem bestimmten Cluster, sondern ein Satz Gewichte zugeordnet wird, die angeben wie stark
die Zugehörigkeit zu einem bestimmen Cluster ist.
10
2.7 Recommender
2.7 Recommender
Recommender System (Empfehlungsdienst) ist ein Verfahren, welches dazu benutzt wird,
ähnliche Objekte zu ermitteln und Empfehlungen zu erstellen. Anhand bestehender Daten
(Kontext) kann bestimmt werden welche weitere Daten als Empfehlung verwendet werden
können.
Eine Recommender Engine kann beispielsweise bei Videofilmen oder Büchern eingesetzt werden. Bereits ausgeliehene Bücher stellen die Vorlieben eines Benutzers dar. Darüber kann erfahren werden, welche Autoren oder Genre der Benutzer bevorzugt; ebenso können das Alter,
das Geschlecht und die Herkunft der Person eingesetzt werden, um passende Vorschlage machen zu können.
Die Eingabe enthält somit eine Liste der gelesenen Büchern und einer Liste noch zusätzlich
vorhandener Bücher. Daraus wird eine Rankingliste erstellt.
2.8 Mahout
Mahout ist ein Apache Projekt, welches sich mit der skalierbaren Implementierung von maschinenlernenden Algorithmen auf der Hadoop Plattform befasst. Es enthält einige Algorithmen für z.B. Clustering und Klassifikation. So ist auch im Abschnitt 2.6 vorgestelltes KMeans Clusteringverfahren in der Mahout Sammlung vorhanden.
Mahout modifiziert die Inputdaten nicht, somit bleibt der Benutzer flexibel und kann Algorithmen mit verschiedenen Parametern ausführen, um diese auszuprobieren, zu testen und zum
bestmöglichen Ergebnis zu kommen. Die Daten werden jedoch zwischen verschiedenen Ausführungen nicht im Speicher gehalten, sondern müssen immer wieder neu geladen werden.
11
3 Implementierung und Ausführung
Mahout-Knoten
In diesem Kapitel werden zu implementierende Methoden und Algorithmen und jeweilige
Entscheidungen gezeigt und vorgestellt.
Als Einstieg in die KNIME-Implementierung wird zuerst ein KMeans-Knoten implementiert
und die Ausführung mit den jeweiligen Konfigurationen gezeigt. Wie der Name bereits verrät,
ist dieser Knoten nur auf K-Means beschränkt und sogar bei diesem Verfahren können nur
wichtigste Konfigurationen vorgenommen werden.
Ein weiterer wichtiger Teil dieses Kapitels ist die Vorstellung und der Umgang mit der virtuellen Maschine. Da man diese Mahout-Knoten nicht in jede beliebige KNIME Umgebung
einbinden kann, werden die Knoten zusammen mit dem Betriebssystem (mit installiertem Hadoop Framework etc.) als virtuelle Maschine herausgegeben. Somit müssen zumindest Grundlegende Bereiche der virtuellen Maschine, aber auch, falls es zu Problemen kommen sollte,
Schritte, die bei Fehlerbehebungen durchzuführen sind, erwähnt werden.
3.1 Mahout-Knoten Aufbau
Um einen Mahout-Knoten implementieren zu können, werden einige Klassen von KNI ME tech
zur Verfügung gestellt, die auf eigene Anforderungen vervollständigt und angepasst werden
können. Im folgenden werden diese Klassen vorgestellt.
NodeModel - diese Klasse ist für die allgemeine Beschreibung des Knotens verantwortlich. Der Konstruktor definiert die Anzahl der Ein- und Ausgangsports. Da die Eingangsdaten
von unserem Knoten sehr groß sein und auch meistens von außen hinzugefügt werden, besitzt
der Mahout-Knoten keinen Eingangsport. Die Ausgabe wird jedoch so klein sein, dass sie als
Eingabe für den nächsten Knoten genommen werden kann und auch soll.
Weiterhin werden alle Dialog-Komponenten angegeben, welche der Benutzer bei der Konfiguration des Knotens angezeigt bekommt. Im Falle des Mahout-Knotens handelt es sich um
12
3.2 Oracle VM VirtualBox Einrichtung
solche Komponenten wie Ein- und Ausgabepfade, Anzahl der Cluster und maximale Anzahl
der Iterationen. Diese werden mit Default-Werten erzeugt, die dann später vom Benutzer geändert werden können / müssen.
Wichtige Methoden aus dieser Klasse sind validateSettings(), saveSettingsTo() und loadValidatedSettingsFrom(), um die Einstellungen zu prüfen, ob erforderliche Daten angegeben wurden; Einstellungen zu speichern und diese zu laden. execute() enthält Anweisungen für die
Ausführung des Knotens.
NodeDialog - platziert die in der NodeModel definierte Komponente auf das Fenster (panel)
bzw. Dialog, den der Benutzer angezeigt bekommt. Dabei geht es im Wesentlichen um die
Positionen der einzelnen Komponente und ihrem Verhalten wie beispielsweise Verschwinden
einzelner Einstellungen beim Setzen eines Hakens.
NodeView - zeigt die Ausgabe graphisch an.
3.2 Oracle VM VirtualBox Einrichtung
Das Endergebnis dieser Arbeit wird in Form einer virtuellen Maschine allen Benutzern zur
Verfügung gestellt. Eine ganze Maschine deswegen, weil es nicht nur der implementierte Knoten als Plugin in KNIME eingebunden werden muss (was auch möglich wäre, nur den Knoten
in KNIME zu importieren), sondern auch Hadoop und Mahout eingerichtet und lauffähig sein
müssen.
Es existiert eine Reihe von virtuellen Maschinen, solche wie „Windows Virtual PC“, „VMware Workstation“, „Parallels Workstation“ usw. Da nicht alle Maschinen kostenlos sind und
auch die Einrichtung bei manchen viel Aufwand erfordert, fiel die Entscheidung auf die eine
der bekanntesten und zugleich kostenlose virtuelle Maschine „Oracle VM Virtual Box“.
Obwohl die Maschine lauffähig zur Verfügung gestellt wird, müssen vom Benutzer dennoch
einige Einstellungen, Änderungen oder Anpassungen vorgenommen werden. Dieser Abschnitt
beschreibt grundlegende Operation, die notwendig oder sinnvoll für die Ausführung der VirtualBox sein können.
Maschine Einbinden:
Um eine neue Maschine in die Virtual Box aufzunehmen, wird im Menü „Maschine –> Hinzufügen“ entsprechende Maschine ausgewählt. Damit wird die neue Maschine eingebunden
und kann bereits gestartet werden. Administrator „VM“ mit dem Passwort „admin“ ist angelegt.
13
3 Implementierung und Ausführung Mahout-Knoten
Gemeinsamen Ordner definieren:
Es muss evtl. eine Schnittstelle zwischen dem echten Betriebssystem und der virtuellen Maschine geschaffen werden, nämlich ein gemeinsamer Ordner (oder mehrere) den die beiden
Systeme nutzen. Dazu wird in der Virtual Box die entsprechende Maschine markiert und
Menüpunkt „Ändern“ausgewählt. Daraufhin erscheint ein Fenster mit dem Unterpunkt „Gemeinsame Ordner“. Hier kann ein gemeinsamer Ordner definiert werden, als Beispiel wird ein
der Stelle Verzeichnis „C:\Gemeinsamer Ordner“ verwendet.
Dieses Verzeichnis muss auch in der virtuellen Maschine eingebunden werden, dies geschieht
im Terminal mit der Ausführung des Befehls:
sudo mount -t vboxsf Gemeinsamer_Ordner /home/vm/Desktop/Shared/ ,
wobei „Gemeinsamer_Ordner“ der Ordner-Name ist, der beim Hinzufügen in die Virtual Box
angezeigt wurde und „/home/vm/Desktop/Shared/“ das Verzeichnis, in welchem der Inhalt
des gemeinsames Ordners unter Linux angezeigt werden soll.
Nach der Eingabe des Passworts sollen beide Systeme auf den gemeinsamen Ordner zugreifen
können.
Netzwerk einrichten:
Die Maschine besitzt 2 Netzwerkadapter, einen, um Zugang ins Internet zu bekommen und
einen zweiten, um sich mit dem echten Betriebssystem in einem Netzwerk befinden zu können. Dies ist z.B. für einen Cluster notwendig. Werden mehrere virtuelle Maschinen eingebunden muss evtl. die Mac-Adresse unter „Ändern“ –> „Netzwerk“ –> „Adapter 2“ –> „MACAdresse:“ –> „aktualisieren“ geändert werden.
Auch sonstige Einstellungen bzgl. des Netzwerkes und Adapter können hier angepasst werden.
3.3 Mahout-KMeans-Knoten Ausführung
Dieser Abschnitt beschreibt Einzelschritte, die bei der Ausführung des ersten Knotens passiert
werden.
Im Kapitel 2 wurde ein Clustering-Verfahren K-Means vorgestellt. Dieses Verfahren führt der
erste Knoten aus. Der Vorteil dieses Knotens ist, dass der Benutzer alle Einstellungen über
grafische Oberfläche vornehmen kann. Es ist ein reiner K-Means Knoten, der nur K-Means
ausführt und keine Kenntnisse über Terminal-Befehle von Mahout erfordert. Das ganze Projekt wird nicht auf einem „normalen“ Betriebssystem, sondern auf einer virtuellen Maschine
14
3.3 Mahout-KMeans-Knoten Ausführung
durchgeführt. Als Betriebssystem wurde Linux-Distribution Ubuntu 12.10 verwendet. Dieses
beinhaltet alle notwendigen Pakete, um darauf Hadoop und Mahout ausführen zu können.
Bevor dieser Knoten näher erläutert wird, wird an dieser Stelle genauer auf den Umgang mit
Mahout eingegangen. Um einen Mahout-Befehl in der Kommandozeile auszuführen, muss der
Benutzer in den Systemeinstellungen den Pfad zu der Ausführungsdatei von Mahout angeben
und damit Mahout aus jedem beliebigen Verzeichnis starten können oder zum Unterverzeichnis „bin/mahout“ von Mahout navigieren und von dort aus Befehle an Mahout übergeben.
Eine Eingabe hat etwa folgende Gestalt:
bin/mahout kmeans \
− i < input vectors directory > \
− c < input clusters directory > \
− o < output working directory > \
− k < optional number o f initial clusters to sample f rom input vectors > \
− dm < DistanceMeasure > \
− x < maximum number o f iterations > \
− cd < optional convergence delta. De f ault is 0.5 > \
− ow < overwrite output directory i f present > \
− cl < run input vector clustering a f ter computing Canopies > \
−xm < execution method : sequential or mapreduce >
[6]
Das Beispiel listet 10 Eingabeparameter auf. Der K-Means Knoten kann diese Anzahl von
Argumenten natürlich nicht aufnehmen, über den Dialog können lediglich: -i, -o, -k, -x Parameter konfiguriert werden.
Notwendige Benutzereingaben für den Knoten sind:
1. Pfad zu Vektoren (-i)
2. Anzahl der Cluster (-k)
Als optionale Parameter können
• Ausgabeverzeichnis (-o)
• Maximale Anzahl Iterationen (-x)
• Hadoop auf einem Cluster laufen lassen
15
3 Implementierung und Ausführung Mahout-Knoten
(a) Max. Anzahl Iterationen wird gesetzt
(b) Standartwert für Max. Anzahl der Iterationen verwenden
Abbildung 3.1: Mahout-Knoten Dialog
angegeben werden. Wird der Haken jedoch nicht gesetzt, wird die Anzahl der Iterationen standardmäßig auf 10 gesetzt. Beide Darstellungen werden in der Abbildung 3.1 gezeigt.
Wie in Kapitel 2 bereits erwähnt, muss auf der Maschine Hadoop laufen, um einen MahoutJob ausführen zu können. D.h. vor einem Mahout-Algorithmus muss Hadoop konfiguriert und
gestartet werden. Der Knoten führt folgende Schritte durch:
• Hadoop stoppen
• HDFS formatieren
• Hadoop starten
• 30 Sekunden Pause, damit Hadoop vollständig hochfährt
• Mahout-Algorithmus ausführen
Als Erstes wird Hadoop gestoppt, da es vorkommen kann, dass Hadoop bereits auf der Maschine läuft und sowohl der dritte Schritt (Starten) fehlschlagen als auch der Rest nicht ausgeführt wird.
Ohne Formatierung könnte es vorkommen, dass sich fälschlicherweise alte Daten auf dem
Dateisystem befinden und diese der Ausführung Probleme bereiten. Mit der Formatierung
16
3.4 Ausführung innerhalb eines Hadoop-Clusters
wird sichergestellt, dass nur die zu verarbeitende Daten sich auf dem Dateisystem befinden.
Für die korrekte Ausführung braucht Hadoop für das Starten eine gewisse Zeit, 30 Sekunden
sollten im Normalfall ausreichen, so dass die Ausführung eines Algorithmus nicht zu schnell
kommt.
Diese einzelne Befehle werden an ein Terminal übergeben und als Kommandozeilen ausgeführt. Um den Verlauf beobachten zu können, wird die Ausgabe in der unteren KNIMEKonsole als Info ausgegeben. So ist es für den Benutzer möglich einzelne Befehle, Fortschritt
oder Fehler dort auszulesen.
3.4 Ausführung innerhalb eines Hadoop-Clusters
Abschnitt 3.3 beschreibt den Ablauf auf einem einzelnen Rechner. Es ist aber genauso möglich
die Ausführung auf mehrere Rechner, sprich Cluster, zu verteilen. Die Vorgehensweise und
dafür notwendige Konfigurationen werden in diesem Abschnitt beschrieben.
Es gibt eine Reihe von Konfigurationen, die nur ein Mal eingetragen werden müssen und
keine Änderung mehr benötigen, falls man die virtuelle Maschine mehrmals klont. Werden jedoch andere Maschinen verwendet, müssen diese Konfigurationen auf allen Maschinen durchgeführt werden, damit Hadoop auf einem Cluster laufen kann.
In einem Cluster muss eine Maschine existieren, von der aus alle Befehle gestartet werden,
diese Maschine wird im Folgenden master genannt. Andere Maschinen, die die Aufgaben
nur durchführen werden als slave bezeichnet. Auf welcher Maschine welche Änderungen
vorgenommen werden müssen, werden mit dem jeweiligen Namen gekennzeichnet.
Für die Ausführung auf einem Rechner wird /home/vm/local/hadoop Verzeichnis verwendet,
für die Ausführung auf einem Cluster - /home/vm/local/hadoop-cluster. D.h. alle Änderungen,
die jetzt folgen werden, werden auf das letzte Verzeichnis angewendet.
Als Erstes müssen alle IP-Adressen unter /etc/hosts eingetragen werden, z.B.:
192.168.0.1 master
192.168.0.2 slave
192.168.0.3 slave2
Diesen Eintrag kann nur der Administrator durchführen:
mit sudo vim /etc/hosts gelangt mant zum Vim-Fenster
mit I (insert) kann man den Inhalt editieren
nach dem die Änderung vorgenommen wurde: Esc –> :wq (write + quit) –> Enter
17
3 Implementierung und Ausführung Mahout-Knoten
Dateien, die im Verzeichnis /home/vm/local/hadoop-cluster angepasst werden:
conf/masters (master):
master
conf/slaves (master):
master
slave
slave2
conf/core-site.xml (alle Maschinen):
<property>
<name>fs.default.name</name>
<value>hdfs://master:54310</value>
<description>
The name of the default file system
</description>
</property>
conf/mapred-site.xml (alle Maschinen):
<property>
<name>mapred.job.tracker</name>
<value>master:54311</value>
<description>
The host and port that the MapReduce jobtracker runs
</description>
</property>
conf/hdfs-site.xml (alle Maschinen):
<property>
<name>dfs.replication</name>
<value>2</value>
<description>
Default block replication
</description>
</property>
18
3.5 Beispiel
Auf allen Maschinen kann unter /home/vm/local/hadoop-cluster mit jps geschaut werden,
welche Java-Prozesse laufen. Beim slave könnten die Ausgaben beispielsweise so aussehen:
Nach dem HDFS deamons gestartet wurden:
15183 DataNode
15616 Jps
Nach dem MapReduce deamons gestartet wurden:
15183 DataNode
15897 TaskTracker
16284 Jps
HDFS und MapReduce daemons werden von dem Mahout-Knoten bei der Ausführung automatisch gestartet.
Wie man an der letzten Ausgabe erkennen kann, müssen DataNode und TaskTracker laufen,
dies bedeutet, dass alles korrekt läuft. Ist die Ausgabe anders, wurde etwas falsch konfiguriert.
Die einzelnen Prozess-ID’s werden sich von dem Beispiel höchstwahrscheinlich unterscheiden und ihr Wert spielt an dieser Stelle selbstverständlich keine Rolle.
3.5 Beispiel
Dieser Abschnitt beschreibt die Ausführung des Knotens anhand von synthetic_control.data.
Die Datei befindet sich unter „Home“ –> „Mahout Example“.
Schritt 1 KNIME starten, Doppelklick auf den MahoutKMeans-Knoten.
Schritt 2 Knoten Konfigurieren: entweder über Doppelklick auf den Knoten oder rechter
Mausklick auf den Knoten und „Configure...“.
Schritt 3 Als „Input file“ den Pfad „ /home/vm/Mahout Example/synthetic_control.data“
wählen.
Schritt 4 Für „Output working directory “ kann beliebiges Verzeichnis gewählt werden, z.B.
„/home/vm/Mahout Example/output “ .
Schritt 5 „Number of clusters“ auf 10 setzen (kann auch beliebig sein).
Schritt 6 „CSV Writer “ Knoten hinzufügen und Ausgabedatei setzen.
Schritt 7 Beide Knoten verbinden.
Schritt 8 Ok & rechter Mausklick auf den Knoten –> „Execute“.
19
3 Implementierung und Ausführung Mahout-Knoten
Abbildung 3.2 stellt den fertigen Workflow dar.
Abbildung 3.2: Mahout-KMeans-Knoten Beispiel
Nach einer erfolgreichen Ausführung wird eine Ausgabedatei im Ordner „output“ von Mahout angelegt. Diese beinhaltet gelabelte Vektoren.
Die Struktur der Daten, wie sie an weitere Knoten von K-Means Knoten übergeben wird, sieht
man in der von CVS Writer Knoten erstellten Datei (Abbildung 3.3). Die Zeilen in der CSVDatei stellen je einen Vektor dar, die letzte Zelle beinhaltet das Label. Die Labels werden von
Mahout vergeben und gelangen unverändert in den Output vom K-Means Knoten.
Somit werden 10 Vektoren der Länge 60 und eine Spalte fürs Label erstellt.
Abbildung 3.3: CSV Writer Ausgabe
3.6 Fehlerbehebung
Dieses Kapitel beschreibt mögliche Fehler, die bei der Konfiguration auftauchen können und
Lösungen, die zur Behebung weiterhelfen sollen. Hauptsächlich handelt es sich um die Einrichtung der virtuellen Maschine, da diese als Voraussetzung (für die korrekte Ausführung der
Knoten) richtig konfiguriert werden soll und um Fehlermeldungen, die während der Ausführung der Knoten auftauchen können.
Einbinden der Platte Falls das Hinzufügen der Platte einen Fehler derart „virtual box could
20
3.6 Fehlerbehebung
not find an open hard disk with uuid...“ auftaucht, kann man mit folgenden Schritten die Maschine auf andere Art und Weise hinzufügen:
1. Neue Maschine erstellen.
2. Z.B. „Ubuntu“ benennen, Arbeitsspeichergröße wählen.
3. Vorhandene Festplatte verwenden.
4. Gewünschte virtuelle Maschine auswählen.
5. Maschine starten.
IP-Adresse vergeben Bekommen mehrere virtuelle Maschinen die gleiche IP-Adresse, muss
die MAC-Adresse geändert werden. Dies ist unter „Ändern“ –> „Netzwerk“ –> „Adapter 2“
–> „MAC-Adresse:“ –> „aktualisieren“ möglich.
Grafikkartenanzeige verbessern Wird die Anzeige etwas verlangsamt, d.h. Fenster werden
mit Zeitverzögerung aufgemacht, kann unter „Ändern“ –> „Anzeige“ Grafikspeicher erhöht
und 3-D Beschleunigung aktiviert werden. Dies wird die Reaktionszeit der Anzeige verbessern.
DiskErrorException Bei einer Exception: „org.apache.hadoop.util.DiskChecker$DiskErrorException:
Could not find output/spill0.out in any of the configured local directories “ führen Sie den
Knoten erneut aus oder starten Sie die ganze Maschine neu.
21
4 Workflow aus Mahout-Knoten
Im Kapitel 3 beschriebene Knoten sind einzelne Knoten, die die ganze Mahout Aufgabe in
einem einzelnen Knoten ausführen. Angefangen mit dem Kopieren von Daten ins HDFS bis
hin zur Verarbeitung der Daten lokal oder auf einem Cluster.
Auf der einen Seite bieten solche Knoten die Möglichkeit, gewünschte Einstellungen schnell
in einem Knoten vorzunehmen und nur diesen einen Knoten auszuführen, auf der anderen
Seite kann es aufgrund großer Datenmenge, die verarbeitet wird, ziemlich lästig werden z.B.
einzelne Parameter zu ändern und den Algorithmus erneut auszuführen. Denn dadurch werden die Daten wieder ins HDFS kopiert, obwohl sie schon ohnehin auf dem HDFS vorhanden
waren.
Damit ist die Ausführung in einem einzelnen Knoten nicht immer sinnvoll, da man den ganzen
Ablauf neustarten muss und nicht erst ab dem Punkt, an dem sich die Einstellungen geändert
haben. Um diese Einschränkung zu beseitigen wird der ganze Ablauf in mehrere Knoten gesplittet.
4.1 Beschreibung Mahout-Knoten
Die Ausführung beinhaltet 5 Schritte. Diese 5 Schritte entsprechen auch den einzelnen Knoten:
1. Starten von Hadoop
2. Kopieren der Daten ins HDFS
3. Verarbeitung der Daten (z.B. Clustering)
4. Holen der Daten aus HDFS und Übergabe an den nächsten Knoten
5. Stoppen von Hadoop
Durch so eine Aufteilung kann der Ablauf ab einem beliebigen Knoten neugestartet werden,
ohne, dass vorherige Knoten ausgeführt werden. Möchte man beispielsweise die Anzahl der
22
4.1 Beschreibung Mahout-Knoten
Abbildung 4.1: Mahout Workflow
Abbildung 4.2: Konfiguration Start-Knoten
Cluster ändern, so muss eine Änderung beim dritten Knoten vorgenommen werden, damit
werden Knoten 1 und 2 nicht mehr wiederholt ausgeführt, es werden die selben Daten aus
HDFS verwendet, die zuvor übertragen wurden.
Knotenübersicht:
Start (Abbildung 4.2):
Der Benutzer kann Hadoop lokal oder auf einem Cluster starten. Falls Hadoop bereits läuft,
kann angegeben werden, dass dieser Knoten nur als Startknoten verwendet wird, ohne Hadoop zu starten.
Input (Abbildung 4.3):
Beim Input muss eine Datei ausgewählt werden, die ins HDFS übertragen wird. Dieser Kno-
23
4 Workflow aus Mahout-Knoten
Abbildung 4.3: Konfiguration Input-Knoten
ten übergibt dann dem nächsten Knoten die Referenz auf die Daten, so dass die Verarbeitung
im nächsten Knoten stattfinden kann.
Clustering (Abbildung 4.4):
In diesem Knoten kann der Algorithmus ausgewählt und dazu notwenige Parameter wie Anzahl der Cluster, maximale Anzahl der Iterationen gesetzt werden.
Fetch (Abbildung 4.5):
Fetch-Knoten bietet die Möglichkeit, Daten von HDFS auf lokalem Rechner zu speichern
oder die Daten an den nächsten Knoten zu übergeben.
Stop (Abbildung 4.6):
Dieser Knoten kann ausgeführt werden, um Hadoop zu stoppen.
Recommender (Abbildung 4.7):
Bei einem Recommender-Knoten kann die Anzahl der Empfehlungen gesetzt werden.
24
4.1 Beschreibung Mahout-Knoten
Abbildung 4.4: Konfiguration Clustering-Knoten
Abbildung 4.5: Konfiguration Fetch-Knoten
25
4 Workflow aus Mahout-Knoten
Abbildung 4.6: Konfiguration Stop-Knoten
Abbildung 4.7: Konfiguration Recommender-Knoten
26
5 Szenario und Evaluation
In diesem Kapitel wird ein mögliches Szenario vorgestellt, wie der Mahout Knoten in Einsatz
gebracht werden kann. In diesem Szenario wird der Mahout Knoten in ein KNIME Workflow eingebunden. Für die Evaluation wird der standardmäßige Knoten aus KNIME mit dem
Mahout Knoten verglichen.
5.1 Szenario
Es wird ein einfaches Szenario mit einem Clustering Verfahren und einem Klassifikator betrachtet. Ein Klassifikator benötigt 2 Eingangsquellen. Beim ersten Input handelt es sich um
Trainingsdaten, d.h. Daten die bereits klassifiziert wurden, anhand dieser Daten wird der zweite Input, den sogenannten Testdaten, analysiert und klassifiziert. Als letzter Schritt wird das
Ergebnis in einem Diagramm grafisch dargestellt.
Als Clustering Verfahren wird „K-Means“ gewählt, für den Klassifikator empfiehlt sich an
dieser Stelle der „K Nearest Neighbor“ Klassifikator. Warum die Entscheidung auf „K Nearest Neighbor“ fiel, wird im Abschnitt 5.1.2 erläutert.
5.1.1 KNIME K-Means
KNIME besitzt bereits einen Knoten für das Clustern der Daten nach dem K-Means Algorithmus. Abbildungen 5.1 und 5.2 zeigen je den Workflow vor und nach der Ausführung.
Die Trainingsdaten werden über den File Reader Knoten eingelesen und dem K-Means Knoten übergeben. Dieser clustert alle Eingangsvektoren und übergibt gelabelte Vektoren dem K
Nearest Neighbor Knoten. Ein zweiter File Reader Knoten liest die Testdaten ein und leitet
sie ebenfalls an den K Nearest Neighbor Knoten als zweiter Input.
Nach einer erfolgreichen Klassifikation werden die Testdaten über den Bar Chart Knoten im
Diagramm angezeigt.
27
5 Szenario und Evaluation
Abbildung 5.1: KNIME K-Means vor der Ausführung
Abbildung 5.2: KNIME K-Means nach der Ausführung
28
5.1 Szenario
Abbildung 5.3: Mahout K-Means vor der Ausführung
5.1.2 Mahout K-Means
Im Gegensatz zu einem standardmäßigen K-Means Knoten aus KNIME ist der Mahout KMeans Knoten auf die Verarbeitung großer Daten ausgelegt, deswegen besitzt der letzte keine
Eingangskante für z.B. einen File Reader Knoten, da die Daten als Eingabedateien über das
Dialogmenü übergeben werden. Ein File Reader Knoten nimmt bereits beim standardmäßigen K-Means viel Zeit in Anspruch und dies bevor K-Means überhaupt ausgeführt wird, bei
größeren Daten würde die Einlesezeit ins Unermessliche steigen und würde keinen Vorteil
bringen, da die Daten sowieso ins HDFS kopiert werden und der Benutzer sie bereits auf der
eigenen Platte hat. Dies hat zur Folge, dass der Workflow mit dem Mahout Knoten etwas kleiner ausfällt.
Ein weiterer Unterschied ist bei der Ausgabe des Mahout K-Means Knotens zu sehen. Es ist
nicht möglich alle Inputvektoren gelabelt auszugeben, da die Daten wiederum zu groß sind
und der nächste Knoten überlastet wäre. Hilfe an der Stelle verschafft möglichst kleine Ausgabe und dies ist nur möglich, wenn man Zentroide (Schwerpunkte) gelabelt ausgibt. D.h. bei
k gesetzten Clustern verkleinert sich die Ausgabe auf k gelabelte Vektoren.
Besitzt man nur die Zentroide als Trainingsdaten, empfiehlt es sich für die Testdaten zu entscheiden, zu welchem Zentroid der jeweilige Vektor am nähesten liegt, aus diesem Grund
wurde an der Stelle der „K Nearest Neighbor“ Klassifikator verwendet.
Die Testdaten stellen kleine Daten dar. Somit bekommt der Klassifikator nur kleine Daten an
beiden Input-Kanten und führt die Klassifikation wesentlich schneller durch als beim KNIME
K-Means Knoten.
29
5 Szenario und Evaluation
Abbildung 5.4: Mahout K-Means nach der Ausführung
5.2 Evaluation
5.2.1 Einzelinstanz
Um die Performance vergleichen zu können, wird bereits in diesem Kapitel vorgestelltes Szenario verwendet. Es werden die gleichen Daten für zwei Workflows verwendet und für den
Ablauf benötigte Zeit gemessen. Die beiden Workflows unterscheiden sich in der Anzahl der
File Reader Knoten, K-Means Knoten von Mahout benötigt keinen File Reader, und an den
beiden K-Means Knoten, Workflow 1 mit dem K-Means Knoten von KNIME, Workflow 2
mit dem K-Means Knoten von Mahout.
Testumgebung:
• Intel(R) Core(TM) i7-2640M CPU 2.80 GHz
• 2 GB Arbeitsspeicher
• HDD Festplatte
• 10 MB Textdatei für die Testdaten
• 1 MB - 4 GB Textdateien für die Trainingsdaten
• 10 Cluster für K-Means Output
30
5.2 Evaluation
• Maximal 10 Iterationen
Die Test- und Trainingsdaten wurden mit einem Generator erstellt.
Größe
1 MB
10 MB
50 MB
200 MB
500 MB
1 GB
2 GB
4 GB
KNIME K-Means
FR1
FR2
K-Means
0 sec
4 sec 2 sec
5 sec
6 sec 15 sec
15 sec
5 sec 1:15 min
1:10 min
6 sec 5:19 min
1:47 min
4 sec 12:02 min
3:59 min
5 sec 26:38 min
9:10 min
5 sec 1:08 h
20:46 min 6 sec HS
Größe
1 MB
10 MB
50 MB
200 MB
500 MB
1 GB
2 GB
4 GB
Mahout K-Means
FR
K-Means KNN
3 sec 2:01 min
1 sec
4 sec 2:06 min
1 sec
4 sec 2:31 min
1 sec
5 sec 3:53 min
0 sec
5 sec 6:56 min
0 sec
5 sec 11:18 min 1 sec
4 sec 20:50 min 0 sec
3 sec 42:21 min 2 sec
KNN
13 sec
3:40 min
20:41 min
1:41:06 h
HS
HS
HS
HS
Gesamt
19 sec
4:06 min
22:16 min
1:47:41 h
HS
HS
HS
HS
Gesamt
2:05 min
2:11 min
2:36 min
3:58 min
7:01 min
11:24 min
20:54 min
42:26 min
FR - File Reader vor dem K Nearest Neighbor Knoten (Testdaten Mahout)
FR1 - File Reader vor dem K-Means Knoten (Trainingsdaten KNIME)
FR2 - File Reader vor dem K Nearest Neighbor Knoten (Testdaten KNIME)
HS - Java Heap Space Overflow
KNN - K Nearest Neighbor
Tabelle 5.1: Vergleich K-Means KNIME und Mahout (Laufzeiten)
Tabelle 5.1 zeigt die Ausführungszeiten beider Workflows mit der jeweiligen Größe der
Testdaten in der ersten Spalte. Dabei wurde nur die Zeit für der Verarbeitung betrachtet, d.h.
die Zeit zwischen dem Starten und Beenden eines Workflows und nicht die, die für das Konfigurieren eines Knotens benötigt wurde. Denn z.B. der File Reader Knoten benötigt bereits
bei der Konfiguration einer Datei, die größer als 50 MB ist, einige Minuten, um die Datei
einzulesen. Dies würde dann gegen den K-Means Knoten von KNIME sprechen, da dieser
die Daten vom File Reader übergeben bekommt. Die Testdaten haben eine geringe Größe und
benötigen bei beiden Workflows etwa die gleiche Zeit für das Einlesen, da sie Daten für den
K Nearest Neighbor Knoten liefern.
31
5 Szenario und Evaluation
Abbildung 5.5: K-Means Java heap space overflow
Die beiden File Reader Knoten (FR2 vom K-Means KNIME Knoten und FR vom K-Means
Mahout Knoten) benötigen etwa die gleiche Zeit, da sie in beiden Fällen die gleiche Funktion
erfüllen. FR1 ist im Workflow mit dem Mahout Knoten nicht vorhanden und ist somit nur bei
kleinen Daten vernachlässigbar.
Der Vorteil für den K Nearest Neighbor Knoten bei Mahout, dass dieser höchstens 2 Sekunden für die Verarbeitung braucht, liegt, wie im Abschnitt 5.1.2 beschrieben, daran, dass nur
die Zentroide an diesen übergeben werden und nicht der ganze Input gelabelt von K-Means.
Bei einer Dateigröße bis 10 MB ist der Overhead für das Starten und Stoppen von Hadoop so
groß, dass es an der Stelle vorteilhafter ist den standardmäßigen K-Means Knoten von KNIME zu benutzen.
Bei 500 MB bekommt der K Nearest Neighbor Knoten ein Java Heap Space Overflow Problem. Obwohl K-Means mit den Dateien solcher Größe zurechtkommt, scheitert es am nächsten Knoten. Dabei ist die Verarbeitung mit dem Mahout Knoten nicht nur schneller, sondern
überhaupt möglich.
Eine 4 GB große Datei kann auch der K-Means KNIME Knoten nicht mehr bewältigen, Java
Heap Space Overflow lautet wieder die Fehlermeldung (Abbildung 5.5). Mit einer Gesamtlaufzeit von 42:26 min ist die Verarbeitung derselben Datei im Workflow mit dem Mahout
Knoten erfolgreich abgeschlossen.
32
5.2 Evaluation
Die Entscheidung für die Verarbeitung zwischen den beiden Knoten lässt sich anhand der
Größe der Trainingsdaten klären. Nur die Laufzeit der beiden K-Means Knoten zu messen
und zu vergleichen macht wenig Sinn, da diese unterschiedliche Ausgaben haben. Wenn im
Workflow mit dem KNIME K-Means Knoten bei kleinen Daten die Laufzeit für den File Reader vernachlässigbar ist, so beträgt diese Zeit bereits bei 200 MB fast 1/3 der Gesamtlaufzeit
im Workflow mit dem Mahout Knoten.
In jedem Durchgang wurde der Workflow entweder abgebrochen oder mit einer bestimmten
Gesamtlaufzeit und zu verarbeitenden Dateigröße erfolgreich beendet. Abbildung 5.2.1 zeigt
die durchschnittliche Menge an MB, die innerhalb einer Minute verarbeitet wurde. Rote Linie
stellt den Workflow mit dem Mahout Knoten, blaue Linie den mit dem KNIME Knoten dar.
Der höchste Wert beim KNIME Knoten konnte mit 1 MB in 19 sek. erreicht werden, dies
entspricht etwa 3.16 MB/min. Danach hat die durchschnittliche Menge bei den Tests abgenommen und endete mit dem 4-ten Durchlauf mit einer Dateigröße von 200 MB.
Die durchschnittliche Menge im Workflow mit dem Mahout Knoten pro Minute stieg mit der
wachsenden Größe der Daten bis 2 GB. Bei knapp über 2 GB wäre ein Hochpunkt zu erwarten. Danach nahm die Menge pro Minute langsam ab. Z.B bei einer Verdoppelung der
Datenmenge von 2 GB auf 4 GB ist die Geschwindigkeit nur um fast 2 MB/min gefallen.
33
5 Szenario und Evaluation
Durchschnittlich verarbeitete Größe / Minute
100
90
80
70
Mahout Knoten
KNIME Knoten
MB/min
60
50
40
30
20
10
3.16
0
1 200 500
1024
2048
Dateigröße in MB
4096
Bemerkung: Die Evaluation wurde mit dem K-Means-Knoten durchgeführt, da die
Aufteilung des Knotens (in Start-, Input-, Clustering- und Fetch-Knoten) keine relevante
Änderung mit sich bringt. Diese Knote führen die gleichen Aufgaben durch und übergeben
die Ergebnisse weiter an den nächsten Knoten. Die Zeiten für die Ausführung werden in der
Tabelle 5.2 gegenübergestellt.
Größe
1 GB
2 GB
4 GB
Start
45 sec
45 sec
46 sec
Mahout K-Means vs. Mahout Workflow
Input
Clustering Fetch Stop Gesamt
1:14 min 10:08 min 8 sec 1 sec 12:16 min
2:26 min 17:32 min 9 sec 1 sec 20:53 min
6:20 min 33:50 min 9 sec 1 sec 40:20 min
K-Means
11:18 min
20:50 min
42:21 min
Tabelle 5.2: Vergleich K-Means Mahout und Mahout Workflow (Laufzeiten)
34
5.2 Evaluation
5.2.2 Cluster
Die Verarbeitung der Daten kann nicht nur auf einem Rechner stattfinden, sondern auf
mehrere Knoten in einem Cluster verteilt werden. Als Cluster wird hier zum Vergleich noch
ein Rechner mit folgenden Werten und Testdaten zu der vorherigen Maschine hinzugefügt:
• AMD Phenom II X4 945 3 GHz
• 4 GB Arbeitsspeicher
• HDD Festplatte
• Netzwerkkarte mit 1 Gbit/s
• 10 MB Textdatei für die Testdaten
• 1 GB - 16 GB Textdateien für die Trainingsdaten
• 10 Cluster für K-Means Output
• Maximal 10 Iterationen
Daraus ergibt sich ein kleines Netzwerk aus insgesamt 2 Maschinen. Als Master wird die
gleiche Maschine aus Abschnitt 5.2.1 verwendet. Die zweite Maschine wird in diesem Fall
als Slave eingesetzt.
Einzelinstanz K-Means
Größe FR
K-Means
1 GB
5 sec 11:18 min
2 GB
4 sec 20:50 min
4 GB
3 sec 42:21 min
8 GB
3 sec 1:27:47 h
16 GB 5 sec 2:53:42 h
KNN
1 sec
0 sec
2 sec
2 sec
1 sec
Gesamt
11:24 min
20:54 min
42:26 min
1:27:51 h
2:53:48 h
Cluster K-Means
FR
K-Means KNN
5 sec 09:35 min 1 sec
5 sec 16:44 min 1 sec
5 sec 30:45 min 1 sec
4 sec 1:06:38 h 1 sec
4 sec 2:12:08 h 1 sec
Gesamt
09:41 min
16:50 min
30:51 min
1:06:43 h
2:12:13 h
FR - File Reader vor dem K Nearest Neighbor Knoten (Testdaten Mahout)
KNN - K Nearest Neighbor
Tabelle 5.3: Vergleich K-Means Mahout Einzelinstanz und Cluster
Wie man aus der Tabelle 5.3 ablesen kann, sind bereits bei der kleinst gewählten Menge von
1 GB Größe deutlich bessere Ergebnisse bei der Durchlaufzeit in einem Cluster zu
beobachten. Die ganzen Daten müssen zwar über’s Netzwerk auf alle Rechner übertragen
werden, doch die Verteilung der Aufgaben auf mehrere Prozessorkerne bringt eine schnellere
Verarbeitung und verkürzt somit auch die Gesamtlaufzeit. Bei 4 GB z.B. ist die
Durchlaufzeit um ca. 25% schneller.
35
5 Szenario und Evaluation
Durchschnittlich verarbeitete Größe / Minute
Einzelinstanz
Cluster
130
MB/min
120
110
100
90
1
2
4
8
Dateigröße in GB
16
Abbildung 5.6: Verarbeitungsgeschwindigkeit Einzelinstanz und Hadoop Cluster
36
5.2 Evaluation
Abbildung 5.6 stellt den Vergleich zwischen einer einzelnen Maschine (blau) und einem
Cluster aus zwei Maschinen (rot) dar. Der starke Abfall der Performanz bei 8 GB wird durch
eine zusätzliche Auslastung der Rechner verursacht, was wiederum zeigt, dass die Leistung
der einzelnen Maschinen von großen Bedeutung ist.
Insgesamt betrachtet ist eine deutliche Steigerung der Performanz im Gegensatz zu einer
Maschine zu sehen.
37
6 Schlussbetrachtung
6.1 Ergebnisse dieser Arbeit
In dieser Bachelorarbeit konnte ich mein im Studium erlerntes Wissen in der Entwicklung
des Projektes anwenden und vertiefen. Angefangen mit der Planung des gesamten Ablaufes
über Programmierung bzw. einer Weiterentwicklung eines bestehendes Projektes bis hin zum
kontinuierlichen Testen und der Evaluation des Endergebnisses.
Im Laufe der Arbeit bin ich auf einige Schwierigkeiten gestoßen, die ich mit Hilfe meiner
Ansprechpartner (Betreuer), beseitigen konnte.
Obwohl das Ergebnis dieser Arbeit nicht die ultimative Lösung für alle Algorithmen aus
Mahout ist, sehe ich das Projekt als erfolgreich an, da dieses die Möglichkeit bietet, KNIME
und Mahout zu verbinden und dadurch das Arbeiten mit Mahout den KNIME Nutzern zu
realisieren.
6.2 Ausblick
Der Mahout-Knoten stellt bereits eine Schnittstelle zwischen Mahout und KNIME dar, es ist
aber genauso möglich weitere Knoten zu erstellen. Der erste Grund warum es nicht nur einen
Mahout-Knoten für alle Algorithmen gibt, ist, dass die Eingabe unterschiedlich sein kann,
aber auch die Ausgabe bei den meisten Algorithmen auf eine andere Art und Weise
ausgelesen werden muss. Ein weiterer Grund ist die Weitergabe der Daten innerhalb eines
Workflows, denn auch hier ist der Entwickler für die Weitergabe der Daten, also wie und
welche Daten weitergeleitet werden, verantwortlich. Zusätzlich müssen Entscheidungen
getroffen werden, welche Einstellungen der Benutzer für den jeweiligen Knoten vornehmen
darf.
In dieser Arbeit vorgestellte Clustering Verfahren und Recommendation können noch
zusätzlich um Klassifikatoren erweitert werden. Dabei handelt es sich um mehrere
Klassifikatoren aus der Mahout Sammlung.
38
7 Anhang
Beiliegend zu dieser Ausarbeitung ist eine DVD mit der virtuellen Maschine verfügbar.
Diese enthält unter ’Documents’ die Entwicklungsumgebung mit dem Quellcode, die
KNIME-Umgebung und die Beispieldaten auf dem Desktop.
39
Literaturverzeichnis
[1] KNIME.com AG, 2013. CTAN: http://www.knime.org.
[2] Cheng-Tao Chu, Sang Kyun Kim, Yi-An Lin, Yuan Yuan Yu, Gary Bradski, Andrew Y.
Ng, and Kunle Olukotun. Map-Reduce for Machine Learning on Multicore.
[3] Actian Corporation. Pervasive partner, 2013. CTAN:
http://bigdata.pervasive.com/Partners/KNIME.aspx.
[4] J. Deanl and S. Ghemawat.
MapReduce - Simplified Data Processing on Large Clusters. San Francisco, USA,
2004.
[5] The Apache Software Foundation. Hdfs users guide, 2012. CTAN:
http://hadoop.apache.org/common/docs/current/hdfs_user_guide.html.
[6] The Apache Software Foundation. K-means clustering, 2013. CTAN: https:
//cwiki.apache.org/confluence/display/MAHOUT/K-Means+Clustering.
[7] Maciej Niemczyk. Entwurf und Implementierung eines Verfahrens zur Analyse
komplexer Daten insbesondere auf strukturelle Ähnlichkeit. pages 46–47, 2011.
[8] Michael G. Noll, 2013. CTAN: http://www.michael-noll.com/tutorials/
running-hadoop-on-ubuntu-linux-multi-node-cluster/.
[9] Sean Owen, Robin Anil, Ted Dunning, and Ellen Friedman. Mahout In Action. 2011.
[10] Paul Levi und Ulrich Rembold. Einführung in die Informatik für Naturwissenschaftler
und Ingenieure. (4), 2003.
40
Herunterladen