Im Rahmen einer Forschungsarbeit beschäftige ich mich mit Spark auf einem Hadoop-Cluster. Ich habe daher ein wenig Spielzeug bekommen und wollte mal sehen, wie geeignet das System für uns ist. Der Testaufbau soll vor allem auch zeigen, ob man große Daten auch mit geringen Ressourcen gut verarbeiten kann.
Die Maschinen
Ingesamt 7 Desktop-Rechner mit
- i7-2600 @3,4 GHz mit 4 Kernen
- 500GB HDD
- 8 GB RAM
Ich weiß, die Specs sind laut Empfehlungen viel zu klein für ein Hadoop-Cluster, aber der Test soll auch zeigen, wie weit man mit geringen Ressourcen kommt.
Das Betriebssystem
Mal wieder steht man vor der Wahl des Betriebssystem. Ich fühle mich eigentlich auf Arch am wohlsten, da ich aber weniger Arbeit mit der Wartung der Maschinen als vielmehr mit Hadoop verbringen möchte, hab ich mich für Debian 9 entschieden.
Festplattenkonfiguration
- 30GB: /
- 8GB: SWAP
- Rest für /home/
Netzwerkkonfiguration
Wir arbeiten ein einem abgeschottenen Netzwerk innerhalb der Hochschule. Die IP-Adressen sind eigentlich egal und dienen nur mir als Gedächtnisstütze ;). Wichtig ist nur, dass man die Hosts-Datei /etc/hosts entsprechend anpasst:
192.168.123.90 hadoop-master 192.168.123.91 hadoop-slave-1 192.168.123.92 hadoop-slave-2 192.168.123.93 hadoop-slave-3 192.168.123.94 hadoop-slave-4 192.168.123.95 hadoop-slave-5 192.168.123.96 hadoop-slave-6
tmux dein Freund zur Administration vieler Maschinen
Für die Administration vieler Maschinen ist tmux quasi unverzichtbar. Ich verwende dazu noch das tool tmuxinator mit folgender Konfiguration:
name: hadoop root: ~/ windows: - editor: layout: tiled synchronize: after panes: - ssh hadoop@192.168.123.90 - ssh hadoop@192.168.123.91 - ssh hadoop@192.168.123.92 - ssh hadoop@192.168.123.93 - ssh hadoop@192.168.123.94 - ssh hadoop@192.168.123.95 - ssh hadoop@192.168.123.96 - server: bundle exec rails s
Installation Hadoop
Ich habe mich an der Anleitung http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/ClusterSetup.html orientiert und bilde hier nur die wichtigsten Schritte ab.
Zunächst die neuste Java-Version und rsync installieren:
sudo apt-get install openjdk-8-jdk rsync
SSH Public-Key Authentifizierung für alle Maschinen
Der master sollte auf alle slaves Zugriff haben. Daher habe ich auf dem master einen Schlüssel erstellt und diesen auf die anderen Maschinen verteilt.
Installation und Konfiguration des Masters
Die folgenden Arbeiten werden zunächst nur auf dem Master vorgenommen. Die neuste Version von Hadoop herunterlade und entpacken:
mkdir /opt/hadoop cd /opt/hadoop/ wget http://www-eu.apache.org/dist/hadoop/common/hadoop-2.8.1/hadoop-2.8.1.tar.gz tar -xzf hadoop-1.2.0.tar.gz mv hadoop-2.8.1 hadoop chown -R hadoop:hadoop /opt/hadoop/
Nun müssen einige files auf dem Master angepasst werden:
- /opt/hadoop/hadoop/etc/hadoop/hadoop-env.sh
export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
- /opt/hadoop/hadoop/etc/hadoop/core-site.xml
<configuration> <property> <name>fs.default.name</name> <value>hdfs://hadoop-master:9000/</value> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> </configuration>
- /opt/hadoop/hadoop/etc/hadoop/hdfs-site.xml
<configuration> <property> <name>dfs.name.dir</name> <value>/home/hadoop/hadoop/dfs/name</value> <final>true</final> </property> </configuration>
- /opt/hadoop/hadoop/etc/hadoop/slaves
hadoop-slave-1 hadoop-slave-2 hadoop-slave-3 hadoop-slave-4 hadoop-slave-5 hadoop-slave-6
Installation und Konfiguration der Slaves
Nun müssen die Files auf alle slaves verteilt werden (hier hilft wieder tmux).
scp -r /opt/hadoop/hadoop hadoop-slave-1:/opt/hadoop scp -r /opt/hadoop/hadoop hadoop-slave-2:/opt/hadoop scp -r /opt/hadoop/hadoop hadoop-slave-3:/opt/hadoop scp -r /opt/hadoop/hadoop hadoop-slave-4:/opt/hadoop scp -r /opt/hadoop/hadoop hadoop-slave-5:/opt/hadoop scp -r /opt/hadoop/hadoop hadoop-slave-6:/opt/hadoop
Nun auf den Slaves noch folgendes Config-File anpassen:
- /opt/hadoop/hadoop/etc/hadoop/hdfs-site.xml
<configuration> <property> <name>dfs.name.dir</name> <value>/home/hadoop/hadoop/dfs/name</value> <final>true</final> </property> </configuration>
Und fertig ist die komplette Konfiguration. Nund muss das HDFS formatiert werden:
/opt/hadoop/hadoop/bin/hdfs namenode -format <cluster_name>
Starten und Beenden der Dienste
Am Ende sollten verschiedene Dienste gestartet werden. Dazu zunächst in folgendes Verzeichnis wechseln:
- /opt/hadoop/hadoop/sbin/
# Starten der HDFS Namenode und Datanodes ./start-dfs.sh # Starten der YARN Prozesse ./start-yarn.sh # Starten des WebAppProxy Servers ./yarn-daemon.sh --config /opt/hadoop/hadoop/etc/hadoop/ start proxyserver # Starten des MapReduce JobHistory Servers mr-jobhistory-daemon.sh --config /opt/hadoop/hadoop/etc/hadoop/ start historyserver
Möchte man die Server beenden können folgende Befehle verwendet werden:
# Stoppen der HDFS Namenode und Datanodes ./stop-dfs.sh # Stoppen der YARN Prozesse ./stop-yarn.sh # Stoppen des WebAppProxy Servers ./yarn-daemon.sh --config /opt/hadoop/hadoop/etc/hadoop/ stop proxyserver # Stoppen des MapReduce JobHistory Servers mr-jobhistory-daemon.sh --config /opt/hadoop/hadoop/etc/hadoop/ stop historyserver
Webinterfaces
Nach dem Starten aller Dienste, sollten folgende Dienste erreichbar sein (IP-Addresse ist diejenige wo auch der Service läuft, in dieser Beschreibung der Master; Port ist jeweils der Standardport):
- NameNode: http://192.168.123.90:50070
- ResourceManager: http://192.168.123.90:8088
- MapReduce JobHistory Server: http://192.168.123.90:19888
Pingback: Howto: Multi-Node Spark Cluster im Standalone-Mode auf Debian 9 | Timos Blog