Apache Spark ist ein verteiltes Computersystem. Es besteht aus einem Master und einem oder mehreren Slaves, wobei der Master die Arbeit unter den Slaves verteilt und so die Möglichkeit gibt, unsere vielen Computer für die Arbeit an einer Aufgabe zu verwenden. Man könnte vermuten, dass dies in der Tat ein mächtiges Werkzeug ist, bei dem Aufgaben große Berechnungen erfordern, aber in kleinere Teile von Schritten aufgeteilt werden können, die zur Bearbeitung an die Slaves weitergegeben werden können. Sobald unser Cluster betriebsbereit ist, können wir Programme schreiben, die darauf in Python, Java und Scala ausgeführt werden.
In diesem Tutorial arbeiten wir auf einem einzelnen Computer, auf dem Red Hat Enterprise Linux 8 ausgeführt wird, und installieren den Spark-Master und -Slave auf demselben Computer, aber denken Sie daran, dass die Schritte, die das Slave-Setup beschreiben, auf eine beliebige Anzahl von Computern angewendet werden können. Dadurch entsteht ein echter Cluster, der hohe Arbeitslasten verarbeiten kann. Wir fügen auch die erforderlichen Unit-Dateien für die Verwaltung hinzu und führen ein einfaches Beispiel für den mit dem verteilten Paket gelieferten Cluster aus, um sicherzustellen, dass unser System betriebsbereit ist.
In diesem Tutorial lernen Sie:
- So installieren Sie Spark-Master und -Slave
- So fügen Sie systemd Unit-Dateien hinzu
- So überprüfen Sie eine erfolgreiche Master-Slave-Verbindung
- So führen Sie einen einfachen Beispieljob auf dem Cluster aus
Spark-Shell mit PySpark.
Softwareanforderungen und verwendete Konventionen
Kategorie | Anforderungen, Konventionen oder verwendete Softwareversion |
---|---|
System | Red Hat Enterprise Linux 8 |
Software | Apache Spark 2.4.0 |
Andere | Privilegierter Zugriff auf Ihr Linux-System als root oder über sudo Befehl. |
Konventionen | # – erfordert, dass bestimmte Linux-Befehle mit Root-Rechten ausgeführt werden, entweder direkt als Root-Benutzer oder durch Verwendung von sudo Befehl$ – erfordert, dass bestimmte Linux-Befehle als normaler, nicht privilegierter Benutzer ausgeführt werden |
Schritt-für-Schritt-Anleitung zur Installation von Spark auf Redhat 8
Apache Spark läuft auf JVM (Java Virtual Machine), daher ist eine funktionierende Java 8-Installation erforderlich, damit die Anwendungen ausgeführt werden können. Abgesehen davon enthält das Paket mehrere Shells, eine davon ist pyspark
, eine auf Python basierende Shell. Um damit arbeiten zu können, muss außerdem Python 2 installiert und eingerichtet sein.
- Um die URL des neuesten Spark-Pakets zu erhalten, müssen wir die Spark-Download-Site besuchen. Wir müssen den Mirror auswählen, der unserem Standort am nächsten liegt, und die von der Download-Site bereitgestellte URL kopieren. Dies bedeutet auch, dass sich Ihre URL möglicherweise von dem nachstehenden Beispiel unterscheidet. Wir installieren das Paket unter
/opt/
, also geben wir das Verzeichnis alsroot
ein :# cd /opt
Und geben Sie die erhaltene URL an
wget
weiter um das Paket zu bekommen:# wget https://www-eu.apache.org/dist/spark/spark-2.4.0/spark-2.4.0-bin-hadoop2.7.tgz
- Wir entpacken den Tarball:
# tar -xvf spark-2.4.0-bin-hadoop2.7.tgz
- Und erstellen Sie einen Symlink, damit Sie sich unsere Pfade in den nächsten Schritten leichter merken können:
# ln -s /opt/spark-2.4.0-bin-hadoop2.7 /opt/spark
- Wir erstellen einen nicht privilegierten Benutzer, der beide Anwendungen ausführt, Master und Slave:
# useradd spark
Und setzen Sie es als Eigentümer des gesamten
/opt/spark
Verzeichnis, rekursiv:# chown -R spark:spark /opt/spark*
- Wir erstellen einen
systemd
Unit-Datei/etc/systemd/system/spark-master.service
für den Master-Dienst mit folgendem Inhalt:[Unit] Description=Apache Spark Master After=network.target [Service] Type=forking User=spark Group=spark ExecStart=/opt/spark/sbin/start-master.sh ExecStop=/opt/spark/sbin/stop-master.sh [Install] WantedBy=multi-user.target
Und auch eine für den Slave-Dienst, der
/etc/systemd/system/spark-slave.service.service
sein wird mit folgendem Inhalt:[Unit] Description=Apache Spark Slave After=network.target [Service] Type=forking User=spark Group=spark ExecStart=/opt/spark/sbin/start-slave.sh spark://rhel8lab.linuxconfig.org:7077 ExecStop=/opt/spark/sbin/stop-slave.sh [Install] WantedBy=multi-user.target
Beachten Sie die hervorgehobene Spark-URL. Diese wird mit
spark://<hostname-or-ip-address-of-the-master>:7077
erstellt , in diesem Fall hat der Laborcomputer, auf dem der Master ausgeführt wird, den Hostnamenrhel8lab.linuxconfig.org
. Der Name Ihres Meisters wird anders sein. Alle Slaves müssen in der Lage sein, diesen Hostnamen aufzulösen und den Master auf dem angegebenen Port zu erreichen, der Port7077
ist standardmäßig. - Wenn die Dienstdateien vorhanden sind, müssen wir
systemd
fragen um sie erneut zu lesen:# systemctl daemon-reload
- Wir können unseren Spark-Master mit
systemd
starten :# systemctl start spark-master.service
- Um zu überprüfen, ob unser Master läuft und funktioniert, können wir systemd status verwenden:
# systemctl status spark-master.service spark-master.service - Apache Spark Master Loaded: loaded (/etc/systemd/system/spark-master.service; disabled; vendor preset: disabled) Active: active (running) since Fri 2019-01-11 16:30:03 CET; 53min ago Process: 3308 ExecStop=/opt/spark/sbin/stop-master.sh (code=exited, status=0/SUCCESS) Process: 3339 ExecStart=/opt/spark/sbin/start-master.sh (code=exited, status=0/SUCCESS) Main PID: 3359 (java) Tasks: 27 (limit: 12544) Memory: 219.3M CGroup: /system.slice/spark-master.service 3359 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181.b13-9.el8.x86_64/jre/bin/java -cp /opt/spark/conf/:/opt/spark/jars/* -Xmx1g org.apache.spark.deploy.master.Master --host [...] Jan 11 16:30:00 rhel8lab.linuxconfig.org systemd[1]: Starting Apache Spark Master... Jan 11 16:30:00 rhel8lab.linuxconfig.org start-master.sh[3339]: starting org.apache.spark.deploy.master.Master, logging to /opt/spark/logs/spark-spark-org.apache.spark.deploy.master.Master-1[...]
Die letzte Zeile gibt auch die Hauptlogdatei des Masters an, die sich in den
logs
befindet Verzeichnis unter dem Spark-Basisverzeichnis,/opt/spark
in unserem Fall. Wenn wir uns diese Datei ansehen, sollten wir am Ende eine Zeile ähnlich dem folgenden Beispiel sehen:2019-01-11 14:45:28 INFO Master:54 - I have been elected leader! New state: ALIVE
Wir sollten auch eine Zeile finden, die uns sagt, wo die Master-Schnittstelle lauscht:
2019-01-11 16:30:03 INFO Utils:54 - Successfully started service 'MasterUI' on port 8080
Wenn wir einen Browser auf den Port
Spark-Master-Statusseite ohne angehängte Worker.8080
des Hostcomputers verweisen , sollten wir die Statusseite des Masters sehen, im Moment sind keine Worker angehängt.Beachten Sie die URL-Zeile auf der Statusseite des Spark-Masters. Dies ist dieselbe URL, die wir für die Einheitendatei jedes Slaves verwenden müssen, die wir in
step 5
erstellt haben .
Wenn wir im Browser die Fehlermeldung „Verbindung abgelehnt“ erhalten, müssen wir wahrscheinlich den Port auf der Firewall öffnen:# firewall-cmd --zone=public --add-port=8080/tcp --permanent success # firewall-cmd --reload success
- Unser Meister läuft, wir werden einen Sklaven daran anhängen. Wir starten den Slave-Dienst:
# systemctl start spark-slave.service
- Wir können überprüfen, ob unser Slave mit systemd läuft:
# systemctl status spark-slave.service spark-slave.service - Apache Spark Slave Loaded: loaded (/etc/systemd/system/spark-slave.service; disabled; vendor preset: disabled) Active: active (running) since Fri 2019-01-11 16:31:41 CET; 1h 3min ago Process: 3515 ExecStop=/opt/spark/sbin/stop-slave.sh (code=exited, status=0/SUCCESS) Process: 3537 ExecStart=/opt/spark/sbin/start-slave.sh spark://rhel8lab.linuxconfig.org:7077 (code=exited, status=0/SUCCESS) Main PID: 3554 (java) Tasks: 26 (limit: 12544) Memory: 176.1M CGroup: /system.slice/spark-slave.service 3554 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181.b13-9.el8.x86_64/jre/bin/java -cp /opt/spark/conf/:/opt/spark/jars/* -Xmx1g org.apache.spark.deploy.worker.Worker [...] Jan 11 16:31:39 rhel8lab.linuxconfig.org systemd[1]: Starting Apache Spark Slave... Jan 11 16:31:39 rhel8lab.linuxconfig.org start-slave.sh[3537]: starting org.apache.spark.deploy.worker.Worker, logging to /opt/spark/logs/spark-spar[...]
Diese Ausgabe liefert auch den Pfad zur Protokolldatei des Slaves (oder Workers), die sich im selben Verzeichnis befinden wird, mit „Worker“ im Namen. Wenn wir diese Datei überprüfen, sollten wir etwas Ähnliches wie die folgende Ausgabe sehen:
2019-01-11 14:52:23 INFO Worker:54 - Connecting to master rhel8lab.linuxconfig.org:7077... 2019-01-11 14:52:23 INFO ContextHandler:781 - Started o.s.j.s.ServletContextHandler@62059f4a{/metrics/json,null,AVAILABLE,@Spark} 2019-01-11 14:52:23 INFO TransportClientFactory:267 - Successfully created connection to rhel8lab.linuxconfig.org/10.0.2.15:7077 after 58 ms (0 ms spent in bootstraps) 2019-01-11 14:52:24 INFO Worker:54 - Successfully registered with master spark://rhel8lab.linuxconfig.org:7077
Dies zeigt an, dass der Worker erfolgreich mit dem Master verbunden ist. In derselben Protokolldatei finden wir eine Zeile, die uns die URL mitteilt, die der Worker abhört:
2019-01-11 14:52:23 INFO WorkerWebUI:54 - Bound WorkerWebUI to 0.0.0.0, and started at http://rhel8lab.linuxconfig.org:8081
Wir können unseren Browser auf die Statusseite des Workers verweisen, wo sein Master aufgelistet ist.
Spark-Worker-Statusseite, verbunden mit Master.In der Logdatei des Masters sollte eine Bestätigungszeile erscheinen:
2019-01-11 14:52:24 INFO Master:54 - Registering worker 10.0.2.15:40815 with 2 cores, 1024.0 MB RAM
Wenn wir jetzt die Statusseite des Masters neu laden, sollte der Worker dort auch erscheinen, mit einem Link zu seiner Statusseite.
Spark-Master-Statusseite mit einem angehängten Worker.Diese Quellen bestätigen, dass unser Cluster angeschlossen und betriebsbereit ist.
- Um eine einfache Aufgabe auf dem Cluster auszuführen, führen wir eines der Beispiele aus, die mit dem heruntergeladenen Paket geliefert werden. Betrachten Sie die folgende einfache Textdatei
/opt/spark/test.file
:line1 word1 word2 word3 line2 word1 line3 word1 word2 word3 word4
Wir führen die
wordcount.py
aus Beispiel darauf, das das Vorkommen jedes Wortes in der Datei zählt. Wir können denspark
verwenden Benutzer, keinroot
Berechtigungen erforderlich.$ /opt/spark/bin/spark-submit /opt/spark/examples/src/main/python/wordcount.py /opt/spark/test.file 2019-01-11 15:56:57 INFO SparkContext:54 - Submitted application: PythonWordCount 2019-01-11 15:56:57 INFO SecurityManager:54 - Changing view acls to: spark 2019-01-11 15:56:57 INFO SecurityManager:54 - Changing modify acls to: spark [...]
Während die Aufgabe ausgeführt wird, wird eine lange Ausgabe bereitgestellt. Gegen Ende der Ausgabe wird das Ergebnis angezeigt, der Cluster berechnet die benötigten Informationen:
2019-01-11 15:57:05 INFO DAGScheduler:54 - Job 0 finished: collect at /opt/spark/examples/src/main/python/wordcount.py:40, took 1.619928 s line3: 1 line2: 1 line1: 1 word4: 1 word1: 3 word3: 2 word2: 2 [...]
Damit haben wir unseren Apache Spark in Aktion gesehen. Zusätzliche Slave-Knoten können installiert und angeschlossen werden, um die Rechenleistung unseres Clusters zu skalieren.