Apache Spark est un système informatique distribué. Il se compose d'un maître et d'un ou plusieurs esclaves, où le maître distribue le travail entre les esclaves, donnant ainsi la possibilité d'utiliser nos nombreux ordinateurs pour travailler sur une tâche. On pourrait deviner qu'il s'agit en effet d'un outil puissant dans lequel les tâches nécessitent de gros calculs, mais peuvent être divisées en plus petits blocs d'étapes qui peuvent être poussées vers les esclaves pour y travailler. Une fois que notre cluster est opérationnel, nous pouvons écrire des programmes à exécuter dessus en Python, Java et Scala.
Dans ce didacticiel, nous travaillerons sur une seule machine exécutant Red Hat Enterprise Linux 8 et installerons le maître et l'esclave Spark sur la même machine, mais gardez à l'esprit que les étapes décrivant la configuration de l'esclave peuvent être appliquées à n'importe quel nombre d'ordinateurs, créant ainsi un véritable cluster capable de traiter de lourdes charges de travail. Nous ajouterons également les fichiers d'unité nécessaires à la gestion et exécuterons un exemple simple sur le cluster fourni avec le package distribué pour nous assurer que notre système est opérationnel.
Dans ce didacticiel, vous apprendrez :
- Comment installer Spark maître et esclave
- Comment ajouter des fichiers unitaires systemd
- Comment vérifier la réussite de la connexion maître-esclave
- Comment exécuter un exemple de tâche simple sur le cluster
Coquille d'étincelle avec pyspark.
Configuration logicielle requise et conventions utilisées
Catégorie | Exigences, conventions ou version du logiciel utilisée |
---|---|
Système | Red Hat Enterprise Linux 8 |
Logiciel | Apache Spark 2.4.0 |
Autre | Accès privilégié à votre système Linux en tant que root ou via le sudo commande. |
Conventions | # - nécessite que les commandes linux données soient exécutées avec les privilèges root soit directement en tant qu'utilisateur root, soit en utilisant sudo commande$ – nécessite que les commandes linux données soient exécutées en tant qu'utilisateur normal non privilégié |
Comment installer Spark sur Redhat 8 instructions étape par étape
Apache Spark s'exécute sur JVM (Java Virtual Machine), donc une installation Java 8 fonctionnelle est nécessaire pour que les applications s'exécutent. En dehors de cela, plusieurs shells sont livrés dans le colis, l'un d'eux est pyspark
, un shell basé sur Python. Pour travailler avec cela, vous aurez également besoin de python 2 installé et configuré.
- Pour obtenir l'URL du dernier package de Spark, nous devons visiter le site de téléchargement de Spark. Nous devons choisir le miroir le plus proche de notre emplacement et copier l'URL fournie par le site de téléchargement. Cela signifie également que votre URL peut être différente de l'exemple ci-dessous. Nous allons installer le package sous
/opt/
, nous entrons donc dans le répertoire en tant queroot
:# cd /opt
Et envoyez l'URL acquise à
wget
pour obtenir le colis :# wget https://www-eu.apache.org/dist/spark/spark-2.4.0/spark-2.4.0-bin-hadoop2.7.tgz
- Nous allons décompresser l'archive :
# tar -xvf spark-2.4.0-bin-hadoop2.7.tgz
- Et créez un lien symbolique pour faciliter la mémorisation de nos chemins dans les étapes suivantes :
# ln -s /opt/spark-2.4.0-bin-hadoop2.7 /opt/spark
- Nous créons un utilisateur non privilégié qui exécutera les deux applications, maître et esclave :
# useradd spark
Et définissez-le comme propriétaire de l'ensemble
/opt/spark
répertoire, récursivement :# chown -R spark:spark /opt/spark*
- Nous créons un
systemd
fichier unité/etc/systemd/system/spark-master.service
pour le service maître avec le contenu suivant :[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
Et aussi un pour le service esclave qui sera
/etc/systemd/system/spark-slave.service.service
avec le contenu ci-dessous :[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
Notez l'URL spark en surbrillance. Ceci est construit avec
spark://<hostname-or-ip-address-of-the-master>:7077
, dans ce cas, la machine de laboratoire qui exécutera le maître a le nom d'hôterhel8lab.linuxconfig.org
. Le nom de votre maître sera différent. Tous les esclaves doivent être capables de résoudre ce nom d'hôte et d'atteindre le maître sur le port spécifié, qui est le port7077
par défaut. - Avec les fichiers de service en place, nous devons demander à
systemd
pour les relire :# systemctl daemon-reload
- Nous pouvons démarrer notre maître Spark avec
systemd
:# systemctl start spark-master.service
- Pour vérifier que notre maître est en cours d'exécution et fonctionnel, nous pouvons utiliser systemd status :
# 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[...]
La dernière ligne indique également le fichier journal principal du maître, qui se trouve dans les
logs
sous le répertoire de base de Spark,/opt/spark
dans notre cas. En regardant dans ce fichier, nous devrions voir une ligne à la fin similaire à l'exemple ci-dessous :2019-01-11 14:45:28 INFO Master:54 - I have been elected leader! New state: ALIVE
Nous devrions également trouver une ligne qui nous indique où l'interface Master écoute :
2019-01-11 16:30:03 INFO Utils:54 - Successfully started service 'MasterUI' on port 8080
Si nous pointons un navigateur vers le port
Page d'état principale Spark sans nœud de calcul attaché.8080
de la machine hôte , nous devrions voir la page d'état du maître, sans aucun nœud de calcul attaché pour le moment.Notez la ligne d'URL sur la page d'état du maître Spark. C'est la même URL que nous devons utiliser pour chaque fichier d'unité d'esclave que nous avons créé à l'
step 5
.
Si nous recevons un message d'erreur "connexion refusée" dans le navigateur, nous devons probablement ouvrir le port sur le pare-feu :# firewall-cmd --zone=public --add-port=8080/tcp --permanent success # firewall-cmd --reload success
- Notre maître est en marche, nous allons lui attacher un esclave. Nous démarrons le service esclave :
# systemctl start spark-slave.service
- Nous pouvons vérifier que notre esclave fonctionne avec systemd :
# 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[...]
Cette sortie fournit également le chemin d'accès au fichier journal de l'esclave (ou travailleur), qui sera dans le même répertoire, avec "travailleur" dans son nom. En vérifiant ce fichier, nous devrions voir quelque chose de similaire à la sortie ci-dessous :
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
Cela indique que le travailleur est correctement connecté au maître. Dans ce même fichier journal, nous trouverons une ligne qui nous indique l'URL sur laquelle le travailleur écoute :
2019-01-11 14:52:23 INFO WorkerWebUI:54 - Bound WorkerWebUI to 0.0.0.0, and started at http://rhel8lab.linuxconfig.org:8081
Nous pouvons pointer notre navigateur vers la page de statut du travailleur, où son maître est répertorié.
Page d'état du travailleur Spark, connectée au maître.Dans le fichier journal du maître, une ligne de vérification doit apparaître :
2019-01-11 14:52:24 INFO Master:54 - Registering worker 10.0.2.15:40815 with 2 cores, 1024.0 MB RAM
Si nous rechargeons la page de statut du maître maintenant, le travailleur devrait également y apparaître, avec un lien vers sa page de statut.
Page d'état principale Spark avec un travailleur attaché.Ces sources vérifient que notre cluster est connecté et prêt à fonctionner.
- Pour exécuter une tâche simple sur le cluster, nous exécutons l'un des exemples fournis avec le package que nous avons téléchargé. Considérez le fichier texte simple suivant
/opt/spark/test.file
:line1 word1 word2 word3 line2 word1 line3 word1 word2 word3 word4
Nous allons exécuter le
wordcount.py
exemple qui comptera l'occurrence de chaque mot dans le fichier. Nous pouvons utiliser lespark
utilisateur, pas deroot
privilèges nécessaires.$ /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 [...]
Lorsque la tâche s'exécute, une longue sortie est fournie. Vers la fin de la sortie, le résultat s'affiche, le cluster calcule les informations nécessaires :
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 [...]
Avec cela, nous avons vu notre Apache Spark en action. Des nœuds esclaves supplémentaires peuvent être installés et connectés pour faire évoluer la puissance de calcul de notre cluster.