es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Biblioteca SparkR::dapply no reconocida.

Introducción:

He instalado algunos paquetes en un clúster de Databricks utilizando install.packages en DR 9.1 LTS, y quiero ejecutar una UDF utilizando R & Spark (SparkR o sparklyr). Mi caso de uso es puntuar algunos datos en lotes utilizando Spark (ya sea SparkR o sparklyr). Actualmente he elegido SparkR::dapply. El principal problema es que los paquetes instalados no parecen estar disponibles en los trabajadores utilizando SparkR::dapply.

Código (información reducida y revisada para privacidad):

install.packages("lda", repos = "https://cran.microsoft.com/snapshot/2021-12-01/")
my_data<- read.csv('/dbfs/mnt/container/my_data.csv')
my_data_sdf <- as.DataFrame(my_data)

schema <- structType(structField("Var1", "integer"),structField("Var2", "integer"),structField("Var3", "integer"))

df1 <- SparkR::dapply(my_data_sdf , function(my_data) {
  # lda #
  #install.packages("lda", repos = "https://cran.microsoft.com/snapshot/2021-12-01/")
  library( lda )
return(my_data_sdf)
}, schema)

display(df1)

Mensaje de error (alguna información redacted con ‘X’):

org.apache.spark.SparkException: Trabajo abortado debido a falla en la etapa: La tarea 0 en la etapa 3.0 falló 4 veces, la falla más reciente: Se perdió la tarea 0.3 en la etapa 3.0 (TID 9) (X0.XXX.X.X ejecutor 0): org.apache.spark.SparkException: R salió inesperadamente.
El trabajador de R produjo errores: Error en library(lda) : there is no package called ‘lda’
Llamadas: compute -> computeFunc -> library
La ejecución se detuvo

Sistema/Hardware:

  • Azure Databricks
  • Databricks Runtime 9.1 LTS (min 2 workers max 10)
  • Hardware del trabajador = StandardDS5v2
  • Hardware del driver = StandardD32sv2

Notas:

  • Si utilizo ‘require’ no se devuelve ningún mensaje de error, pero ‘require’ está diseñado para no devolver un mensaje de error.
  • Puedo ejecutar SparkR::dapply y realizar operaciones, pero una vez que agrego library(lda) obtengo un mensaje de error aunque haya instalado lda y esté utilizando DR 9.1 LTS.
  • Estoy utilizando una instantánea recomendada de CRAN para instalar – https://learn.microsoft.com/en-us/azure/databricks/kb/r/pin-r-packages
  • Estoy utilizando DR 9.1 LTS que (a mi entender) hace que los paquetes instalados estén disponibles para los trabajadores – “A partir de Databricks Runtime 9.0, los paquetes de R son accesibles tanto para los nodos trabajadores como para el nodo controlador.” – https://learn.microsoft.com/en-us/azure/databricks/libraries/notebooks-r-libraries
    • Si incluyo install.packages(“lda”, repos = “https://cran.microsoft.com/snapshot/2021-12-01/”) en dapply, entonces funciona sin error, pero esto no parece ser la mejor práctica a partir de la documentación.

Preguntas:

  • ¿Cómo instalo paquetes de R en clústeres de Databricks para que estén disponibles en todos los nodos? ¿Cuál es el enfoque adecuado?
  • ¿Cómo puedo asegurarme de que mis paquetes estén disponibles para SparkR::dapply?
  • ¿Qué piensan de incluir install.packages en la función dapply en sí?
  • ¿Debería probar algo que no sea SparkR::dapply?

¡Gracias a todos! 🙂

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Respuestas:

    1. Para instalar paquetes de R en clústeres de Databricks y que estén disponibles en todos los nodos, el enfoque adecuado es utilizar la función installRPackage() provista por Databricks. Esta función instala paquetes de R en todos los nodos del clúster, y también asegura que el paquete sea instalado solo una vez por clúster. El comando para instalar el paquete “lda” sería:
      installRPackage("lda")
      
    2. Para asegurarse de que los paquetes estén disponibles para SparkR::dapply, es necesario cargar explícitamente los paquetes en la función dapply utilizando las funciones library() o require(). Sin embargo, el paquete instalado debería estar disponible por defecto si se ha instalado utilizando la función installRPackage(), y no debería ser necesario cargar el paquete explícitamente.
    3. Incluir install.packages en la función SparkR::dapply no es un enfoque recomendado ya que instalará el paquete cada vez que se llame a la función, lo que puede ser ineficiente y consumir tiempo. Es mejor instalar el paquete una vez utilizando la función installRPackage() y luego cargarlo en la función dapply utilizando library() o require().

    4. En este caso particular, SparkR::dapply parece apropiado para puntuar los datos en modo por lotes. Sin embargo, si necesita puntuación en tiempo real y baja latencia, debería considerar el uso de otras APIs de Spark como SparkR::spark_apply() o SparkR::sapply().

    Comentarios adicionales:

    • Es posible que el paquete lda no sea compatible con la versión de R o Spark que se está utilizando en el clúster. En ese caso, es posible que necesite instalar una versión diferente del paquete o actualizar/rebajar la versión de R o Spark para que funcione.
    • También es posible que haya ocurrido un error en el proceso de instalación del paquete, y que el paquete no se haya instalado correctamente. Debería revisar los registros de instalación y asegurarse de que el paquete se haya instalado sin errores.

Comments are closed.