Cómo ejecutar en conjunto InterSystems IRIS, Apache Spark y Jupyter Notebook

Primary tabs

¡Hola a todos!

Hoy instalaremos Jupyter Notebook y vamos a conectarlo con Apache Spark e InterSystems IRIS.

Nota: Los siguientes procedimientos los hice en Ubuntu 18.04 y Python 3.6.5.

Introducción

Si está buscando un bloc de notas que sea reconocido, difundido ampliamente y muy popular entre los usuarios de Python, en lugar de utilizar Apache Zeppelin, debería elegir Jupyter notebook. Jupyter notebook es una excelente y muy poderosa herramienta para la "ciencia de datos", que cuenta con una comunidad muy grande, además de muchas funciones y software adicional. Jupyter notebook les permite crear y compartir documentos que contienen código en tiempo real, ecuaciones, visualizaciones y texto narrativo. Sus aplicaciones incluyen la limpieza y transformación de los datos, simulaciones numéricas, modelamiento estadístico, visualización de datos, aprendizaje automático y muchas funciones más. Y lo más importante, existe una gran comunidad que les ayudará a resolver todos los problemas que tengan.

Requerimientos

Si algo no funciona adecuadamente, consulte la sección "Posibles problemas y soluciones" que se encuentra en la parte inferior del artículo.

En primer lugar, asegúrese de que cuenta con Java 8 (java -version devuelve la versión "1.8.x"). A continuación, descargue Apache Spark y descomprímalo. Después, ejecute las siguientes líneas de comando en el terminal:

pip3 install jupyter

pip3 install toree

jupyter toree install --spark_home=/path_to_spark/spark-2.3.1-bin-hadoop2.7 --interpreters=PySpark --user

Ahora, abra el terminal y ejecute vim ~/.bashrc. Inserte el siguiente código en la parte inferior (estas son variables de entorno):

 export JAVA_HOME=/usr/lib/jvm/installed java 8
 export PATH="$PATH:$JAVA_HOME/bin"
 export SPARK_HOME=/path to spark/spark-2.3.1-bin-hadoop2.7
 export PATH="$PATH:$SPARK_HOME/bin"
 export PYSPARK_DRIVER_PYTHON=jupyter
 export PYSPARK_DRIVER_PYTHON_OPTS="notebook"

Por último, ejecute source ~/.bashrc. Esto para que cargue las nuevas variables.

Compruebe que funciona adecuadamente

Ahora, iniciemos Jupyter Notebook. Ejecute pyspark en el terminal.

Abra en su navegador el resultado de la URL. Debería parecerse a la imagen que se muestra a continuación:

 

Haga clic en la opción New, seleccione Python 3 e inserte el siguiente código en un párrafo:

import sys
print(sys.version)
sc

El resultado debería parecerse a esto:

Detenga Jupyter utilizando Ctrl-c en el terminal.

Nota: Para añadir archivos jar personalizados simplemente mueva los archivos que desee hacia $SPARK_HOME/jars.

Entonces, lo que queremos es trabajar con intersystems-jdbc e intersystems-spark (también necesitaremos una biblioteca jpmml). Vamos a copiar los archivos jar necesarios en Spark. Ejecute las siguientes líneas de comando en el terminal:

sudo cp /path to intersystems iris/dev/java/lib/JDK18/intersystems-jdbc-3.0.0.jar /path to spark/spark-2.3.1-bin-hadoop2.7/jars

sudo cp /path to intersystems iris/dev/java/lib/JDK18/intersystems-spark-1.0.0.jar /path to spark/spark-2.3.1-bin-hadoop2.7/jars

sudo cp /path to jpmml/jpmml-sparkml-executable-version.jar /path to spark/spark-2.3.1-bin-hadoop2.7/jars

Asegúrese de que funcionan bien. Ejecute de nuevo pyspark en el terminal y también ejecute el siguiente código (que se mostró en el artículo anterior):

from pyspark.ml.linalg import Vectors
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.clustering import KMeans
from pyspark.ml import Pipeline
from pyspark.ml.feature import RFormula
from pyspark2pmml import PMMLBuilder

dataFrame=spark.read.format("com.intersystems.spark").\
option("url", "IRIS://localhost:51773/NAMESPACE").option("user", "dev").\
option("password", "123").\
option("dbtable", "DataMining.IrisDataset").load() # load iris dataset

(trainingData, testData) = dataFrame.randomSplit([0.7, 0.3]) # split the data into two sets
assembler = VectorAssembler(inputCols = ["PetalLength", "PetalWidth", "SepalLength", "SepalWidth"], outputCol="features") # add a new column with features

kmeans = KMeans().setK(3).setSeed(2000) # clustering algorithm that we use

pipeline = Pipeline(stages=[assembler, kmeans]) # First, passed data will run against assembler and after will run against kmeans.
modelKMeans = pipeline.fit(trainingData) # pass training data

pmmlBuilder = PMMLBuilder(sc, dataFrame, modelKMeans)
pmmlBuilder.buildFile("KMeans.pmml") # create pmml model

Este es el resultado que obtuve:

El archivo resultante es un modelo jpmml que se realizó con kmeans. ¡Todo funciona bien!

Posibles problemas y soluciones

  • No se encontró el comando: 'jupyter':
  1. vivim ~/bashrc;
  2. Agregue en la parte inferior export PATH="$PATH:~/.local/bin";
  3. En la fuente del terminal ~/.bashrc.
  4. Si esto no soluciona el problema, reinstale pip3 y jupyter.
  • No existe el archivo o directorio env: 'jupyter':
  1. En ~/.bashrc export PYSPARK_DRIVER_PYTHON=/home/.../.local/bin/jupyter.
  • TypeError: no es posible llamar al objeto 'JavaPackage':
  1. Compruebe que el archivo necesario con la extensión .jar se encuentra en /.../spark-2.3.1-bin-hadoop2.7/jars;
  2. Reinicie el bloc de notas.
  • El proceso para la puerta de enlace en Java finalizó antes de que el controlador envíe su número de puerto:
  1. La versión que utiliza de Java debería ser la 8 (probablemente funciona también con Java 6 o 7, pero no lo he comprobado),
  2. echo $JAVA_HOME le permitirá conseguir la versión 8 de Java. En caso de que no lo haga, cambie la ruta en ~/.bashrc.
  3. Inserte el comando sudo update-alternatives --config java  en el terminal y seleccione una versión adecuada de Java.
  4. Inserte el comando sudo update-alternatives --config javac  en el terminal y seleccione una versión adecuada de Java.
  • PermissionError: [Errno 13] Permission denied: '/usr/local/share/jupyter'
  1. Agregue el nombre de usuario al final de su comando, en el terminal
  • Se produjo un error al ejecutar el comando de Jupyter 'toree': Errno 2], o no existe ese archivo o el directorio
  1. Ejecute el comando sin el sudo.
  • Puede aparecer un error específico si utiliza variables de sistema como PYSPARK_SUBMIT_ARGS y otras variables de spark/pyspark, o debido los cambios en /.../spark-2.3.1-bin-hadoop2.7/conf/spark-env.sh
  1. Elimine estas variables y compruebe la configuración de spark-env.sh.

Si todo esta ok, ya tienes tu ambiente Jupyter, Spark e IRIS funcionando!