Jupyter vs CLI: ejecución de Spark desde la línea de comandos

5/25
Recursos

Aportes 21

Preguntas 3

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

Si utilizas wsl2 y obtienes este error

 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Traceback (most recent call last):
File "/home/rb/Platzi/Escuela de Data Science/22.- Curso Introductorio de Spark/codeExample.py", line 3, in <module>

Es porque pySpark de momento solo es soportado hasta la versión 3.7.9 de python, en mi caso python3.8.2 es la versión por defecto con debian/ubuntu. En mis apuntes al terminar el curso dejo detallado como solucionar el error y algunos warnings

De momento esto hace el truco

La solución instala python 3.7

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.7

Modifica las variables de entorno

# de esto
export PYSPARK_PYTHON=python3

# a esto
export PYSPARK_PYTHON=python3.7

Despues de 4 horas batallando entre maquinas virtuales, instalación en windows y pruebas en google colab les dejo como logre hacer el ejemplo desde Google Colab, lo unico es que se deben agregar los archivos codeExamplepy y data.csv a colab cada vez que se inicie el trabajo, ya que cuando se cierra la conexión los archivos se borran.

https://bit.ly/3iCU0eU

Espero les funcione.

Que complicado este tipo de instalaciones, mal por el curso.

Para los que usan windows, pueden ejecutar spark-submit mediante cmd desde cualquier directorio, en este caso, para el ejemplo del video deben posicionarse en el directorio donde guardaron el ejemplo y desde ahí ejecutar spark-submit

Ejemplo:
\Users\IOS\Desktop\PLATZI\SPARK> spark-submit codeExample .py data.csv

##Path Java
export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"
export PATH=$JAVA_HOME/bin:$PATH

#Spark
export SPARK_HOME="/home/spark/spark"
export PATH=$SPARK_HOME:$PATH
export PYTHONPATH=$SPARK_HOME/python:$PYTHONPATH
export PYSPARK_PYTHON=python3

Se puede usar ‘spark-shell’ para abrir la shell en Scala o ‘pyspark’ para abrir la shell en un entorno de Python. Puede ser igual de cómodo para lanzar líneas de códigos individuales y hacer pruebas cortas. Si se hace de esta forma Spark crea automáticamente el contexto.

Hola, estuve checando el codigo, y observe que la operacion count() esta contando cuantas veces aparece, en este caso, el estado y el color. Para saber la suma del count, entonces se le tiene que agregar la operacion sum()

import sys

from pyspark.sql import SparkSession
from pyspark.sql.functions import count, sum as sum_

if __name__ == "__main__":
    #if len(sys.argv) != 2:
    #    print("Usage: mnmcount <file>", file=sys.stderr)
    #    sys.exit(-1)

    spark = (SparkSession
        .builder
        .appName("PythonMnMCount")
        .getOrCreate())
    # get the M&M data set file name
    mnm_file = sys.argv[1]
    # read the file into a Spark DataFrame
    mnm_df = (spark.read.format("csv")
        .option("header", "true")
        .option("inferSchema", "true")
        .load("D:/Spark Most Current/data.csv"))
    mnm_df.show(n=5, truncate=False)

    # find the aggregate count for California by filtering
    ca_count_mnm_df = ( mnm_df.select("*")
                       .where(mnm_df.State == 'CA')
                       .groupBy("State", "Color")
                       .agg(count("Count")
                            .alias("Total"), 
                           sum_("Count")
                           .alias("Total_Sum"))
                       .orderBy("Total", ascending=False) )

    # show the resulting aggregation for California
    ca_count_mnm_df.show(n=10, truncate=False)
+-----+------+-----+---------+
|State|Color |Total|Total_Sum|
+-----+------+-----+---------+
|CA   |Yellow|1807 |100956   |
|CA   |Green |1723 |93505    |
|CA   |Brown |1718 |95762    |
|CA   |Orange|1657 |90311    |
|CA   |Red   |1656 |91527    |
|CA   |Blue  |1603 |89123    |
+-----+------+-----+---------+

A veces me intriga mucho el como hay developers que prefieron CLI vs una buenas GUI; al final del dia en tu trabajo (hablo por experiencia), no evaluan el quien hace los comandos más complejos, sino quien aporta más valor a la empreza de una manera más rapida. Aun asi, guardo esta clase para el futuro 😄

Para todos aquellos con problemas por la versión de python.
En mi caso ya tenía instalado anaconda y una versión de python, lo que hice en la terminal de ubuntu fue crear un ambiente para Spark lo cual seguramente es incluso mejor que instalar paquetes en todo el ambiente y cambiar la versión de python que ya tenemos:

conda create --name Spark python=3.7
conda activate Spark
conda install py4j

esto aunado al export que han puesto en otros comentarios fue suficiente para lograr que el código de la clase corriera sin problemas.

https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html

Hola, tengo una duda, donde se usa:
from pyspark.sql.types import row
Es que no recuerdo donde se usa,

Tengo duda, que diferencia si instalo el core de Scala al de Spark, si al ejecutar el spark-shell me ejecuta el entorno de CLI de scala

Para los que estén utilizando Windows puede descargar cmdr para emular los comandos linux
https://cmder.net/

A ver como se ve en anaconda

Recuerden actualizar el archivo bashrc:
source .bashrc

Hola, ayuda por favor, me sale el siguiente error:
py4j.protocol.Py4JJavaError: An error occurred while calling o32.load

Si quieren usar la linea de comandos y evitar todos esos logs innecesarios, pueden editar el archivo conf/log4j.properties que se encuentra en su ruta de spark de esta forma:

# Set everything to be logged to the console
log4j.rootCategory=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

# Settings to quiet third party logs that are too verbose
log4j.logger.org.eclipse.jetty=WARN
log4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=WARN
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=WARN

Para los que quieran utilizar wsl2 con ubuntu les comparto un link para q puedan conectarse de manera gráfica y no sea todo línea de comandos.

video para conectarse de manera gráfica

Comandos de ejecución

Al final solo deben ejecutar un comando y conectarse por el escritorio remoto de windows

interesante

Me sale este error.

Si estan teniendo problemas con la instalación y configuración, acá les dejo una guía que hice “infalible” para Ubuntu. Están citadas todas las fuentes por si quieren ir mas al detalle. Para usuarios de windows recomiendo instalar wsl2 es mucho más práctico . https://drive.google.com/file/d/1Lk9YIfNtAd9CLvLZbRC9c5YlF1i1TQP6/view?usp=sharing

Si les sale el error:

WARN Utils: Your hostname resolves to a loopback address: 127.0.1.1; using 192.168.1.67 instead...

Se soluciona agregando la siguiente variable en .bashrc

export SPARK_LOCAL_IP="127.0.0.1"

Si les sale el error

Unable to load native-hadoop library

Se soluciona instalando python3.7. PySpark es compatible hasta la versión 3.7.9, así que hay que descargarla e instalarla.

https://www.python.org/downloads/release/python-379/

# Al descomprimirla se ubican en la carpeta y usan:
./configure
make
make install

Una vez hecho esto, modifican la variable:

export PYSPARK_PYTHON=python3
# por:
export PYSPARK_PYTHON=python3.7