Bericht
Transcription
Bericht
Prof. Dr. Ingo Claßen Studiengang Wirtschaftsinformtik FB Informatik, Kommunikation und Wirtschaft Projektbericht Titel Einführung in die Algorithmen k-Means, Bayes und Recommender von Mahout Autoren Erik Struck Nicolas Welitzki Inhaltsverzeichnis Inhaltsverzeichnis Inhaltsverzeichnis ............................................................................................... II Abbildungsverzeichnis ....................................................................................... III Tabellenverzeichnis ........................................................................................... IV 1 Einleitung ....................................................................................................... 1 1.1 Motivation ................................................................................................ 1 1.2 Zielstellung der Arbeit .............................................................................. 1 1.3 Aufbau der Arbeit ..................................................................................... 2 2 Einrichtung der virtuellen Maschine ............................................................... 3 2.1 Installation................................................................................................ 3 2.1.1 Netzwerkkonfiguration ..................................................................... 8 2.1.2 Hadoop .......................................................................................... 11 2.1.3 Mahout .......................................................................................... 13 2.2 Konfiguration für voll-verteilten Clusterbetrieb ....................................... 14 2.3 Herausforderungen bei der Installation .................................................. 15 3 Algorithmen von Mahout .............................................................................. 17 3.1 Clusteranalyse am Beispiel von k-Means .............................................. 17 3.1.1 Beispiel k-Means Verfahren mit Reuters Nachrichtensammlung... 20 3.1.2 Ergebnisse der k-Means Verarbeitung .......................................... 22 3.2 Klassifikation am Beispiel von Bayes ..................................................... 23 3.2.1 Beispiel Bayes mit 20 Newsgroups Beispieldaten ......................... 25 3.2.2 Beispiel Bayes mit Wikipedia Daten .............................................. 27 3.2.3 Ergebnisse der Bayes Beispiele .................................................... 29 3.3 Empfehlungen am Beispiel von Recommender ..................................... 30 3.3.1 Nutzerbasierte Recommender....................................................... 31 3.3.2 Gegenstandsbasierte Recommender ............................................ 33 3.3.3 Beispiel Recommender mit Grouplens Datenbank für Filmbewertungen ........................................................................... 35 3.3.4 Ergebnisse der Recommender Verarbeitung ................................ 37 3.4 Herausforderungen im Betrieb ............................................................... 38 4 Fazit ............................................................................................................. 41 Literaturverzeichnis ........................................................................................... VI Anhang ............................................................................................................ VIII A Konfiguration für voll-verteilten Clusterbetrieb ...................................... VIII B Beschreibung zu den komprimierten virtuellen Maschinen ..................... XI II Abbildungsverzeichnis Abbildungsverzeichnis Abbildung 1: VM-Einstellungen I ........................................................................ 3 Abbildung 2: VM-Einstellungen II ....................................................................... 4 Abbildung 3: Installations-Auswahl ..................................................................... 4 Abbildung 4: Softwarepakete.............................................................................. 5 Abbildung 5: Sicherheitseinstellungen ................................................................ 6 Abbildung 6: VM-Netzwerkkonfiguration ............................................................ 8 Abbildung 7: YaST-Netzwerkeinstellungen I ...................................................... 9 Abbildung 8: YaST-Netzwerkeinstellungen II ..................................................... 9 Abbildung 9: YaST-Netzwerkeinstellungen III .................................................. 10 Abbildung 10: Hadoop-Befehlsoptionen ........................................................... 12 Abbildung 11: Mahout-Befehlsoptionen ............................................................ 14 Abbildung 12: Arbeitsweise eines Klassifikator-Systems, s. S. 233 Owen u.a. 2012 ........................................................................................................ 23 Abbildung 13: Mahout-Wiki, k-Means Tutorial .................................................. 40 III Tabellenverzeichnis Tabellenverzeichnis Tabelle 1: Hostnamen ...................................................................................... 10 Tabelle 2: Hosttabelle ....................................................................................... 11 Tabelle 3: Durchführung k-Means .................................................................... 21 Tabelle 4: Ergebnis k-Means ............................................................................ 22 Tabelle 5: Durchführung Bayes 20 Newsgroups .............................................. 26 Tabelle 6: Durchführung Bayes Wikipedia ....................................................... 28 Tabelle 7: Ergebnis Bayes 20Newsgroups ....................................................... 29 Tabelle 8: Ergebnis Bayes Wikipedia ............................................................... 29 Tabelle 9: Durchführung Recommender .......................................................... 36 Tabelle 10: Ergebnis Recommender ................................................................ 37 IV 1. Einleitung 1 Einleitung Heutige Unternehmen müssen immer größere Datenmengen - Big Data - verarbeiten und auswerten. Eine Technik, die die Verarbeitung in vernetzten Hochleistungsclustern ermöglicht, ist das Hadoop Framework, während das Apache Mahout-Projekt geeignete Algorithmen für die Auswertung bereitstellt. Im Rahmen dieser Arbeit sollen drei Algorithmen vorgestellt und angewendet werden. Zudem wird Grundlagenwissen für die Einrichtung und Konfiguration eines mit Hadoop voll-verteilten Clusterbetriebs aufgebaut. Das Handling in Betrieb und Einrichtung sowie Ergebnisse, die Rückschlüsse auf die Performance der Algorithmen zulassen, werden dokumentiert. . 1.1 Motivation Die Bearbeitung von Daten mit statistischen Verfahren und Methoden kann bereits bei relativ kleinen Datensätzen eine lange Zeit in Anspruch nehmen. In der Vergangenheit existierten im Hardwarebereich natürliche Beschränkungen bei der Festplattenkapazität. Mittlerweile ist die Speicherkapazität jedoch so stark gestiegen, dass relativ einfach Datenmengen im Tera- und Petabyte-Bereich erreicht werden. Die Unternehmen machen von diesen Möglichkeiten regen Gebrauch und speichern eine Vielzahl von Daten für einen möglichst langen Zeitraum ab. Big Data gilt als die goldene Fundgrube für Informationen in Unternehmen. Wie bereits zu Beginn des Abschnitts erwähnt, steigt die Durchführungsdauer mit der Größe der Datenmengen. Schon bei wenigen Gigabyte-Daten kann eine solche Durchführung Stunden dauern, je nach dem welcher Algorithmus eingesetzt wird. Apache Mahout hat den Anspruch die Bearbeitungsdauer von Big Data mithilfe beliebig skalierbarer Rechenverteilung zu minimieren. 1.2 Zielstellung der Arbeit Zielstellung dieser Arbeit ist es, drei Implementierungen von Algorithmen jeweils für Clusteranalysen, Klassifikation und Empfehlungen des Mahout Frameworks zu beschreiben und anhand von Testdaten anzuwenden. Dabei wird auch auf die Einrichtung der virtuellen Maschinen mit Mahout und Hadoop und die Einrichtung sowie Konfiguration der Cluster-Infrastruktur eingegangen. 1 1. Einleitung Diese Arbeit soll zum Wissensaufbau bezüglich der praktischen Arbeit mit Hadoop und Mahout verwendet werden. Dabei liegt der Fokus auf der Einrichtung einer lauffähigen Cluster-Umgebung und der Durchführung dreier implementierter Algorithmen inklusive deren Erläuterung. Da diese Arbeit als Grundlage für nachfolgende wissenschaftliche Projekte dienen soll, sind viele Passagen sehr detailliert und ausführlich beschrieben. 1.3 Aufbau der Arbeit Diese Arbeit teilt sich in drei Teile auf. Im ersten Teil wird die Einrichtung und Konfiguration der virtuellen Maschinen beschrieben. Im theoretischen Teil der Arbeit – dem zweiten Teil – gehen wir auf die Grundlagen dreier ausgewählter implementierter Algorithmen in Mahout ein. Im praktischen Teil fassen wir die Ergebnisse der Durchführung der Algorithmen mit geeigneten Testdaten zusammen. Die Arbeit endet schlussendlich mit einem Fazit. 2 2. Einrichtung der virtuellen Maschine 2 Einrichtung der virtuellen Maschine 2.1 Installation In diesem Kapitel wird die Installation und Einrichtung der virtuellen Maschine (VM) beschrieben. Das Hadoop-Cluster soll auf den Rechnern des Netzwerk-Labors der HTW Berlin eingerichtet werden. Die Rechner sind Intel Core i7-2600 3.4 GHz und 16 GB Arbeitsspeicher ausgestattet. Auf der Partition D stehen uns durchschnittlich 700 GB Festplattenspeicher zur Verfügung. Auf den Rechnern sind bereits VMWare Player vorinstalliert. Damit dabei keine Probleme mit der Kompatibilität oder andere Probleme auftreten, verwenden wir auf jedem Rechner eine exakte Kopie der VM. Lediglich der Hostname muss konfiguriert werden. Außerdem kommt erschwerend hinzu, dass die im Rahmen dieses Projekts getesteten Virtualisierungssysteme VirtualBox und VMWare nicht kompatibel zueinander sind. Das heißt, dass eine VM die mit VirtualBox erstellt wurde, nicht von einem VMWare-System eingespielt und verwendet werden kann oder umgekehrt. Als Betriebssystem kommt openSUSE-11.4 als Minimalinstallation zum Einsatz. Bei der Einrichtung der VM ist darauf zu achten, dass wenigstens 1024mb Arbeitsspeicher zugewiesen werden. Vor dem initialen Starten der VM muss unter den Einstellungen von VMWare das Floppy-Laufwerk mit der autoinst.flp Datei und das CDLaufwerk mit der autoinst iso- Abbildung 1: VM-Einstellungen I Datei entfernt werden. Wird dies nicht getan, führt VMWare eine vorkonfigurierte Installation von Linux durch, womit eine Minimalinstallation nicht möglich wird. Es ist möglich vor dem Fertigstellen der virtuellen Maschine die 3 2. Einrichtung der virtuellen Maschine Hardwarekonfiguration zu ändern, dabei kann bereits das Floppy Laufwerk entfernt, bzw. das Image aus diesem herausgenommen werden. Ist die VM erstellt, generiert VMWare jedoch noch ein zusätzliches CD/DVD und Floppy Laufwerk mit den jeweiligen autoinst Images, diese müssen ebenfalls herausgenommen werden. Abbildung 2: VM-Einstellungen II Beim Starten der VM ist es dann möglich, eine neue Installation zu wählen. Da die VM möglichst wenig Platz benötigen soll, empfiehlt sich eine Minimalinstallation ohne grafische Oberfläche. Bei OpenSUSE-11.4 ist das durch die Option ”Minimale Serverauswahl (Textmodus)” möglich. Frei nach den Bedürfnissen der Anwendung ist der konfigurierbare Punkt Partitionierung. Hier muss bedacht werden, wie groß die zu verarbeiAbbildung 3: Installations-Auswahl tenden Daten sind und wie diese 4 2. Einrichtung der virtuellen Maschine unter den Hadoop-Clustern aufgeteilt werden. Im Menü der vorinstallierten Software sollte unter der Rubrik Entwicklung Grundlegende Entwicklungssoftware und Java-Entwicklung ausgewählt werden, damit bereits Java fertig installiert vorliegt. Abbildung 4: Softwarepakete 5 2. Einrichtung der virtuellen Maschine Die Firewall muss für den späteren Betrieb von Hadoop deaktiviert werden und SSH kann gleich mit mitinstalliert werden. Abbildung 5: Sicherheitseinstellungen Nach dem Booten der VM kann ein zweckmäßiger Host- und Domänenname eingegeben werden. Für den Anfang reicht es vollkommen, einen Master-Host und nbeliebige Slave-Hosts zu erstellen. Von der Grundinstallation unterscheiden sich diese nicht, sodass es möglich ist, nach der Installation von Hadoop und Mahout die VM zu clonen und nachträglich die Hostnamen und Netzwerkeinstellungen entsprechend neu zu konfigurieren. Nach der Installation von OpenSuSe sollten die benötigten Programme und gegebenenfalls Komfortfunktionen über YaST installiert werden. Es empfehlen sich folgende Programme: man, man-pages, vim, und vim-enhanced. Im letzten Schritt vor der eigentlichen Installation von Mahout und Hadoop sollte die .bashrc angepasst werden. Damit dies möglich wird, muss die Datei zum richtigen Ort im Dateisystem kopiert werden: „cp /etc/skel/.bashrc ~“. Diese Konfigurationsdatei benötigen die Benutzer, die mit Mahout und Hadoop arbeiten möchten. Die Tilde entspricht dem Homeverzeichnis des aktuellen Benutzers. Folgende Variablen müssen - sofern nicht bereits vorhanden - in der .bashrc ergänzt werden (vi ~/.bashrc): export HADOOP_HOME=</opt/hadoop-0.20.203.0> export HADOOP=$HADOOP_HOME/bin export HADOOP_CONF_DIR=</opt/hadoop-0.20.203.0/conf> export MAHOUT_HOME=</opt/mahout-distribution-0.6> export MAHOUT=$MAHOUT_HOME/bin export PATH=$HADOOP:$MAHOUT:$PATH Auf die korrekte Schreibweise ist zu achten, damit Mahout und Hadoop richtig funktionieren. Die Kleiner- und Größerzeichen (<,>) dienen lediglich als Platzhalter 6 2. Einrichtung der virtuellen Maschine für den Ort, wo Hadoop und Mahout entpackt wurden. Mit Hilfe der Anpassung der .bashrc werden Mahout und Hadoop an jedem beliebigen Ort im Dateisystem innerhalb der Konsole aufrufbar. Der Parameter HADOOP_CONF_DIR gibt das Konfigurationsverzeichnis für Hadoop an, welches von Mahout im späteren Betrieb benötigt wird. Der Betrieb von Hadoop ist unter einem Root-Nutzer zurzeit nicht möglich. Es muss also ein Benutzer angelegt werden, der später Hadoop und Mahout ausführen soll. Dabei muss der Schritt mit der Anpassung der Konfigurationsdatei .bashrc wie oben erwähnt wiederholt werden. 7 2. Einrichtung der virtuellen Maschine 2.1.1 Netzwerkkonfiguration An dieser Stelle wird die Netzwerkkonfiguration für die erfolgreiche Einrichtung der Testumgebung beschrieben. Abbildung 6: VM-Netzwerkkonfiguration Die lokale Maschine und die VMs sollten im gleichen Subnetz liegen, was das Aufrufen der Weboberflächen des JobTrackers und TaskTrackers erleichtert. Andernfalls muss ein entsprechendes Routing eingeführt und Firewall-Regeln angepasst werden. Mit dem Befehl „yast“ können unter dem Menüpunkt Network Devices, Network Settings die Einstellungen für IP-Adresse, DNS und DHCP eingerichtet werden. Mithilfe der F4-Taste öffnet sich der Editiermodus. In Rahmen dieser Arbeit verwenden wir eine dynamische Adressverwaltung mittels DHCP. In den Konfigurationsdateien von Hadoop können wir somit feste Rechnernamen eintragen und diese der Hosttabelle auf allen beteiligten Rechnern (/etc/hosts/) hinzufügen. 8 2. Einrichtung der virtuellen Maschine Abbildung 7: YaST-Netzwerkeinstellungen I Die Einstellungen im Reiter Global Options können aus der Abbildung entnommen werden. IPv6 haben wir deaktiviert. Abbildung 8: YaST-Netzwerkeinstellungen II Ebenfalls auf jedem beteiligten Rechner müssen Hostname und Domäne konfiguriert werden. Dies kann im Reiter Hostname/DNS durchgeführt werden. 9 2. Einrichtung der virtuellen Maschine Wir haben uns für die folgende Benennung entschieden: Hostname Domain mahout-master mahout mahout-slave-01 mahout mahout-slave-02 mahout mahout-slave-nn… mahout Tabelle 1: Hostnamen Abbildung 9: YaST-Netzwerkeinstellungen III Die Registerkarte Routing kann ignoriert werden. Damit die verschiedenen Geräte mittels Namensauflösung untereinander kommunizieren können, muss die Hosttabelle nun für jedes einzelne Gerät angepasst werden. Da wir uns für DHCP entschieden, kann es sein, dass wenn die Geräte in einem sich ständig verändernden Netzwerkumfeld integriert werden, auch ständig neue IP Adressen zugewiesen bekommen. Wenn das der Fall ist, sollten feste IP-Adressen vergeben werden. Befinden sich die Geräte jedoch in einem „statischen“ Netzwerk, dann behalten sie für gewöhnlich ihre IP-Adressen und es kommt nur selten zu Änderungen. So oder so müssen entsprechend die IP-Adressen der Geräte ermittelt werden (z.B. mit dem Befehl ifconfig) und in den Hosttabellen der Geräte mithilfe des Befehls „vi /etc/hosts“ gespeichert werden. 10 2. Einrichtung der virtuellen Maschine Die Zeilenstruktur sieht dabei wie folgt aus: #IP-Adresse Full-Qualified-Hostname Short-Hostname 127.0.0.1 localhost 192.168.2.101 mahout-master.mahout mahout-master 192.168.2.102 mahout-slave-01.mahout mahout-slave-01.mahout usw… Tabelle 2: Hosttabelle Ändern sich die IP-Adressen der Geräte, so müssen lediglich hier Änderungen vorgenommen werden. Wenn alles richtig konfiguriert ist, sollten alle beteiligten Rechner untereinander erreichbar sein. Mit dem Befehl ping kann dies überprüft werden. 2.1.2 Hadoop Nach Einrichtung und Konfiguration der VMs und des Netzwerks wird nun die Installation von Apache Hadoop beschrieben. Vor dem Download und Entpacken der Datei sollte feststehen, in welchem Verzeichnis Hadoop installiert werden soll und welche Versionen von Hadoop und Mahout verwendet werden. In dieser Arbeit kommen Hadoop 0.20.203 und Mahout 0.6 zum Einsatz, da diese Versionen miteinander kompatibel sind. wget http://apache.easy-webs.de/hadoop/common/stable/hadoop-0.20.203.0rc1. tar.gz tar xvfz hadoop-0.20.203.0rc1.tar.gz hadoop 11 2. Einrichtung der virtuellen Maschine Hadoop sollte von jedem Ort im Dateisystem aufrufbar sein. Dabei sollte Folgendes ausgegeben werden: Abbildung 10: Hadoop-Befehlsoptionen Im nächsten Schritt ist zu prüfen, ob die aktuelle VM per ssh ohne Passwortnachfrage erreichbar ist. Mit folgendem Befehl kann dies geprüft werden „ssh localhost“. Wenn localhost nicht ohne Passwort erreicht werden kann, ist Folgendes auszuführen, um die Berichtigung zum passwortfreien Zugriff zu hinterlegen: $ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys Es wird mit Hilfe von dem Programm ssh-keygen ein Schlüssel erzeugt und darauf der Inhalt einer zusätzlich erzeugten Datei in der Datei authorized_keys angehängt. In dieser Datei stehen alle erlaubten Schlüssel und die dazugehörigen Hostnamen (auch die anderer Maschinen), um auf das Gerät zuzugreifen. 12 2. Einrichtung der virtuellen Maschine Für den Pseudo-verteilten Betrieb von Hadoop auf einem Rechner sind die Dateien core-site.xml, hdfs-site.xml und mapred-site.xml im conf Ordner von Hadoop wie folgt anzupassen: conf/core-site.xml: <configuration> <property> <name>fs.default.name</name> <value>hdfs://localhost:9000</value> </property> </configuration> conf/hdfs-site.xml: <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration> conf/mapred-site.xml: <configuration> <property> <name>mapred.job.tracker</name> <value>localhost:9001</value> </property> </configuration> Mit dem Befehl hadoop namenode -format wird das HDFS vorbereitet und in einem neuen verteilten Dateisystem formatiert. Schlussendlich kann mit dem Befehl „start-all.sh“ überprüft werden, ob die Hadoop-Dienste ordnungsgemäß gestartet werden konnten. Die Webinterfaces von Hadoop sollten nun erreichbar sein: JobTracker unter <IP Adresse>:50030 und Namenode unter <IP Adresse>:50070 2.1.3 Mahout Mahout wird ähnlich wie Hadoop installiert. Die gepackte Datei der zur Hadoop kompatiblen Version muss dazu heruntergeladen und entpackt werden: 13 2. Einrichtung der virtuellen Maschine wget http://apache.mirror.iphh.net//mahout/0.6/mahout-distribution-0.6.tar.gz tar zxvf mahout-distribution-0.6.tar.gz mahout Dabei sollte folgende Ausgabe erscheinen. Abbildung 11: Mahout-Befehlsoptionen An dieser Stelle können bereits die verschiedenen nutzbaren Algorithmen von Mahout entdeckt werden. An dieser Stelle sei bereits erwähnt, dass wenn ein Befehl in folgender Form ausgeführt wird, Mahout immer(!) ohne Hadoop im Standalone-Betrieb laufen wird: MAHOUT_LOCAL=true. 2.2 Konfiguration für voll-verteilten Clusterbetrieb Für den Clusterbetrieb benötigen wir einen Master-Node, auf dem die Dienste JobTracker und NameNode laufen. Auf den Slave-Nodes hingegen laufen die Dienste DataNode und TaskTracker. Die Hadoop Entwickler empfehlen aus Performancegründen, den JobTracker-Dienst und den Namenode-Dienst auf zwei verschiedenen Rechnern laufen zu lassen. Für den voll-verteilten Clusterbetrieb müssen Änderungen an den Konfigurationsdateien vorgenommen werden, die im Anhang A: Konfiguration für voll-verteilten Clusterbetrieb dokumentiert sind. Diese liegen im Ordner $HADOOP_HOME/conf/ und sind folgende: “mapred-site.xml“, „core-site.xml“, „hdfs-site.xml“ sowie „slaves“, „masters“ und die Hosts-Datei unter „/etc/hosts“. Diese Dateien müssen auf allen VMs, unabhängig ob Master- oder Slave-Node, gleich sein. Mittels Remote 14 2. Einrichtung der virtuellen Maschine Copy können die Konfigurationsdateien von einem System auf die Slave-Nodes kopiert werden. Im letzten Schritt werden per Remote Copy die Schlüssel für das passwortfreie SSH auf die Slave-Nodes verteilt, damit der Master passwortfrei mit den Slaves kommunizieren kann: scp -r <Quelle> <IP SlaveNode>: <Zielverzeichnis> Auf allen Slave-Nodes sollte die ~/.ssh/authorized_keys Datei leer sein und folgendes ausgeführt werden, um einen Schlüssel zu genieren: ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa Von der Master-Node wird der Schlüssel auf alle Slave-Nodes kopiert. cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys scp ~/.ssh/id_dsa.pub mahout-slave-01.mahout:~/.ssh/master.pub Auf allen Slaves wird wiederum Folgendes ausgeführt, um den Schlüssel für die Zugriffsberichtigung bereitzustellen: cat ~/.ssh/master.pub >> ~/.ssh/authorized_keys 2.3 Herausforderungen bei der Installation Wenngleich die Installation von Hadoop und Mahout einfach aussieht, so sind im Rahmen dieser Arbeit Schwierigkeiten aufgetreten, die in diesem Kapitel zusammengefasst sind. Bei Verwendung der zahlreichen Tutorials aus Internet wird ein solides Vorwissen zum Unix-Umfeld vorausgesetzt. Wir mussten uns dieses Vorwissen erst Stück für Stück erarbeiten. Andererseits mangelt es bei den Tutorials teils an Erläuterungen, damit die Tutorials nachvollzogen werden können oder die Qualität der Tutorials ist ungenügend. Vor dem ersten Problem standen wir, als wir die Minimalinstallation von OpenSuse durchführen wollten, aber zu diesem Zeitpunkt aus bis dahin unerfindlichen Grün15 2. Einrichtung der virtuellen Maschine den nur AutoYast Installationen mit der Vollinstallation möglich waren. Leider gibt es keine Einstellmöglichkeiten dafür. Erst ein Workaround – dem nachträglichen Entfernen der autoinst- Dateien – konnte das Problem beheben. Im Kapitel 2.1 ist dies ausführlich beschrieben. Bei der Installation von Mahout und Hadoop standen wir vor dem Problem, das einige den Autoren der Tutorials scheinbar Trivial vorkommenden Befehle nicht erwähnt wurden. Beispielsweise wären wir über einen Hinweis darüber sehr dankbar gewesen, dass die „HOME_“ Umgebungsvariablen eingerichtet werden müssen und wie dies durchgeführt wird. Insbesondere die Tutorials von Mahout scheinen für erfahrene Java-Entwickler in der Softwareentwicklung geschrieben worden zu sein, was die Einarbeitung zusätzlich erschwert hat. So werden für die Einrichtung Programme aus der Softwareentwicklung wie Maven und Ant verwendet, was für den Anfang zunächst ohne Belang, aber verwirrend ist. Bei Mahout genügt es den Ordner im Zielverzeichnis zu entpacken und die Umgebungsvariablen zu setze, Als großes Problem stellt sich heraus, dass nicht alle Versionen von Hadoop mit Mahout kompatibel sind, worauf leider nur in einschlägigen Foren verwiesen wird. Die Mahout Version 0.5 ist kompatibel mit Hadoop 0.20.2 und nicht zu Hadoop 0.20.203.0. Im Gegensatz dazu ist eine Mahout Version höher als Version 0.5 kompatibel zu Hadoop 0.20.203. Die von uns genutzten Versionen Hadoop 0.20.203.0 und Mahout 0.6 sind kompatibel. 16 3. Algorithmen von Mahout 3 Algorithmen von Mahout 3.1 Clusteranalyse am Beispiel von k-Means „Eine Clusteranalyse ist ein Instrument zum Erkennen von Strukturen in einer Menge von Objekten.“ 1 Dabei werden Objekte mit möglichst homogenen Eigen- schaften und Merkmalen zu Gruppen zusammengefasst, sogenannten Clustern. Diese, möglichst ähnlichen Objekte in den Clustern, sollen sich möglichst stark von Objekten, die anderen Clustern zugeordnet werden, unterscheiden. Die Cluster dagegen verhalten sich mit ihren Eigenschaften und Merkmalen möglichst heterogen zueinander. 2 Damit eine Entscheidung über die Zuordnung der Objekte getroffen werden kann, muss die Ähnlichkeit zwischen den Objekten ermittelt werden. Als Maß dafür verwenden wir in diesem Beispiel die euklidische Distanz. Die euklidische Distanz ist ein Distanzmaß (auch genannt Unähnlichkeitsmaß) für metrisch skalierte Merkmale und gibt den Abstand zwischen zwei Punkten an. Neben der gerade beschriebenen einfachen euklidischen Distanz gibt es noch die quadrierte euklidische Distanz, bei der die Abstände quadriert werden. 3 Unter dem Begriff der Clusteranalyse sind verschiedene Verfahren zusammengefasst, die sich im Hinblick auf Wahl eines statistischen Distanzmaßes und eines Gruppierungsverfahren unterscheiden. Wird die Clusteranalyse mit Mahout verwendet, so wird der zu verwendende Algorithmus zu Beginn ausgewählt. Wir verwenden in diesem Beispiel das k-Means-Verfahren, bei welchem für jedes Objekt die euklidische Distanz oder ein anderes ausgewähltes Distanzmaß, zu allen anfänglichen Clusterzentren berechnet wird. Die einzelnen Objekte werden in das Cluster eingeordnet, wo die Distanz zwischen dem Objekt und dem Clusterzent- 1 Hartung 2007, S 443 Vergl. Hartung 2007, S. 443 3 Vergl. Owen u.a. 2012, S. 125-128 2 17 3. Algorithmen von Mahout rum am geringsten ist. Nach erfolgter Zuordnung werden die Clusterzentren neu berechnet. Erst wenn eine der Abbruchbedingungen, wie das Erreichen der maximalen Anzahl der Interaktionen oder unveränderte Clusterzentren, eintritt, beendet der Algorithmus das Zuordnen der Objekte nach den geringsten Distanzen und Neuberechnung der Clusterzentren. Bei Mahout werden die gewünschte Anzahl von Clustern und die maximale Anzahl von Iterationen, als Parameter angegeben. Im Gegensatz zu fuzzy k-Means schließen sich die Cluster bei k-Means gegenseitig aus. Bei fuzzy k-Means sind hingegen überlappende Cluster möglich.4 Wenn der k-Means Algorithmus mit Mahout gestartet werden soll, so muss zu Beginn der Clusteranalyse eine SequenceFile-Datei erstellt werden, die die Vektoren enthalten. Das in Mahout implementierte k-Means Verfahren verarbeitet Vektoren, die Tupel darstellen und numerische Werte beinhalten. So hat beispielsweise der Vektor (1,3 ; 2,1 ; 3,5) den Wert 3, weil er drei Werte beinhaltet. An 1. Stelle hat der Vektor den Wert 2,1 und an 0. Stelle den Wert 1,3. Der Wert des Vektors entspricht somit der Anzahl eines Wortes in dem Text. 5 Im zweiten Schritt werden weitere SequenceFile-Dateien erstellt, die jeweils die initialen Clusterzentren beinhalten. Anschließend wird der k-Means Algorithmus ausgeführt. Als Parameter werden die Pfade zu den SequenceFile-Dateien für die Vektoren und Clusterzentren, sowie der Clusteranzahl und der maximalen Iterationen. Wenn jedoch der –k Parameter für die Anzahl der Cluster nicht gesetzt wird, dann werden zufällig genierte Punkte als Clusterzentren verwendet. 6 In dem folgenden Beispiel zur Reuters-Nachrichtensammlung verwenden wir 20 Clusterzentren. Mithilfe des Lucene Analyser Class wird ein Index aus den Ursprungsdateien erstellt, aus dem im nächsten Schritt die Vektoren erstellt werden. 4 Vergl. Owen u.a. 2012, S. 145- 150 Vergl. Owen u.a. 2012, S. 362 6 Vergl. Mahout Wiki 2011b 5 18 3. Algorithmen von Mahout Nicht verwendet in diesem Beispiel wurde die Methode TF-IDF (term frequencyinverse document frequency), die Wörter anhand von ihrer Bedeutung gewichtet. Somit wird vermieden, dass Füllwörter das Ergebnis beeinflussen und inhaltlich verschiedene Texte aufgrund einer gleichen Füllwörteranzahl als gleich erkannt werden. Ebenfalls nicht verwendet wurde der Algorithmus Latent Dirichlet allocation (LDA), mit welchem gleiche Wörter mit verschiedenen Bedeutungen (z.B. Bank) unterschieden werden können.7 7 Vergl. Mahout Wiki 2011c 19 3. Algorithmen von Mahout 3.1.1 Beispiel k-Means Verfahren mit Reuters Nachrichtensammlung Für die Clusteranalyse mit k-Means verwenden wir die Reuters Nachrichtensammlung Reuters-21568, die in 22 XML-ähnlichen Dateien im SGML Format vorliegen und insgesamt 26,3 MB groß sind. Bis auf die letzte Datei beinhaltet jede der Dateien 1000 Dokumente. In der letzten Datei sind nur 567 Dokumente. Befehle Beschreibung wget http://kdd.ics.uci.edu/databases/reuters21578/reuters21578.tar.gz Download der Beispieldaten tar xzvf reuters 21578.tar.gz Entpacken der Beispieldaten mahout org.apache.lucene.benchmark.utils.ExtractReuters $MAHOUT_HOME/input/kmeans (<- Ordner wo reuters entpackt wurde) $MAHOUT_HOME/input/kmeans/reuters (<- Ordner wo Lucene Index erstellt wird) Umwandlung der Daten in einen Lucene Index MAHOUT_LOCAL=true mahout seqdirectory --input $MAHOUT_HOME/input/kmeans/reuters --output $MAHOUT_HOME/input/kmeans/seqdir/ -c UTF-8 -chunk 5 Beispieldaten im SequenceFile-Format speichern, wobei der Zusatz Mahout_Local= True angibt, dass Mahout im Standalone-Modus arbeitet. MAHOUT_LOCAL=true mahout seq2sparse --input $MAHOUT_HOME/input/kmeans/seqdir/ --output $MAHOUT_HOME/input/kmeans/seq2sparse/ Konvertierung der Daten in Vektoren hadoop fs -put $MAHOUT_HOME/input/kmeans/seq2sparse/tfidf-vectors /hadoop/kmeans/vectors/ Vektoren ins Hadoop Dateisystem schreiben 20 3. Algorithmen von Mahout mahout kmeans --input /hadoop/kmeans/vectors/ --output /hadoop/kmeans/output/ -k 20 --maxIter 10 -c /hadoop/kmeans/clusters k-Means Algorithmus ausführen -c wird von -k überschrieben, normalerweise dient -c der manuellen Angabe von Clustern, -k erzeugt mit Hilfe eines Randomseeds zufällige initiale Cluster) mahout clusterdump –dt sequencefile –d /hadoop/kmeans/vectors/dictionary.file-* -s /hadoop/kmeans/output/clusters-19 –b 10 –n 10 Ergebnis für Cluster 19 auf der Konsole darstellen, indem die Dimensionen der Vektoren in Text umgewandelt werden. Tabelle 3: Durchführung k-Means 21 3. Algorithmen von Mahout 3.1.2 Ergebnisse der k-Means Verarbeitung Die k-Means Verarbeitung wurde von uns mit einer verschiedenen Anzahl von Slaves-Nodes drei Mal ausgeführt. Die Dauer der Verarbeitung ist im Folgenden tabellarisch dargestellt. Beim ersten Durchlauf verwendeten wir eine Slave-Node, wobei auf dem Master ebenfalls ein Slave lief. Im zweiten Durchlauf erhöhten wir die Anzahl der Slaves auf sechs, beim letzten Durchlauf auf 18 Slaves. Anzahl Anzahl Slaves Master 1(+1) 6 18 1 1 1 k-Means 4,46 min 3,32 min 6,53 min Tabelle 4: Ergebnis k-Means Während sich die Dauer der Verarbeitung von der Erhöhung von zwei Slaves auf sechs Slaves um mehr als eine Minute reduzierte, verlängerte sich die Durchlaufzeit bei der Verwendung von 18 Slaves deutlich. Dies lässt sich damit begründen, dass 18 Slaves überdimensioniert sind für die Verarbeitung der ursprünglich insgesamt 26,3 MB großen 22 Daten. 22 3. Algorithmen von Mahout 3.2 Klassifikation am Beispiel von Bayes Die Klassifikation dient dazu Objekte anhand von Merkmalen in bestimmte Kategorien einzuordnen. Es handelt sich hierbei um eine vereinfachte Form der Entscheidungsfindung, die auf bestimmte Fragen die richtigen Antworten geben soll.8 Im Allgemeinen wird bei Mahout in zwei Phasen unterschieden; die Erstellung eines Modells durch einen Lernalgorithmus und das Nutzen des Models, um neue Daten den Kategorien zu zuordnen.9 Abbildung 12: Arbeitsweise eines Klassifikator-Systems aus Owen u.a. 2012, S. 233 In der Abbildung wird der grundsätzliche Aufbau der Verarbeitung eines Klassifizierungssystems dargestellt. Die erste Phase, d.h. der obere Weg, zeigt das Training in dem Klassifizierungsprozess, während der untere Weg, die zweite Phase, neue Beispiele mit Hilfe des Klassifizierungsmodells den Kategorien zuordnet. Dabei ist die Prädiktor- Variable (predictor) die unabhängige Variable und Einflussgröße. Die Zielvariable (target variable) ist die abhängige Variable und wird 8 9 Vergl. Owen u.a. 2012, S. 225 Vergl. Owen u.a. 2012, S. 232 23 3. Algorithmen von Mahout für das Training des Models in Phase 1 verwendet und in Phase 2 mit dem erstellten Model ermittelt.10 Der in Mahout implementierte naive Bayes Algorithmus basiert auf die Bayes’sche Entscheidungsregel und funktioniert mit mathematischen Wahrscheinlichkeiten. Für die Berechnung von mathematischen Wahrscheinlichkeiten wird das BayesTheorem, der Berechnungsvorschrift für die bedingten Wahrscheinlichkeiten, verwendet. 11 In der Praxis eignet sich der Algorithmus um beispielsweise für neue erstellte Artikel auf Wikipedia sogleich geeignete Kategorien auf Grundlage der bisher gelernten Artikel vorzuschlagen. Dazu wird in der Trainingsphase der Inhalt der Daten in Vektoren umgewandelt, die jeweils Pakete von mehreren Wörtern beinhalten. Neben dem Bayes-Algorithmus gibt es noch weitere, die je nach Größe der Daten und der Charakteristika der Daten zum Einsatz kommen. Bayes eignet sich insbesondere für die parallele Verarbeitung von großen textbasierten Daten. Die Methode, um die Daten als Vektoren zu klassifizieren, unterscheidet sich in Abhängigkeit zum gewählten Verfahren der Klassifikation.12 In dem ersten der beiden folgenden Beispiele verwenden wir eine Sammlung von geschätzten Newsgroup Dokumenten, um zunächst ein erstelltes Modell zu trainieren und anschließend zu testen. Im zweiten Beispiel verwenden wir Daten von Wikipedia für die Klassifizierung neuer Artikel. Für beide Beispiele verwenden wir von Mahout mitgelieferte Programme für die Aufbereitung der Daten. 10 Vergl. Owen u.a. 2012, S. 232 f. Vergl. Backhaus u.a. 2011 S. 218 ff. 12 Vergl. Owen u.a. 2012, S. 274 f. 11 24 3. Algorithmen von Mahout 3.2.1 Beispiel Bayes mit 20 Newsgroups Beispieldaten Die Beispieldaten von „20 Newsgroups“ sind eine Sammlung von geschätzten 20.000 Newsgroup Dokumenten, die nach 20 verschiedenen Newsgroups gruppiert und insgesamt 34,1 MB groß sind. Mithilfe der Klassifizierung nach Bayes werden wir ein Modell erstellen, welches ein neues Dokument in eine der 20 Newsgroups einordnen kann. Befehle Beschreibung wget http://people.csail.mit.edu/jrennie/20Newsgroups/20newsbydate.tar.gz Download der Beispieldaten tar xzfv 20news-bydate.tar.gz Entpacken der Beispieldaten MAHOUT_LOCAL=true mahout org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups -p $MAHOUT_HOME/input/bayes/20news-bydate-train -o $MAHOUT_HOME/input/bayes/bayes-train-input -a org.apache.mahout.vectorizer.DefaultAnalyzer -c UTF-8 Konvertierung der Test- und Trainingsdaten: Anstelle des im Buch Mahout in Action angegebenen Text-Analyzer-Algorithmus “StandardAnalyzer”, funktionierte bei uns nur der “DefaultAnalyzer” Algorithmus. hadoop fs -put $MAHOUT_HOME/input/bayes/bayes-train-input /hadoop/bayes/bayes-train-input Daten ins hadoop Dateisystem laden hadoop fs -put $MAHOUT_HOME/input/bayes/bayes-test-input /hadoop/bayes/bayes-test-input Input ins Hadoop Dateisystem schreiben mahout trainclassifier --input /hadoop/bayes/bayes-train-input/ --output /hadoop/bayes/bayes-model/ -type bayes -ng 1 -source hdfs Trainingsmodell erzeugen 25 3. Algorithmen von Mahout mahout testclassifier -m /hadoop/bayes/bayes-model/ -d /hadoop/bayes/bayes-test-input/ -type bayes -ng 1 -source hdfs Test des zuvor erstellten Modelles: Als Ausgabe wird bei Erfolg eine Matrix mit allen richtigen und falschen Klassifikationen angezeigt. Tabelle 5: Durchführung Bayes 20 Newsgroups 26 3. Algorithmen von Mahout 3.2.2 Beispiel Bayes mit Wikipedia Daten Für dieses Beispiel werden Wikipedia xml-Dateien vom 04. April 2012 verwendet, die gepackt 7,77 GB und entpackt 34,8 GB groß sind. Mit Mahout wird ein Programm mitgeliefert, das die Wikipedia-Daten für die Klassifikation aufbereitet. Dafür werden die Daten in Teilpakete, sogenannte Chunks unterteilt. Diese Chunks werden im späteren Verlauf nach Nationen getrennt und dienen der Klassifizierung als Grundlage. Diese ist trainiert vorherzusagen, zu welcher Nation ein zuvor ungesehener Artikel zugeordnet werden könnte. Befehle Beschreibung wget http://download.wikimedia.org/enwiki/latest/enwiki-latest-pagesarticles.xml.bz2 Datei herunterladen und ablegen unter $MAHOUT_HOME/input/bayes/wiki unzip enwiki-latest-pages-articles.xml.bz2 Entpacken, um die xml-Datei zu erhalten mahout wikipediaXMLSplitter -d $MAHOUT_HOME/input/bayes/wiki/enwiki-latest-pages-articles10.xml -o /hadoop/bayes/wiki/chunks -c 64 Xml-Datei in Teilpakete aufteilen: Von Vorteil ist es ein Backup von der xml-Datei zu erstellen, weil sie im weiteren Verlauf versehentlich gelöscht werden kann. mahout wikipediaDataSetCreator -i /hadoop/bayes/wiki/chunks -o /hadoop/bayes/wiki/input -c $MAHOUT_HOME/input/bayes/wiki/country.txt Im nächsten Schritt wird die Wikipedia xml-Datei basierend auf eine Datei, die alle Nationen beinhaltet, in einzelne Dateien aufgeteilt. wget http://svn.apache.org/viewvc/mahout/tags/mahout-0.6/examples/ src/test/resources/country.txt Sollte die country.txt Dateien nicht vorhanden sein, kann sie von hier bezogen werden. 27 3. Algorithmen von Mahout hadoop fs -ls /hadoop/bayes/wiki/input Überprüfung der Erzeugung der Input-Datei mahout trainclassifier -i /hadoop/bayes/wiki/input -o /hadoop/bayes/wiki/model Training der Klassifizierung: Die Modelldateien werden in dem gerade angegebenen Model-Ordner im HDFS bereitgestellt. mahout testclassifier -m /hadoop/bayes/wiki/model -d /hadoop/bayes/wiki/input Im letzten Schritt kann das erstellte Modell getestet werden. Tabelle 6: Durchführung Bayes Wikipedia Der letzte Schritt, dem Testen des trainierten Modells, brach leider bei jedem Versuch mit Fehlern ab. Der Fehler lautete: „Task attempt_201204182055_0001_m_000001_0 failed to report status for 601 seconds. Killing!“. Die Ursache dafür fanden wir leider nicht. Die Vergrößerung der Heap-Size für Map Instanzen und auch für Reduce Instanzen zeigten keine Veränderung. Auch die io.sort Parameter ebenfalls in der Hadoop Konfiguration veränderte nichts. Wir vermuteten die Fehlerursache im Modell und probierten die gesamte Verarbeitung mit dem „neuen“ Bayes Algorithmus aus: TrainNaiveBayes und TestNaiveBayes. 13 Auch hier stießen wir auf die gleichen Probleme in der Umsetzung. 13 Wikipedia Bayes Tutorial verwendet scheinbar einen alten Bayes Algorithmus: http://mail-archives.apache.org/mod_mbox/mahout-user/201112.mbox/%3CCAK9GPcTLDNZt-ACG9oEn5TL=p9DwjNd6JttpkoBeFj5tY6cv-Q@mail.gmail.com%3E 28 3. Algorithmen von Mahout 3.2.3 Ergebnisse der Bayes Beispiele In diesem Abschnitt sind die erzielten Ergebnisse der zwei beschriebenen Beispiele mit dem Bayes Algorithmus beschrieben. Anzahl Anzahl Slaves Master 1(+1) 6 18 1 1 1 BayesTrain BayesTest 3,90 min 3,30 min 4,10 min 1,28 min 1,10 min 2,04 min Tabelle 7: Ergebnis Bayes 20Newsgroups Das Ergebnis des Beispiels mit den Newsgroups zeigt, dass die Verarbeitungszeit mit sechs Slaves sinkt, aber mit 18 Slaves wieder ansteigt. Die Verwendung von 18 Slaves ist für die Dateigröße der Newsgroups-Dateien überdimensioniert, weshalb die Verarbeitungszeit wieder steigt. Anzahl Anzahl Slaves Master 1 1 18 1 1 1 xmlSplit DataSetCreator BayesTrain BayesTest 17,91 min 20,23 min 14,72 min 210,21 min 222,31 min 45,06 min - 338,34 min 342,42 min 65,30 min Tabelle 8: Ergebnis Bayes Wikipedia Das Beispiel mit den Wikipedia-Daten wählten wir bewusst aus, damit uns wenigstens bei einer Verarbeitung großvolumige Daten zu Verfügung stehen. Weil die Verarbeitungsdauern aller Teilschritte voneinander variierten, haben wir diese in der Ergebnistabelle notiert. Erwartungsgemäß sank die Verarbeitungsdauer im voll-verteilten Clusterbetrieb mit 18 Slaves. Die Verarbeitung führten wir zweimal mit nur einem Master-Node und einer Slave-Node auf einem Rechner aus. Bemerkenswert war die Dauer von 58,84 Minuten im Schritt xmlSplit mit 17 Slaves und der konfigurierten dfs.replication = 3 – dem empfohlenen Standardwert. Die Dauer von fast einer Stunde lässt sich damit begründen, dass die Daten in dem verteilten Dateisystem von Hadoop in dreifacher Ausführung auf jeweils verschiedenen Rechnern bereitgestellt wurden. 29 3. Algorithmen von Mahout 3.3 Empfehlungen am Beispiel von Recommender Dieses Kapitel beinhaltet die Nutzung von Recommendern in Mahout, zunächst werden diese allgemein erläutert, im Anschluss wird dann näher auf die von Mahout genutzten Algorithmen eingegangen. Wenn wir von Recommendern (Empfehlung) reden sind Algorithmen oder Systeme gemeint, die Nutzern anhand von existierenden Objekten andere Objekte empfehlen, die wiederum für den Nutzer möglichst interessant sein sollen. Amazon empfiehlt so z.B. mit ihrer „Kunden die diesen Artikel gekauft haben, kauften auch“ Funktion. Recommender können hauptsächlich in zwei große Kategorien unterteilt werden, nutzerbasierte (user based) und gegenstandsbasierte (item based) Recommender14. Mahout unterstützt dabei beide Kategorien. Zudem gibt es noch inhaltsbasierte Algorithmen, auf die hier nicht mehr näher eingegangen wird, da diese in Mahout zumindest derzeit keine Anwendung finden. Mahout bedient sich der zuerst genannten Algorithmen aus dem Grund, dass sie objektübergreifend angewendet werden können. Während inhaltsbasierte Recommender nur Objekte anhand von Präferenzeigenschaften empfehlen, kommen dabei meist nur sehr ähnliche Objekte als Empfehlung im Ergebnis heraus. So kann es passieren, dass ein Nutzer der Bücher über Gartenarbeit kauft, z.B. keine Gartenwerkzeuge als Empfehlung, dafür aber Bücher anderer Autoren über Gartenarbeit erhält. Dieses Problem wird umso gravierender, wenn es gilt, komplexe Objekte zu empfehlen. Nutzer- und gegenstandsbasierte Recommendern hingegen ermöglichen es Bücher, Filme, CDs, Blumen usw. anzubieten. Die Ergebnismenge ist wesentlich vielseitiger. Bei allen Recommendern wird immer eine Ähnlichkeit, bzw. Distanz zwischen den Objekten errechnet durch die Empfehlungen entschieden werden. Es wird also versucht, eine Vorhersage zu treffen, welchen Gegenstand einem Nutzer gefallen könnte. Als Nächstes wird näher auf die Nutzerbasierten Recommender eingegangen, da dieser nicht im Beispiel genutzt wurde. 14 Vergl. Owen u.a. 2012, S. 41 30 3. Algorithmen von Mahout 3.3.1 Nutzerbasierte Recommender Nutzerbasierte Recommender vergleichen die Ähnlichkeit zwischen Nutzern und funktionieren grob gesagt wie folgt: 1. Finde ähnlichen Nutzer 2. Welche Gegenstände sind von Interesse für ähnliche Nutzer 3. Gegenstände dieser Nutzer werden zu möglichen Kandidaten 4. Erstelle gewichtete Werte an Hand der Ähnlichkeit der Nutzer für die Kandidatengegenstände15 Mahout benötigt für Recommender allgemein nur vier wichtige Angaben, ein Datenmodel (DataModel), sowie eine Nutzer-Nutzer Ähnlichkeitsmetrik (UserSimilarity), eine Nutzer Nachbarschaftsdefinition (UserNeighborhood) und letztendlich eine Recommender Engine (Recommender).16 Das Datenmodel dient dem einladen von Dateien, die Dateien die mit Mahout eingelesen werden sollen, müssen dabei je nach Algorithmus einem unterschiedlichen Aufbau entsprechen. Bei Recommendern sollte der Aufbau des Inputs wie folgt aussehen:17 (NutzerID,GegenstandsID,Wert) 1,101,5.0 1,102,3.0 2,101,2.0 Der Wert ist die jeweilige Bewertung des Gegenstands durch den Nutzer, das Datenformat entspricht einer .csv Datei. UserSimilarity gibt die Methode an, wie die Ähnlichkeiten/Distanzen zwischen den Nutzern berechnet werden sollen, hier gibt es mehrere Möglichkeiten: Pearson 15 Vergl. Owen u.a. 2012, S. 44 Vergl. Owen u.a. 2012, S. 45 17 Vergl. Owen u.a. 2012, S. 15 16 31 3. Algorithmen von Mahout (mit und ohne Gewichtung), Euklidische Distanz, Kosinus, Spearman, Tanimoto, Log-Likelihood. Jeder dieser Distanz- und Ähnlichkeitsmaße hat seine Vor- und Nachteile und sollte je nach Anwendungsfall festgelegt werden, sie unterscheiden sich sowohl in Performanz als auch zur Behandlung von fehlenden Werten und haben damit auch eine verschiedene Beurteilungsqualität bezüglich der späteren Empfehlung. Mahout bietet einen RecommenderEvaluator an mit dem es möglich ist den genutzten Recommender zu bewerten. Der Evaluator testet hierbei mit einem Teildatensatz der vorhandenen Daten und bewertet das Ergebnis anhand der gesamten vorliegenden Daten.18 Das Ergebnis kann dabei variieren, ausschlaggebend sind Datenstruktur, Größe und fehlende Werte. Die UserNeighborhood bestimmt wie viele Datensätze um einen bestimmten Nutzer näher untersucht werden. Hierbei gibt es zwei unterschiedliche Methoden, zum einen Fixed-size neighborhoods.19 Bei diesem Algorithmus muss eine Zahl festgelegt werden, die aussagt wie viele Nutzer als Kandidaten für die Untersuchung in Frage kommen. Haben wir beispielsweise 100 Datensätze und legen für UserNeighborhood den Wert 10 fest, wird der Recommender die 10 zehn ähnlichsten Nutzer für einen oder mehrere Nutzer auswerten. Ein Nachteil dieser Methode ist, dass beispielsweise fünf weitere Nutzer noch sehr ähnlich sein könnten und dabei wegfallen. Zum anderen gibt es noch treshold-based neighborhoods, diese bestimmen einen Bereich um den Nutzer, für den es Empfehlungen geben soll, der begrenzt, wie ähnlich die zu untersuchenden anderen Nutzer sein sollen 20. Dies hat den Vorteil, dass Nutzer nicht aus der Bewertung herausfallen, die bis zu einem gewissen Grad ähnlich sind. 18 Vergl. Owen u.a. 2012, S. 18 Vergl. Owen u.a. 2012, S. 47 20 Vergl. Owen u.a. 2012, S. 47 19 32 3. Algorithmen von Mahout Die RecommenderEngine bestimmt welcher Recommender verwendet werden soll, z.B. ein besonderer user- oder itembased Recommender. 3.3.2 Gegenstandsbasierte Recommender Was beim ersten Blick auf den itembased Recommender auffällt ist, dass er keine Angaben zur neighborhood benötigt, da der Algorithmus ja bereits nur eine begrenzte Anzahl an Objekten zur Kontrolle hat, nämlich die Gegenstände, für die sich ein Nutzer interessiert. Im Gegensatz zum Nutzerbasierten Recommender wird hier überprüft, welche Gegenstände ein Nutzer hat und wie er Gegenstände bewertet. Mit diesen Informationen wird dann eine Voraussage getroffen, an welchem Gegenstand der Nutzer noch interessiert sein könnte, hierbei werden nicht die Eigenschaften der Gegenstände bewertet.21 Bei Mahout wird eine Grauwertematrix (Co-occurence matrix) für Gegenstände angelegt, die gepaart bei Nutzern auftreten, je öfter diese gepaart auftreten, desto ähnlicher sind sie. Dieser Wert wird mit einem Distanzmaß ermittelt. Mit diesen Werten können wir dann eine Bewertung eines Gegenstands ermitteln, den der Nutzer noch nicht gesehen hat, anhand der Bewertungen anderer Nutzer, die diese bereits bewertet haben. Dies geschieht, in dem der Nutzer-Vektor mit der Grauzonenmatrix multipliziert wird. Dadurch wird eine Bewertung für jeden Gegenstand für einen Nutzer generiert und es können die Besten Bewertungen als Empfehlung genutzt werden.22 Im Code gibt es hier einen kleinen Unterschied zur nutzerbasierten Variante, hier wird nicht die UserSimilarity sondern die ItemSimilarity verwendet, wobei diese Implementierung über weniger Distanz- und Ähnlichkeitsmaße verfügt, die wichtigsten sind aber dabei: Pearson (mit/ohne Gewichtung), Euklidische Distanz (mit/ohne Gewichtung), Tanimoto und Log-Likelihood. Wie bereits bei den nutzer- 21 22 Vergl. Cloudera 2011 Vergl. Cloudera 2011 33 3. Algorithmen von Mahout basierten Recommendern muss auch hier experimentiert werden, welches Maß sich am ehesten für die jeweilige Aufgabe eignet. Bei der Umsetzung in Mahout haben wir uns für einen gegenstandsbasierten Recommender entschieden, da es vorteilhaft ist diese einzusetzen wenn es in dem vorliegendem Datensatz im Verhältnis mehr Nutzer als Gegenstände gibt. Zusätzlich gibt es normalerweise weniger Veränderungen bei den Gegenständen als bei den Nutzern. Bei dem vorliegenden Datensatz treffen beide Punkte zu.23 23 Vergl. Cloudera 2011 34 3. Algorithmen von Mahout 3.3.3 Beispiel Recommender mit Grouplens Datenbank für Filmbewertungen Wie bereits in Kapitel 3.3.2 erwähnt haben wir uns hier für einen itembased Recommender entschieden. Die verwendete Filmbewertungsdatenbank aus Jahr 2000 ist komprimiert 5,72 MB groß und wird von dem Forschungsprojekt Grouplens der University of Minnesota bereitgestellt. Die entpackte ratings.dat Datei ist 23,4 MB groß und enthält 1.000.209 Bewertungen von anonymisierten 6040 MovieLens Nutzern und über 3900 Filme. Befehle Beschreibung wget http://www.grouplens.org/system/files/ml-1m.zip Download der Beispieldaten unzip ml-1m.zip Entpacken der Beispieldaten tr -s ':' ',' < ratings.dat | cut -f1-3 -d, > ratings.csv Datei für das Datenmodell umschreiben: Ersetzt „:“ Trennzeichen mit „,“ und übernimmt nur die ersten 3 Spalten in die ratings.csv. hadoop fs -put $MAHOUT_HOME/input/recommender/ratings.csv /hadoop/recommender/input/ Input in das Hadoop Filesystem schreiben vi userToRate.txt Datei erstellen, in der die Nutzer enthalten sind, die eine Empfehlung enthalten sollen. Ein Nutzer wird pro Zeile eingetragen, z.B. 6040. 35 3. Algorithmen von Mahout hadoop fs -put $MAHOUT_HOME/input/recommender/ml-1m/userToRate.txt /hadoop/recommender/userToRate/ Datei mit Nutzern, die bewertet werden sollen, in das Hadoop Filesystem schreiben mahout recommenditembased --input /hadoop/recommender/input --output hadoop/recommender/output/ --tempDir /hadoop/recommender/tmp/ --usersFile /hadoop/recommender/userToRate/ --similarityClassname SIMILARITY_EUCLIDEAN_DISTANCE Im letzten Schritt muss nur noch Recommender mit den jeweiligen Parametern ausgeführt werden. Der Parameter Recommenditembased gibt an, dass ein gegenstandsbasierter Algorithmus genutzt werden soll. usersFile gibt an, wo die Datei mit den zu bewertenden Nutzern liegt. similarityClassname gibt an welches Distanzmaß genutzt werden soll. hadoop fs -cat /hadoop/recommender/output/part-r-00000 Ergebnisausgabe aus dem Hadoop Filesystem Tabelle 9: Durchführung Recommender 36 3. Algorithmen von Mahout 3.3.4 Ergebnisse der Recommender Verarbeitung Die Verarbeitung erzielte folgende Ergebnisse, die wir nach der Anzahl der verwendeten Slave- und Master- Nodes und der jeweiligen Algorithmen aufgelistet haben. Anzahl Anzahl Slaves Master 1(+1) 6 18 1 1 1 Recommender 8,46 min 8,66 min 9,40 min Tabelle 10: Ergebnis Recommender Auffällig ist, dass der Recommender Algorithmus bei einer steigenden Anzahl von Nodes mehr Zeit für die Bearbeitung benötigte. Wie schon bei den vorangegangenen Beispielen, hängt dies mit der Größe der verwendeten Daten zusammen. 37 3. Algorithmen von Mahout 3.4 Herausforderungen im Betrieb Die Verwendung der Algorithmen im Hadoop-Cluster stellte uns vor ungeahnte Probleme, die wir in diesem Abschnitt erläutert sind. Wenn Probleme auftreten, so empfiehlt es sich generell die Log-Dateien im hadoop/logs Ordner zu studieren. Tritt folgende Fehlermeldung ein, so kann es sein, dass Java 1.6.0.x OpenJDK Probleme bereitet.24 java.net.SocketException: Protocol not available INFO hdfs.DFSClient: Exception in createBlockOutputStream java.net.SocketException: Protocol not available INFO hdfs.DFSClient: Abandoning block blk_5533397873275401028_1010 Abhilfe schafft nur ein anderes JDK zu verwenden: sudo zypper remove java-1_6_0-openjdk* Ein nicht selten auftretender Fehler ist dieser: Hadoop Error: “could only be replicated to 0 nodes, instead of 1? Das Problem wird meist durch das Löschen aller temporären Dateien, die für das verteilte Hadoop Dateisystem verwendet werden, behoben. Nach dem Stoppen von Hadoop ist der in der Konfiguration angegebene Ordner mit dem Benutzer root wie folgt zu leeren:25 rm -f -r /tmp/hadoop* 24 25 Vergl. Apache Bugtracker (2010) Vergl. Mail-Archive 2009 38 3. Algorithmen von Mahout Anschließend muss die Namenode neu formatiert werden: hadoop namenode –format Ein weiteres Problem kann auftreten, wenn die Hadoop-Dienste mit start-all.sh gestartet wurden und der Nutzer kurz darauf Dateien oder Ordner in das HadoopFile-System schreiben möchte. Hadoop startet in einem sogenannten „Safe“ Modus, der das Dateisystem vor Änderungen schützen soll. Teilweise blieb das System bis zu 5 Minuten in diesem Modus. Um abzurufen, in welchem Status sich das System befindet, kann dieser mit Hilfe von „hadoop dfsadmin –safemode get“ abgefragt werden. Ist der Safe-Modus aktiv, so kann er mit „hadoop dfsadmin – safemode leave“ beendet werden. Sollte die Ausgabe von Mahout, wenn der Map/Reduce Algorithmus ausgeführt wird, für längere Zeit unverändert sein (ist nach Dateigröße abzuschätzen) oder sollte die Angabe für map auf 100 Prozent verharren, so empfiehlt es sich die Logdateien auf der Master-Node anzuschauen. Aus der Namenode-Logdatei könnte hervorgehen, dass für den Reduce-Algorithmus nicht genug Speicherplatz zur Verfügung steht. Aus der Weboberfläche geht dies nicht hervor. Nicht abschließend begründen können wir den aufgetretenen Fehler „Incompatible namespaceIDs“, der aus den Datanode-Logdateien der Slave-Nodes hervorgeht. Das Problem konnte wir beheben, indem wir analog wie beim Fehler „replicated to 0 nodes, instead of 1“ vorgegangen sind. Zusätzlich haben wir anschließend alle beteiligten VMs neugestartet.26 Allerdings ist auf den zur Verfügung stehenden Arbeitsspeicher des Rechners für die VM zu achten, denn wenn nicht genug Arbeitsspeicher für die Bearbeitung zur Verfügung steht, bricht die Verarbeitung des jeweiligen Arbeitspaketes des be 26 Brandeis University 2008 39 3. Algorithmen von Mahout troffenen Rechners ab. Die Fehler lautet: „java.lang.OutOfMemoryError: Java heap space“. Sollte beim Starten der Namenode die Exception auftreten: java.lang.NullPointerException, so wurde die Namenode nicht ordentlich beendet, sodass nur durch eine Formatierung des DFS Abhilfe geschaffen werden kann. Alle bisherigen Daten gehen somit leider verloren. Ein weiteres Problem bei der Ausführung der Algorithmen war die Aktualität, bzw. Richtigkeit der Tutorials von der Mahout- Website. Vorgefertigte Shell-Skripte, die im examples- Ordner in Mahout mitgeliefert werden oder über die Website bezogen werden können, funktionierten leider meist nicht. Trotzdem waren die Beispielskripte hilfreicher als die Tutorials, um ein Grundverständnis zu erlangen und die Algorithmen lauffähig zu bekommen. Wir vermuten, dass die Skripte und Tutorials nicht aktuell sind, bzw. sich auf andere Versionen von Mahout beziehen oder selbst nicht mehr aktualisiert wurden. Um die Brisanz zu verdeutlichen, wird nachfolgend ein Screenshot vom Tutorial für k-Means originalgetreu abgebildet: Abbildung 13: Mahout-Wiki, k-Means Tutorial Das Shellskript, welches auf dem Wort „Here“ verlinkt ist, funktionierte wie bereits beschrieben leider nicht. Leider wird an dieser Stelle nicht darauf hingewiesen, dass die Befehle seqdirectory und seq2sparse nicht im verteilten(distributed) Modus von Mahout (es muss also MAHOUT_LOCAL=true gesetzt werden) ausgeführt werden dürfen, da sonst die nötigen Dateien nicht, bzw. Falsch (wesentlich kleiner) generiert werden. 40 4. Fazit 4 Fazit Die in dieser Arbeit ausgearbeitete Einrichtung und Konfiguration eines volloitverteilten Clusterbetriebs mittels Hadoop ermöglicht die Durchführung von Analysen und Datenverarbeitungen mit Mahout. Entgegen unserer Erwartungen gestaltete sich die Einarbeitung, Einrichtung und Konfiguration wesentlich aufwendiger als erwartet. Daher können die gesammelten Erfahrungen als Grundlage für nachfolgende Projekte sehr nützlich sein. In den beiden Kapiteln, bzgl. Herausforderungen in der Einrichtung und im Betrieb, haben wir sämtliche aufgetretenen Probleme, Lösungen und Hilfestellungen dokumentiert. Im Praxisteil der Arbeit sind drei Algorithmen und vier Beispiele beschrieben, sodass die Beispiele nachvollzogen und nachgestellt werden können. Die Ergebnisse der Beispiele zeigen, dass bei größeren Datenverarbeitungen im Gigabyte-Bereich und zunehmender Anzahl der beteiligten Slave-Nodes die Verarbeitungszeit erwartungsgemäß sinkt. Bei kleineren Daten, wie bei drei der Beispiele, steigt hingegen die Verarbeitungszeit. Um nun Verarbeitungen mit größeren Daten zu testen muss berücksichtigt werden, dass ein Vielfaches der Dateigröße als Speicherplatz bereitstehen muss. Da Datenpakete im HDFS verloren gehen können, kann die Anzahl der Kopien der Daten im HDFS in der Konfiguration – Replikation der Blöcke - definiert werden. Beim empfohlenen Standardwert von drei bedeutet dies, dass am Beispiel der Wikipedia Daten mit 34,8 GB nunmehr 104,4 GB an Platz im HDFS benötigt werden. Die Speicherkapazität der VMs sollte also großzügig geplant werden, denn es sollte bedacht werden, dass die Daten auch auf einer VM bereitstehen müssen, um sie in das HDFS zu schreiben. Da unsere VMs nur eine Speicherkapazität von 20 GB hatten, musste eine neue größere anlegt werden. Die Arbeit mit Mahout und Hadoop wurde erschwert durch teilweise unverständliche Fehlermeldungen, die die Fehlerursache nicht benennen. Die API war uns leider nur in den wenigsten Fällen hilfreich, weil sie nicht vollständig zu sein scheint. Dabei erschwerten anfänglich auftretende Versionskonflikte die Suche nach der Fehlerursache beachtlich. Sehr zeitintensiv war das mehrfach notwendi- 41 4. Fazit ge Anpassen der Konfigurationsdateien oder Löschen der temporären Verzeichnisse auf sämtlich beteiligten VMs aufgrund von Fehlern im HDFS. 42 Literaturverzeichnis Literaturverzeichnis Apache 2010 Bugtracker o.V.; Apache Bugtracker (2010): SocketException: Protocol Abrufbar not im available Internet: for some JVMs https://issues.apache.org/jira/ browse/HDFS-1115 (letzter Zugriff 23.03.2010, 18 Uhr) Backhaus u.a. 2011 Klaus Backhaus, Bernd Erichson, Wulff Plinke, Rolf Weiber; Springer-Verlag (2011): Multivariate Analysemethoden – Eine anwendungsorientierte Einführung Brandeis 2008 University o.V.; Brandeis University (2008): Hadoop Troubleshooting Abrufbar im Internet: http://pages.cs.brandeis.edu/~cs147a/ lab/hadooptroubleshooting/ (letzter Zugriff 31.03.2010, 18 Uhr) Cloudera 2011 o.V.; Cloudera Blog (2011): Recommendation with Apache Mahout Abrufbar im Internet: http://www.cloudera.com/blog/2011/11/recommendationwith-apache-mahout-in-cdh3/ (letzter Zugriff 18.04.2012, 12 Uhr) Hartung 2007 Joachim Hartung, Bärbel Elpert; Oldenburg Wissenschaftsverlag (2007): Multivariate Statistik Mahout Wiki 2010 o.V.; Mahout Wiki (2010): Wikipedia Bayes Example Abrufbar im Internet: https://cwiki.apache.org/MAHOUT/wikipedia-bayesexample.html (letzter Zugriff 21.03.2010, 13 Uhr) Mahout Wiki 2011a o.V.; Mahout Wiki (2011): Twenty Newsgroups Classification Example Abrufbar im Internt: https://cwiki.apache.org/MAHOUT/ VI Literaturverzeichnis twenty-newsgroups.html (letzter Zugriff 22.03.2010, 12 Uhr) Mahout Wiki 2011b o.V.; Mahout Wiki (2011): K-Means Clustering Tutorial Abrufbar im Internet: https://cwiki.apache.org/MAHOUT /k-means-clustering.html (letzter Zugriff 28.03.2010, 22 Uhr) Mahout Wiki 2011c o.V.; Mahout Wiki (2011): Latent Dirichlet Allocation Abrufbar im Internet: https://cwiki.apache.org/MAHOUT/latent-dirichletallocation.html (letzter Zugriff 27.03.2010, 23 Uhr) Mail-Archive 2009 Boyu Zhang; Mail-Archive (2009) Abrufbar im Internet: http://www.mail-archive.com/common-user@hadoop. apache.org/msg00407.html (letzter Zugriff 25.03.2010, 17 Uhr) Owen u.a. 2012 Sean Owen, Robin Anil, Ted Dunning, Ellen Friedmann; Manning Publications Co. (2012): Mahout in Action VII Anhang A Konfiguration für voll-verteilten Clusterbetrieb $HADOOP_HOME/conf/mapred-site.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>mapred.job.tracker</name> <value>hdfs://mahout-master:9001</value> </property> <property> <name>mapred.child.java.opts</name> <value>-Xmx512m</value> </property> </configuration> $HADOOP_HOME/conf/core-site.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>fs.default.name</name> <value>hdfs://mahout-master:9000/</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/tmp/hadoop-${user.name}</value> <description>temp directory</description> </property> </configuration> $HADOOP_HOME/conf/hdfs-site.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Put site-specific property overrides in this file. --> <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.block.size</name> <value>128000000</value> <description>The default block size for new files.</description> </property> <property> <name>dfs.permissions</name> <value>true</value> <description> If "true", enable permission checking in HDFS If "false", permission checking is turned off, but all other behavior is unchanged Switching from one parameter value to the other does not change the mode, owner or group of files or directories. </description> </property> </configuration> $HADOOP_HOME/conf/slaves mahout-slave-01 mahout-slave-02 mahout-slave-03 mahout-slave-04 mahout-slave-05 mahout-slave-06 mahout-slave-07 mahout-slave-08 mahout-slave-09 mahout-slave-11 mahout-slave-12 mahout-slave-13 mahout-slave-14 mahout-slave-15 mahout-slave-16 mahout-slave-17 mahout-slave-18 mahout-fileserver-01 /etc/hosts # # hosts This file describes a number of hostname-to-address # mappings for the TCP/IP subsystem. It is mostly # used at boot time, when no name servers are running. # On small systems, this file can be used instead of a # "named" name server. # Syntax: # # IP-Address Full-Qualified-Hostname Short-Hostname # 127.0.0.1 localhost 172.22.1.21 mahout-master.mahout mahout-master 172.22.1.22 mahout-slave-01.mahout mahout-slave-01 172.22.1.23 mahout-slave-02.mahout mahout-slave-02 172.22.1.24 mahout-slave-03.mahout mahout-slave-03 172.22.1.25 mahout-slave-04.mahout mahout-slave-04 172.22.1.26 mahout-slave-05.mahout mahout-slave-05 172.22.1.27 mahout-slave-06.mahout mahout-slave-06 172.22.1.28 mahout-slave-07.mahout mahout-slave-07 172.22.1.29 mahout-slave-08.mahout mahout-slave-08 172.22.1.30 mahout-slave-09.mahout mahout-slave-09 172.22.1.42 mahout-slave-10.mahout mahout-slave-10 172.22.1.31 mahout-slave-11.mahout mahout-slave-11 172.22.1.32 mahout-slave-12.mahout mahout-slave-12 172.22.1.33 mahout-slave-13.mahout mahout-slave-13 172.22.1.34 mahout-slave-14.mahout mahout-slave-14 172.22.1.35 mahout-slave-15.mahout mahout-slave-15 172.22.1.36 mahout-slave-16.mahout mahout-slave-16 172.22.1.37 mahout-slave-17.mahout mahout-slave-17 172.22.1.38 mahout-slave-18.mahout mahout-slave-18 172.22.1.39 mahout-fileserver.mahout mahout-fileserver 172.22.1.40 mahout-fileserver-01.mahout mahout-fileserver-01 # special IPv6 addresses ::1 localhost ipv6-localhost ipv6-loopback fe00::0 ff00::0 ff02::1 ff02::2 ff02::3 ipv6-localnet ipv6-mcastprefix ipv6-allnodes ipv6-allrouters ipv6-allhosts $HADOOP_HOME/conf/masters mahout-master B Beschreibung der komprimierten virtuellen Maschinen Image: Master (auf beiliegender DVD) Datei Gepackte Größe Entpackte Größe Beschreibung mahoutmaster_teil.7z.001 bis 008 mahout-master.7z 8 mal 700 MB insg. 5,30 GB 5,30 GB Teilpakete für mahout-master.7z 5,30 GB 8,52 GB VM für Master-Node Image: Slave (auf beiliegender DVD) Datei Gepackte Größe Entpackte Größe Beschreibung mahout-slave-01.7z 1,36 GB 6,70 GB VM für Slave-Node Image: Mahout-Fileserver01 Datei Gepackte Größe Entpackte Größe Beschreibung mahout-fileserver.7z. 001 bis 012 12 mal 700 MB insg. 17,3 GB 91,70 GB VM genau wie Slave, nur mit größerer Partition Image: Mahout-Fileserver02 Datei Gepackte Größe Entpackte Größe Beschreibung mahoutfileserver02.7z 001 bis 049 49 mal 700 MB insg. 33,3 GB 124 GB VM für Pseudo-verteilten Betrieb für das Wikipedia-Beispiel