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! 🙂
davy.ai
Respuestas:
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:SparkR::dapply
, es necesario cargar explícitamente los paquetes en la función dapply utilizando las funcioneslibrary()
orequire()
. Sin embargo, el paquete instalado debería estar disponible por defecto si se ha instalado utilizando la funcióninstallRPackage()
, y no debería ser necesario cargar el paquete explícitamente.Incluir
install.packages
en la funciónSparkR::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óninstallRPackage()
y luego cargarlo en la función dapply utilizandolibrary()
orequire()
.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 comoSparkR::spark_apply()
oSparkR::sapply()
.Comentarios adicionales:
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.