GOOGLE ADS

sábado, 16 de abril de 2022

Spark NLP no funciona en PySpark: TypeError: el objeto 'JavaPackage' no se puede llamar

Estoy tratando de enviar una aplicación PySpark, pero cada vez que lo intento arroja este error cuando intenta descargar un modelo previamente entrenado de Spark NLP:

TypeError: 'JavaPackage' object is not callable

¿Alguna idea de lo que podría estar causando esto? Además, es interesante notar que he estado practicando con estas canalizaciones previamente entrenadas en un cuaderno jupyter y funcionó bien.

En caso de que sea relevante, estoy usando Java 8, Spark 3.2.1, PySpark 3.2.1y Spark NLP 3.4.0( Python 3.10también probé con 3.9).

También estoy usando un entorno pipenv.

Esta es la configuración de mi sesión de chispa:

packages = ",".join(
[
"org.apache.spark:spark-sql-kafka-0-10_2.12:3.0.1",
"com.amazonaws:aws-java-sdk:1.11.563",
"org.apache.hadoop:hadoop-aws:3.2.2",
"org.apache.hadoop:hadoop-client-api:3.2.2",
"org.apache.hadoop:hadoop-client-runtime:3.2.2",
"org.apache.hadoop:hadoop-yarn-server-web-proxy:3.2.2",
"com.johnsnowlabs.nlp:spark-nlp-spark32_2.12:3.4.2",
"org.mongodb.spark:mongo-spark-connector_2.12:3.0.1",
]
)
# Starts spark session
spark = (
SparkSession.builder.appName("twitter_app_nlp")
.master("local[*]")
.config("spark.jars.packages", packages)
.config("spark.streaming.stopGracefullyOnShutdown", "true")
.config(
"spark.hadoop.fs.s3a.aws.credentials.provider",
"org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider",
)
.config("spark.hadoop.fs.s3a.access.key", ACCESS_KEY)
.config("spark.hadoop.fs.s3a.secret.key", SECRET_ACCESS_KEY)
.config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
.config("spark.sql.shuffle.partitions", 3)
.config("spark.driver.memory", "8G")
.config("spark.driver.maxResultSize", "0")
.config("spark.kryoserializer.buffer.max", "2000M")
.config("spark.mongodb.input.uri", mongoDB)
.config("spark.mongodb.output.uri", mongoDB)
.getOrCreate()
)

He visto que instalar el FAT jar dentro del entorno normalmente lo resuelve. Lo hice y lo agregué a la sesión de chispa así:

.config('spark.jars.packages', '/Users/mac/.local/share/virtualenvs/tests-uPYwcfrj/lib/spark-nlp-assembly-3.4.3.jar')

Pero aún no funciona, también intenté publicar esa ruta .config('spark.driver.extraClassPath')pero tampoco tuve suerte.

También intenté usar --packages en el comando:

spark-submit main.py --files config.json \
--packages com.johnsnowlabs.nlp:spark-nlp-spark_2.12:3.4.3

Pero tampoco funcionó.


Solution of the problem

El spark-submitcomando tiene la opción --packagesde enumerar una biblioteca remota que no estoy seguro de que esté en el formato correcto.

tal vez intente

export NLPJAR='/Users/mac/.local/share/virtualenvs/tests-uPYwcfrj/lib/spark-nlp-assembly-3.4.3.jar'
spark-submit --jars $NLPJAR main.py

usando ruta absoluta o archivo:/URI porque la expansión del directorio no funciona --jars(no estoy seguro si el orden, opciones antes de la aplicación, es relevante) (ver Sumbitting Applications - Advanced Dependency Management ).

Si esto funciona, es posible que Spark no haya podido encontrar los JAR en su entorno pipenv, por lo que es necesario configurar las rutas en la configuración de Spark o usar la --driver-class-pathopción

Nota: el cambio spark.driver.extraClassPathen la configuración no tendrá ningún efecto en el modo cliente, y el valor predeterminado deploy-modees client(consulte el envío de solicitudes ).

No hay comentarios:

Publicar un comentario

Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...