Implementación de binarios de trabajo y función definida por el usuario de .NET para Apache Spark

En este artículo de procedimientos se proporcionan instrucciones generales sobre cómo implementar binarios de trabajo y función definida por el usuario de .NET para Apache Spark. Se conocen las variables de entorno que se van a configurar, así como algunos parámetros de uso común para iniciar aplicaciones con spark-submit.

Configuraciones

Las configuraciones muestran las variables de entorno generales y la configuración de parámetros para implementar los binarios de trabajo y función definida por el usuario de .NET para Apache Spark.

Variables de entorno

Al implementar trabajos y escribir UDF, hay algunas variables de entorno de uso común que puede que tenga que establecer:

Variable de entorno Descripción
DOTNET_WORKER_DIR Ruta de acceso donde se ha generado el binario de Microsoft.Spark.Worker.
La usa el controlador de Spark y se pasa a los ejecutores de Spark. Si esta variable no está configurada, los ejecutores de Spark buscan la ruta de acceso especificada en la variable de entorno PATH.
Por ejemplo, "C:\bin\Microsoft.Spark.Worker"
DOTNET_ASSEMBLY_SEARCH_PATHS Rutas de acceso separadas por comas donde Microsoft.Spark.Worker va a cargar los ensamblados.
Tenga en cuenta que si una ruta de acceso comienza por ".", el directorio de trabajo se antepone. Si está en modo Yarn, "." representaría el directorio de trabajo del contenedor.
Por ejemplo, "C:\Users\<nombre de usuario>\<miaplicaciónspark>\bin\Debug\<versión de dotnet>"
DOTNET_WORKER_DEBUG Si quiere depurar una UDF, establezca esta variable de entorno en 1 antes de ejecutar spark-submit.

Opciones de parámetros

Una vez que la aplicación Spark está agrupada, puede iniciarla mediante spark-submit. En la tabla siguiente se muestran algunas opciones usadas frecuentemente:

Nombre de parámetro Descripción
--class Punto de entrada de la aplicación.
Por ejemplo, org.apache.spark.deploy.dotnet.DotnetRunner
--master Dirección URL principal del clúster.
Por ejemplo, yarn
--deploy-mode Si se va a implementar el controlador en los nodos de trabajo (cluster) o localmente como un cliente externo (client).
Valor predeterminado: client
--conf Propiedad de configuración arbitraria de Spark en formato key=value.
Por ejemplo, spark.yarn.appMasterEnv.DOTNET_WORKER_DIR=.\worker\Microsoft.Spark.Worker
--files Lista separada por comas de archivos que se van a colocar en el directorio de trabajo de cada ejecutor.
  • Tenga en cuenta que esta opción solo se aplica al modo Yarn.
  • Admite la especificación de nombres de archivo con # de forma similar a Hadoop.
Por ejemplo, myLocalSparkApp.dll#appSeen.dll. La aplicación debe usar el nombre como appSeen.dll para hacer referencia a myLocalSparkApp.dll al ejecutarse en YARN.
--archives Lista separada por comas de archivos que se van a extraer en el directorio de trabajo de cada ejecutor.
  • Tenga en cuenta que esta opción solo se aplica al modo Yarn.
  • Admite la especificación de nombres de archivo con # de forma similar a Hadoop.
Por ejemplo, hdfs://<path to your worker file>/Microsoft.Spark.Worker.zip#worker. Esto copia y extrae el archivo zip en la carpeta worker.
application-jar Ruta de acceso a un archivo jar agrupado que incluye la aplicación y todas las dependencias.
Por ejemplo, hdfs://<ruta de acceso al archivo jar>/microsoft-spark-<versión>.jar
application-arguments Argumentos pasados al método principal de la clase principal, si la hubiera.
Por ejemplo, hdfs://<ruta de acceso a la aplicación>/<la aplicación>.zip <nombre de la aplicación> <argumentos de la aplicación>

Nota

Especifique todos los elementos --options antes de application-jar al iniciar aplicaciones con spark-submit; de lo contrario, se omiten. Para obtener más información, vea Opciones de spark-submit y Detalles para ejecutar Spark en YARN.

Preguntas más frecuentes

Cuando ejecuto una aplicación de Spark con UDF, obtengo un error FileNotFoundException. ¿Qué debo hacer?

Error: [Error] [TaskRunner] [0] Error de ProcessStream() con la excepción: System.IO.FileNotFoundException: Ensamblado 'mySparkApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' Archivo no encontrado: 'mySparkApp.dll'

Respuesta: Compruebe que la variable de entorno DOTNET_ASSEMBLY_SEARCH_PATHS se ha establecido correctamente. Debe ser la ruta de acceso que contiene mySparkApp.dll.

Después de actualizar la versión de .NET para Apache Spark y restablecer la variable de entorno DOTNET_WORKER_DIR, ¿por qué sigue apareciendo el siguiente error IOException?

Error: Tarea perdida 0.0 en fase 11.0 (TID 24, localhost, executor driver): java.io.IOException: No se puede ejecutar el programa "Microsoft.Spark.Worker.exe": CreateProcess error=2, No se puede encontrar el archivo especificado.

Respuesta: Primero pruebe a reiniciar la ventana de PowerShell (u otras ventanas de comandos) para que pueda tomar los valores de las variables de entorno más recientes. Luego inicie el programa.

Después de enviar la aplicación de Spark, obtengo el error System.TypeLoadException: Could not load type 'System.Runtime.Remoting.Contexts.Context'.

Error: [Error] [TaskRunner] [0] Error de ProcessStream() con la excepción: System.TypeLoadException: No se pudo cargar el tipo 'System.Runtime.Remoting.Contexts.Context' del ensamblado 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=...'.

Respuesta: Compruebe la versión de Microsoft.Spark.Worker que está usando. Hay dos versiones: .NET Framework 4.6.1 y .NET Core 3.1.x. En este caso, se debe usar Microsoft.Spark.Worker.net461.win-x64-<version> (que puede descargar), ya que System.Runtime.Remoting.Contexts.Context solo es para .NET Framework.

¿Cómo ejecuto la aplicación de Spark con UDF en YARN? ¿Qué variables de entorno y parámetros debo usar?

Respuesta: Para iniciar la aplicación de Spark en YARN, las variables de entorno deben especificarse como spark.yarn.appMasterEnv.[EnvironmentVariableName]. Vea a continuación un ejemplo con spark-submit:

spark-submit \
--class org.apache.spark.deploy.dotnet.DotnetRunner \
--master yarn \
--deploy-mode cluster \
--conf spark.yarn.appMasterEnv.DOTNET_WORKER_DIR=./worker/Microsoft.Spark.Worker-<version> \
--conf spark.yarn.appMasterEnv.DOTNET_ASSEMBLY_SEARCH_PATHS=./udfs \
--archives hdfs://<path to your files>/Microsoft.Spark.Worker.net461.win-x64-<version>.zip#worker,hdfs://<path to your files>/mySparkApp.zip#udfs \
hdfs://<path to jar file>/microsoft-spark-<spark_majorversion-spark_minorversion>_<scala_majorversion.scala_minorversion>-<spark_dotnet_version>.jar \
hdfs://<path to your files>/mySparkApp.zip mySparkApp

Pasos siguientes