Publié par
Il y a 1 année · 6 minutes · Data

PySpark sur votre IDE – Comment faire ?

sparkSpark est maintenant un framework incontournable pour le traitement massif de données. Il est aussi de plus en plus utilisé dans les équipes de développement de projets Data, surtout via son API principale en Scala. Qu’en est-il de Python ? Si cette API est elle aussi massivement utilisée, force est de constater qu’on la retrouve moins souvent dès qu’il s’agit de projets à packager et à mettre en production. Et on comprend pourquoi lorsque l’on voit la difficulté que l’on peut avoir pour simplement utiliser PySpark proprement dans son IDE, tant pour le développement que pour les tests.

Cet article a pour but de vous aider à outrepasser les difficultés d’utilisation de PySpark dans un IDE, pour ne pas se restreindre à son utilisation uniquement dans des notebooks ou en shell. Fini les « No module named pyspark » dans vos logs lorsque vous voulez tester votre code dans votre IDE, et surtout plus besoin de tout recoder en Scala pour intégrer proprement votre code dans un environnement de production.

Pré-requis

Cet article est présenté sur la base d’une distribution Anaconda, qui incorpore automatiquement toutes les principales bibliothèques Python et facilite l’installation de nouvelles. De plus, nous allons nous baser sur les IDE IntelliJ Idea et PyCharm, et supposer que vous travaillez sur un environnement Mac ou GNU/Linux.

Contrairement au Java ou au Scala, où vous avez simplement à spécifier dans vos configurations Maven ou SBT quelle version de Spark vous souhaitez utiliser, vous devez télécharger vous-même un exécutable de Spark pour travailler avec l’API Python dans votre projet. Téléchargez de préférence la version pré-buildée pour Hadoop 2.6 ou supérieur, et placez le dossier dézippé dans le répertoire de votre choix.

Non, Anaconda ne supporte pas pyspark par défaut

PySpark n’étant pas présent par défaut dans votre distribution Anaconda, il est nécessaire de rajouter les paths spécifiques dans ceux de l’interpréteur. Ces paths vont permettre de spécifier qu’en plus des bibliothèques présentes dans Anaconda, nous souhaitons utiliser le module Python de Spark.

Créez un nouveau projet Python dans votre IDE avec Anaconda comme interpréteur (pour IntelliJ, il faut avoir au préalable téléchargé le plugin Python).

Sur IntelliJ

  • File -> Project Structure -> SDKs -> votre interpréteur Anaconda
  • Cliquer sur « + »
  • Sélectionner le dossier python du répertoire spark: your_path_to_spark/spark-X.X.X-bin-hadoopX.X/python
  • « OK »
  • Cliquer une nouvelle fois sur « + »
  • Sélectionner le zip de py4j dans le dossier python/lib du répertroire Spark: your_path_to_spark/spark-X.X.X-bin-hadoopX.X/python/lib/py4j-X.X-src.zip
  • Cliquer sur OK
  • OK -> Apply -> OK

PySpark

Sur PyCharm

  • File -> Default Settings -> Project Interpreter -> votre interpréteur Anaconda
  • Cliquer sur l’icône « … » à droite du path de votre interpréteur, puis sur « More… », votre interpréteur, puis enfin sur le dernier icône en bas à droite (« Show paths for the selected interpreter »)
  • Cliquer sur « + »
  • Sélectionner le dossier python du répertoire spark: your_path_to_spark/spark-X.X.X-bin-hadoopX.X/python
  • « OK »
  • Cliquer une nouvelle fois sur « + »
  • Sélectionner le zip de py4j dans le dossier python/lib du répertroire Spark: your_path_to_spark/spark-X.X.X-bin-hadoopX.X/python/lib/py4j-X.X-src.zip
  • Cliquer sur OK
  • OK -> Apply -> OK

PySpark

Nous venons de spécifier à notre interpréteur Python qu’il doit aussi utiliser d’autres chemins afin de pouvoir détecter et utiliser les modules spécifiques à PySpark.

Tout est une histoire de variables d’environnement

Notre périple n’est pas encore terminé. Pour fonctionner correctement et sans erreur, votre projet doit avoir des variables d’environnement spécifiques qui vont permettre d’indiquer automatiquement les répertoires nécessaires à Spark. C’est un peu rébarbatif dans la mesure où ces chemins sont globalement les mêmes que lors de l’étape précédente, mais nécessaire pour vous éviter des erreurs du type « SPARK_HOME not recognized » quand vous lancez votre projet.

Que vous soyez sur IntelliJ ou PyCharm, effectuez les étapes suivantes pour ajouter les bonnes variables d’environnement à votre projet:

  • Run -> Edit Configurations -> Defaults -> Python
  • (Sur IntelliJ) Python Interpreter -> Use specified interpreter -> your Anaconda interpreter
  • Dans la section « Environment variables », cliquer sur « … »
  • Cliquer sur l’icône « + »
  • Name: PYTHONPATH
  • Value: your_path_to_spark/spark-X.X.X-bin-hadoopX.X/python:your_path_to_spark/spark-X.X.X-bin-hadoopX.X/python/lib/py4j-X.X-src.zip
  • Click again on « + »
  • Name: SPARK_HOME
  • Value: your_path_to_spark/spark-X.X.X-bin-hadoopX.X
  • OK -> Apply

PySpark

Félicitations ! Vous êtes maintenant prêt à utiliser PySpark sur votre IDE. À titre d’exemple, copiez le code suivant après avoir créé un fichier python dans votre projet (le code suppose que vous possédiez un README.md à la racine de votre projet) :

import os
from pyspark import SparkContext, SparkConf


def main():
    # Spark Configurations
    conf = SparkConf()
    conf.set("spark.master", "local[*]")
    conf = conf.setAppName('WordCount')
    sc = SparkContext(conf=conf)

    # Load README
    readme_rdd = sc.textFile(os.path.join(os.path.dirname(__file__), "../README.md"))

    # WordCount
    print (readme_rdd.flatMap(lambda line: line.split())
           .map(lambda word: (word.lower(), 1))
           .reduceByKey(lambda a, b: a + b)
           .map(lambda x: (x[1], x[0]))
           .sortByKey(ascending=False)
           .map(lambda x: (x[1], x[0]))).take(5)


if __name__ == "__main__":
    main()

Pas de bon développement sans tests

Développer un code propre dans votre IDE, c’est bien, mais quand il est testé, c’est encore mieux.

Si vous souhaitez tester du code spécifique à PySpark, les mêmes règles que pour la phase de développement s’appliquent: Il faut spécifier les bonnes variables d’environnement. Il est alors nécessaire de refaire toutes les étapes de la partie précédente pour la librairie de tests que vous utilisez (par exemple, Run -> Edit Configurations -> Defaults -> Python tests -> Unit tests). Et quitte à le faire pour une bibliothèque de tests, autant le faire pour toutes, afin de s’éviter tout problème si on change de bibliothèque par la suite !

Conclusion

Nous avons parcouru au travers de cet article toutes les configurations nécessaires au bon fonctionnement (développement et tests) de PySpark dans votre IDE IntelliJ ou PyCharm. Comme vous l’aurez compris, le chemin est légèrement plus fastidieux que pour du développement en Scala, mais une fois cela fait, vous bénéficiez des mêmes outils de développement propices à un code stable, testé et industrialisable.

Toutes les étapes précédentes ainsi qu’un projet simple sont résumés dans le répertoire Github suivant: https://github.com/ybenoit/pyspark-ide-starter

Yoann Benoit
Yoann est Data Scientist chez Xebia depuis près de deux ans. Il intervient sur de nombreux sujets autour de la Data Science et du Big Data, allant de la collecte, du traitement et de l'analyse des données jusqu'à la mise en production de pipelines complets de Machine Learning. Speaker et rédacteur à la fois sur les concepts et les technologies liées à la Data Science, il travaille principalement avec Python, Scala et Spark. Il intervient de plus en tant que formateur sur l'Analyse de Données et le Machine Learning sur Spark.

Une réflexion au sujet de « PySpark sur votre IDE – Comment faire ? »

  1. Publié par malouke, Il y a 11 mois

    salut yoann ,
    d’abord je te remercie pour ce tuto;
    je voulais te demander je suis sous windows il arrive soivent que les entreprise mette beacoup de restrictions sur les applications , si tu peux inclure ca dans tes postes comme réflexion;
    et je voulais savoir si t as deja eu ce pb :

    Traceback (most recent call last):
    File « C:\workspacecode\pyspark\pyspark\newway\.idea\test.py », line 25, in
    main()
    File « C:\workspacecode\pyspark\pyspark\newway\.idea\test.py », line 7, in main
    conf = SparkConf()
    File « C:\spark-2.0.0-bin-hadoop2.6\spark-2.0.0-bin-hadoop2.6\spark-2.0.0-bin-hadoop2.6\python\pyspark\conf.py », line 104, in __init__
    SparkContext._ensure_initialized()
    File « C:\spark-2.0.0-bin-hadoop2.6\spark-2.0.0-bin-hadoop2.6\spark-2.0.0-bin-hadoop2.6\python\pyspark\context.py », line 243, in _ensure_initialized
    SparkContext._gateway = gateway or launch_gateway()
    File « C:\spark-2.0.0-bin-hadoop2.6\spark-2.0.0-bin-hadoop2.6\spark-2.0.0-bin-hadoop2.6\python\pyspark\java_gateway.py », line 79, in launch_gateway
    proc = Popen(command, stdin=PIPE, env=env)
    File « C:\Users\s627098\AppData\Local\Continuum\Anaconda2\lib\subprocess.py », line 710, in __init__
    errread, errwrite)
    File « C:\Users\s627098\AppData\Local\Continuum\Anaconda2\lib\subprocess.py », line 958, in _execute_child
    startupinfo)
    WindowsError: [Error 2] Le fichier sp�cifi� est introuvable

    Process finished with exit code 0

    merci

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *