[Python] Hilo general

refresco

sigo con mis peleas. Estoy intentando conectarme a mi propia base de datos desde pyspark, si lo hago desde window lo ago sin problemas pero si lo hago desde wsl no puedo, me sale que no esta el driver cuando se lo estoy pasando a la hopra de iniciar la sesion.
Si conecto a la base de datos desde wsl directamente sin pasar por pyspark si puedo conectar,
alguien ha hecho algo aprecio? llevo toa la mañana con esto y he probado ya todo lo posible descargandome 0349853 conectores distintos

1 respuesta
Dr_Manhattan

#1861 A ver, no sé qué es lo que estás intentando ni de qué forma ya que no lo indicas, pero por hablar de uno de los problemas más comunes:

las librerías se instalan cuando se arranca el cluster, por mucho que le pases el driver cuando haces el spark.read.jdbc si el jar de postgres por ejemplo no está instalado no te va a funcionar. Tendrás que tener la librería disponible para cuando arranque la sesión de spark, por ejemplo usando spark.jars.packages

1 respuesta
refresco

#1862 no estoy probando en el cluster solo en wsl.
Me he bajado el conector y al cargar la sesión de pyspark le pongo spark.jars y le indico donde está el conector.

Luego al leer el csv en opciones le indico el driver com.mysql.jc o algo así pero no hay manera. Creo que no me falta ninguna librería

1 respuesta
Dr_Manhattan

#1863 pero para leer un csv no necesitas ningún conector, simplemente haces spark.read.csv + las opciones del header etc la librería estándar ya trae el csv

1 respuesta
refresco

#1864 perdon, quiero decir leer la base de datos

spark = SparkSession.builder \
    .appName("test") \
    .config("spark.driver.extraClassPath", "mysql-connector-j-8.4.0.jar") \
    .getOrCreate()
df = spark.read.format("jdbc").option("url","jdbc:mysql://ip:port/test").option("driver","com.mysql.jdbc.Driver").option("dbtable",'tabla_1').option("user",'user').option("password",'pass').load()
df.show()

en window me funciona pero en ubuntu no, alguna libreria me tiene que faltar porque no hay manera pero no lo veo

3 respuestas
Kaiserlau

#1865 te debe de estar sacando algun código de error la sesión al no conseguir la conexión. Estaría bien que lo miraras a ver si te da alguna pista.

1 respuesta
Dr_Manhattan

#1865 yo creo que el problema es la ruta del conector, mira la ruta absoluta, y asegúrate de que el jar está en esa ruta mediante la terminal de ubuntu

1 1 respuesta
refresco

#1866 el error que me escupe es que no me encuentra el conector

spoiler

#1867 como se hace eso? perdon por el retraso

1 respuesta
Slowbro

#1868 Creo que se refiere a esto,

...
.config("spark.driver.extraClassPath", "/ruta/en/wsl/al/archivo/mysql-connector-j-8.4.0.jar") 
...

Si no lo tienes en /home/refresco, prueba en lo que tengas montado en /mnt y su ubicacion en Windows.

1 respuesta
refresco

#1869 nada, sigue tirando como si no lo encontrara

W

#1865 Pon spark.jars:

spark = SparkSession.builder \
    .appName("test") \
    .config("spark.jars", "mysql-connector-j-8.4.0.jar") \
    .getOrCreate()

Y prueba ejecutando este comando:

spark-submit --jars mysql-connector-j-8.4.0.jar archivo_pyspark.py
refresco

bueno anoche de madruga consegui arreglarlo. Parece que era un problemas de versiones que no encontraba el connector por mas que se lo pasara.

Tenia una version de pyspark en la carpeta de spark y otra como libreria de python, lo que hice fue borrar la de la libreria de python y borrar todo spark.

Volver a instalar spark y comprobar que tenia solo una version de pyspark en el ordenador y era la de spark

whereis pyspark

. Finalmente meter el conector en la carpeta jar de spark y listo.

curl -O https://archive.apache.org/dist/spark/spark-3.5.1/spark-3.5.1-bin-hadoop3.tgz
sudo tar xvf spark-3.5.1-bin-hadoop3.tgz
sudo mkdir /opt/spark
sudo mv spark-3.5.1-bin-hadoop3/* /opt/spark
sudo chmod -R 777 /opt/spark
sudo apt-get install openjdk-8-jdk -y

Una vez meter este connector(https://dev.mysql.com/downloads/connector/j/5.1.html) mysql-connector-j-8.4.0.jar en la carpeta /opt/spark/jar/.

import pyspark
from pyspark.sql import SparkSession
print(pyspark.__version__)
spark = SparkSession.builder \
    .appName("PySpark MySQL Connection").getOrCreate()

df = spark.read.format("jdbc").option("url","jdbc:mysql://ip:port/nombre_base_datos").option("driver","com.mysql.cj.jdbc.Driver").option("dbtable",'tabla').option("user",'usuario').option("password",'pass').load()

Y asi os deberia ir si alguien tiene un problema parecio, si no pues mala suerte :(

1 respuesta
Dr_Manhattan

#1872 te juro que estuve a punto de comentarte lo de las versiones xddd me alegro de que lo hayas solucionado

1 respuesta
refresco

#1873 bueno asi no se me olvida, la proxma vez sedra lo primero que mire xd

2

Usuarios habituales