Instalar Spark en Windows

Y no morir en el intento

Instalar Spark en Windows no es una tarea difícil, pero tampoco es un tema de pulsar Siguiente, Siguiente en un wizard. Es un poquito rollo, la verdad.

Como ya van varias veces que he tenido que instalarlo, mejor dejarlo por escrito para no tener que recordar todo esto la siguiente vez que tenga que hacerlo.

Es importante diferenciar Spark instalado de forma global de la versión embedida que trae el paquete de Python pyspark. Si lo que quieres es usar pyspark dentro de un entorno virtual, con instalar Java, pyspark como dependencia (obvio) y ayudar a Hadoop para no ver el molesto mensaje que muestra al arrancar (del que luego hablaremos más adelante), sería suficiente y no tendrías que hacer mucho más.

Java es obligario, ya lo hemos dicho (Spark está escrito en Scala). Puedes descargar un JRE (no es necesario un JDK) versión 8 o superior (aunque la apuesta segura parece es la versión 8). Recuerda activar durante la instalación (asumiendo te bajaste un fichero .msi) que se cree la variable de entorno JAVA_HOME (meter la ruta de de Java en el PATH lo hará ya de forma predeterminada el instalador). Al finalizar, tendrás el valor C:\Program Files\Zulu\zulu-8-jre\ en JAVA_HOME y la ruta C:\Program Files\Zulu\zulu-8-jre\bin\ añadida al PATH. Por último, puedes confirmar con java --version (o java -version según la versión que hayas instalado) que Java se instaló con éxito.

A continuación, le toca a Spark (recuerda que esto es siempre y cuando estés optando por instalarlo globalmente). Puedes descargarlo desde aquí. En el momento de escribir este post es Pre-built for Apache Hadoop 3.2 and later (lógicamente esto irá cambiando y tendrás que ir adaptando las rutas que verás a continuación). El fichero que te has descargado es un .tgz que puedes descomprimir con 7zip. En realidad, al descomprimirlo tendrás un fichero .tar que, de nuevo y usando 7zip, puedes volver a descomprimir. Finalmente tendrás una carpeta spark-3.1.2-bin-hadoop3.2 con un montón de ficheros dentro. Copiala en C:\spark\spark-3.1.2-bin-hadoop3.2.

La carpeta (C:\spark) cumple con la idea de crear una carpeta donde ir metiendo todo lo necesario y que esté bien organizado, pero el nombre podría ser cualquiera.

Agrega las siguientes variables de entorno:

  • SPARK_HOME con el valor C:\spark\spark-3.1.2-bin-hadoop3.2.
  • PATH con %SPARK_HOME%\bin.

A Hadoop hay que ayudarle siempre (con independencia de si estás instalando Spark de forma global o usando la versión embebida que trae pyspark). Para ello tendrás que descargar los ficheros winutils.exe y hadoop.dll desde https://github.com/cdarlint/winutils/ y copiarlos en C:\spark\winutils\hadoop-3.1.2 (otra opción, quizás más sencilla, es clonarse el repo en la carpeta C:\spark\winutils). Hayas usado una opción u otra, tendrás que establecer las siguientes variables de entorno:

  • HADOOP_HOME con C:\spark\winutils\hadoop-3.1.2.
  • PATH con %HADOOP_HOME%\bin.

winutils.exe podría darte guerra. Si lo ejecutas y sale una ventana de diálogo con el error The code execution cannot proceed because MSVCR100.dll was not found. Reinstalling the program may fix this problem. te tocará instalar Visual Studio 2010 (VC++ 10.0) SP1. Después de esto, winutils.exe no debería ser ya un problema.

Ahora sí, ejecuta spark-shell, ¡por fín!.

Prueba que el REPL funciona con spark.version y para salir tu amigo es :q (si al salir ves errores del tipo Failed to delete: <un directorio> no se lo tengas en cuenta).

Si además quieres probar pyspark en tu instalación global, tendrás que instalar Python 3.6+. La instalación de Python es sencilla pero recuerda activar al principio Add Python 3.x to PATH y al final Disable path length limit. En el PATH se te agregará, tanto C:\Users\azureuser\AppData\Local\Programs\Python\Python39\Scripts\ como C:\Users\azureuser\AppData\Local\Programs\Python\Python39\.

En mi caso es Python39 porque instalé Python 3.9.

Como estamos en racha, prueba ahora el REPL pyspark con la awesómica instrucción spark.version y sal con exit().

Como con el paso del tiempo, quizás quieras instalar de forma global distintas versiones de Spark/Hadoop, repite los pasos necesarios y para seleccionar una u otra, cambia el valor de las variables de entorno SPARK_HOME y HADOOP_HOME.

spark/
├─ spark-3.1.2-bin-hadoop3.2/
├─ winutils
│  ├─ hadoop-3.2.1/
│  │  ├─ bin/
│  │  │  ├─ winutils.exe
│  │  │  ├─ hadoop.dll

Si además tienes varias versiones de Python instaladas, con la variable PYSPARK_PYTHON puedes decirle a pyspark que versión de Python utilizar. Lo más habitual darle el valor de python a esta variable y así tomará la versión del entorno virtual donde se esté ejecutando. En Windows es especialmente útil esta variable porque su valor por defecto (python3) nos lleva a la tienda de Windows y eso no es bien (te dará un mensaje como el siguiente Python was not found; run without arguments to install from the Microsoft Store, or disable this shortcut from Settings > Manage App Execution Aliases).

Dicho todo esto, es importante recalcar que lo más sencillo parece “no” instalar pyspark en el global y usar siempre la librería como una dependencia.

¡Un saludo!