Pandas udf error on EMR: class "io.netty.buffer.ArrowBuf"'

Estoy tratando de usar un pandas udf en un cuaderno de Jupyter en AWS EMR para nada. Primero intenté usar una función que hice, pero no pude conseguir que funcionara, así que intenté algunos ejemplos de respuestas a otras preguntas que encontré aquí, pero todavía no pude conseguir que funcionara. He probado este código:

from pyspark.sql.functions import pandas_udf, PandasUDFType
from pyspark.sql.types import *
import pyspark.sql.functions as F
import pyarrow

df = spark.createDataFrame([
    (1, "A", "X1"),
    (2, "B", "X2"),
    (3, "B", "X3"),
    (1, "B", "X3"),
    (2, "C", "X2"),
    (3, "C", "X2"),
    (1, "C", "X1"),
    (1, "B", "X1"),
], ["id", "type", "code"])

schema = StructType([
    StructField("code", StringType()),
])


@F.pandas_udf(schema, F.PandasUDFType.GROUPED_MAP)
def dummy_udaf(pdf):
    pdf = pdf[['code']]
    return pdf

df.groupBy('type').apply(dummy_udaf).show()

Y tengo este error:

Caused by: java.lang.SecurityException: class "io.netty.buffer.ArrowBuf"'s signer information does not match signer information of other classes in the same package

Lo intenté sin el pirrión de importación y tengo el mismo error. También usé otros códigos de respuestas sobre este tema y el resultado fue el mismo.

En el script bootstrap shell tengo una línea de instalación pip como sigue:

sudo python3 -m pip install pandas==0.24.2 pyarrow==0.14.1

He intentado con piarrow 0.15.1, pero nada cambió. ¿Tiene alguna idea de lo que está causando este error? ¡Gracias!

Pregunta hecha hace 3 años, 5 meses, 0 días - Por pixelpilot


3 Respuestas:

  • Establecer las siguientes versiones

    sudo python3 -m pip install pyarrow==0.14 pandas==1.1.4

    Respondida el Dec 16, 2020 a las 14:37 - por techscribe

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás viendo parece estar relacionado con problemas de compatibilidad entre las versiones de las bibliotecas que estás utilizando. Aquí te dejo algunas sugerencias que podrían ayudarte a solucionar este problema:

    • Asegúrate de que las versiones de `pandas` y `pyarrow` que estás utilizando son compatibles entre sí. Puedes encontrar una combinación de versiones que funcione bien juntas consultando la documentación oficial de ambas bibliotecas.
    • Intenta reinstalar las bibiliotecas con las versiones exactas que sabes que son compatibles. Puedes hacerlo utilizando el comando pip de la siguiente manera:
    bash
    sudo python3 -m pip install pandas==0.24.2 pyarrow==0.14.1
    
    • Verifica que no haya conflictos con otras bibliotecas o dependencias en tu entorno. A veces, tener múltiples versiones de una biblioteca instaladas puede causar problemas.
    • Verifica que estás instalando las bibliotecas en el mismo entorno donde se está ejecutando tu código, para evitar posibles conflictos.

    Si después de intentar estas soluciones el problema persiste, te recomendaría buscar en los foros o documentación específica de AWS EMR para ver si hay problemas conocidos o soluciones específicas para la implementación de Pandas UDF en ese entorno.

    Respondida el Dec 17, 2020 a las 14:33 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error "class "io.netty.buffer.ArrowBuf"'s signer information does not match signer information of other classes in the same package" indica que hay un problema con las firmas de los archivos JAR de PyArrow que utilizas en tu clúster EMR.

    Para resolver este problema, asegúrate de que todas las versiones de PyArrow JAR importadas a tu clúster tengan la misma firma. Puedes hacer esto descargando manualmente todos los JAR necesarios de los repositorios de PyArrow y cargándolos en tu clúster EMR.

    Aquí tienes una guía paso a paso sobre cómo hacer esto:

    • Descarga los JAR de PyArrow:

    Ve a https://repo1.maven.org/maven2/org/apache/arrow/ Descarga los siguientes JAR: arrow-core (la versión debe coincidir con la versión de pandas que estás utilizando) arrow-dataset (versión 0.15.1 o superior) arrow-memory (coincidir con la versión de arrow-core) arrow-vector (coincidir con la versión de arrow-core)

    • Sube los JAR a EMR:

    Utiliza scp u otro método para subir los JAR descargados a tu clúster EMR. Colócalos en un directorio como /usr/lib/spark/jars.

    • Actualiza la configuración de Spark:

    Añade las siguientes líneas a tu script de inicio de Spark ($SPARK_HOME/conf/spark-defaults.conf):

    
       spark.jars.packages=org.apache.arrow:arrow-core:1.0.0,org.apache.arrow:arrow-dataset:0.15.1,org.apache.arrow:arrow-memory:1.0.0,org.apache.arrow:arrow-vector:1.0.0
       spark.executor.extraClassPath=/usr/lib/spark/jars/:/usr/lib/spark/jars/arrow-core-.jar:/usr/lib/spark/jars/arrow-dataset-.jar:/usr/lib/spark/jars/arrow-memory-.jar:/usr/lib/spark/jars/arrow-vector-.jar
       spark.driver.extraClassPath=/usr/lib/spark/jars/:/usr/lib/spark/jars/arrow-core-.jar:/usr/lib/spark/jars/arrow-dataset-.jar:/usr/lib/spark/jars/arrow-memory-.jar:/usr/lib/spark/jars/arrow-vector-.jar
       

    • Reinicia el clúster EMR:

    Detén y vuelve a iniciar el clúster EMR para que se apliquen los cambios de configuración.

    Una vez que hayas seguido estos pasos, vuelve a intentar ejecutar tu código de Pandas UDF. Si el error persiste, asegúrate de que todas las instancias de Spark en tu clúster tienen las mismas versiones de PyArrow JAR instaladas y que la configuración de Spark está establecida correctamente.

    Respondida el Dec 17, 2020 a las 14:39 - por Gemini

    Votos positivos: 0 | Votos negativos: 0