java español - Agregue frascos a un trabajo de chispa-spark-submit




qué inglés (5)

ClassPath:

ClassPath se ve afectado en función de lo que proporcione. Hay un par de maneras de establecer algo en el classpath:

  • spark.driver.extraClassPath o su alias --driver-class-path para establecer classpaths adicionales en el nodo que ejecuta el controlador.
  • spark.executor.extraClassPath para establecer una ruta de clase adicional en los nodos Worker.

Si desea que se efectúe un JAR determinado tanto en el Maestro como en el Trabajador, debe especificarlos por separado en AMBOS indicadores.

Carácter de separación:

Siguiendo las mismas reglas que la JVM :

  • Linux: A dos puntos :
    • por ejemplo: --conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar"
  • Windows: un punto ; coma ;
    • por ejemplo: --conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar;/opt/prog/aws-java-sdk-1.10.50.jar"

Distribución de archivos:

Esto depende del modo bajo el cual está ejecutando su trabajo:

  1. Modo cliente: Spark activa un servidor Netty HTTP que distribuye los archivos al inicio de cada uno de los nodos trabajadores. Puedes ver eso cuando comienzas tu trabajo Spark:

    16/05/08 17:29:12 INFO HttpFileServer: HTTP File server directory is /tmp/spark-48911afa-db63-4ffc-a298-015e8b96bc55/httpd-84ae312b-5863-4f4c-a1ea-537bfca2bc2b
    16/05/08 17:29:12 INFO HttpServer: Starting HTTP Server
    16/05/08 17:29:12 INFO Utils: Successfully started service 'HTTP file server' on port 58922.
    16/05/08 17:29:12 INFO SparkContext: Added JAR /opt/foo.jar at http://***:58922/jars/com.mycode.jar with timestamp 1462728552732
    16/05/08 17:29:12 INFO SparkContext: Added JAR /opt/aws-java-sdk-1.10.50.jar at http://***:58922/jars/aws-java-sdk-1.10.50.jar with timestamp 1462728552767
    
  2. Modo de clúster: en el modo de clúster, la chispa selecciona un nodo de trabajador líder para ejecutar el proceso de controlador. Esto significa que el trabajo no se está ejecutando directamente desde el nodo maestro. Aquí, Spark no configurará un servidor HTTP. Tienes que poner tus JARS manualmente a disposición de todos los nodos de trabajadores a través de HDFS / S3 / Otras fuentes que están disponibles para todos los nodos.

URI aceptados para archivos

En "Enviar aplicaciones" , la documentación de Spark hace un buen trabajo al explicar los prefijos aceptados para los archivos:

Al usar spark-submit, el jar de la aplicación junto con los jars incluidos con la opción --jars se transferirán automáticamente al clúster. Spark usa el siguiente esquema de URL para permitir diferentes estrategias para diseminar tarros:

  • archivo: - Rutas y archivos absolutos: / Los URI son servidos por el servidor de archivos HTTP del controlador, y cada ejecutor extrae el archivo desde el servidor HTTP del controlador.
  • hdfs :, http :, https :, ftp: - estos extraen archivos y JAR del URI como se esperaba
  • local: se espera que exista un URI que comience con local: / / como un archivo local en cada nodo de trabajador. Esto significa que no se incurrirá en IO de red, y funciona bien para archivos / JAR grandes que se envían a cada trabajador o se comparten a través de NFS, GlusterFS, etc.

Tenga en cuenta que los JAR y los archivos se copian en el directorio de trabajo para cada SparkContext en los nodos ejecutores.

Como se indicó, los JAR se copian en el directorio de trabajo para cada nodo Worker. Donde exactamente es eso? Por lo general, bajo /var/run/spark/work , los verás así:

drwxr-xr-x    3 spark spark   4096 May 15 06:16 app-20160515061614-0027
drwxr-xr-x    3 spark spark   4096 May 15 07:04 app-20160515070442-0028
drwxr-xr-x    3 spark spark   4096 May 15 07:18 app-20160515071819-0029
drwxr-xr-x    3 spark spark   4096 May 15 07:38 app-20160515073852-0030
drwxr-xr-x    3 spark spark   4096 May 15 08:13 app-20160515081350-0031
drwxr-xr-x    3 spark spark   4096 May 18 17:20 app-20160518172020-0032
drwxr-xr-x    3 spark spark   4096 May 18 17:20 app-20160518172045-0033

Y cuando mires adentro, verás todos los JAR desplegados:

[*@*]$ cd /var/run/spark/work/app-20160508173423-0014/1/
[*@*]$ ll
total 89988
-rwxr-xr-x 1 spark spark   801117 May  8 17:34 awscala_2.10-0.5.5.jar
-rwxr-xr-x 1 spark spark 29558264 May  8 17:34 aws-java-sdk-1.10.50.jar
-rwxr-xr-x 1 spark spark 59466931 May  8 17:34 com.mycode.code.jar
-rwxr-xr-x 1 spark spark  2308517 May  8 17:34 guava-19.0.jar
-rw-r--r-- 1 spark spark      457 May  8 17:34 stderr
-rw-r--r-- 1 spark spark        0 May  8 17:34 stdout

Opciones afectadas:

Lo más importante para entender es la prioridad . Si pasas cualquier propiedad por código, tendrá prioridad sobre cualquier opción que especifiques mediante spark-submit . Esto se menciona en la documentación de Spark:

Todos los valores especificados como indicadores o en el archivo de propiedades se pasarán a la aplicación y se fusionarán con los especificados a través de SparkConf. Las propiedades establecidas directamente en SparkConf toman la mayor prioridad , luego las banderas pasan a spark-submit o spark-shell, luego las opciones en el archivo spark-defaults.conf

Así que asegúrese de establecer esos valores en los lugares adecuados, para que no se sorprenda cuando uno tiene prioridad sobre el otro.

Analicemos cada opción en cuestión:

  • --jars vs SparkContext.addJar : Estos son idénticos, solo uno se configura a través del envío de chispa y otro a través del código. Elija el que mejor se adapte a usted. Una cosa importante a tener en cuenta es que el uso de cualquiera de estas opciones no agrega el JAR a su classpath de controlador / ejecutor , tendrá que agregarlas explícitamente usando la configuración de extraClassPath en ambos.
  • SparkContext.addJar vs SparkContext.addFile : use el anterior cuando tenga una dependencia que deba usarse con su código. Utilice este último cuando simplemente desee pasar un archivo arbitrario a sus nodos de trabajador, que no es una dependencia en tiempo de ejecución en su código.
  • --conf spark.driver.extraClassPath=... o --driver-class-path : estos son alias, no importa cuál elijas
  • --conf spark.driver.extraLibraryPath=..., or --driver-library-path ... Igual que el anterior, alias.
  • --conf spark.executor.extraClassPath=... : Use esto cuando tenga una dependencia que no se pueda incluir en un JAR súper (por ejemplo, porque hay conflictos de tiempo de compilación entre las versiones de la biblioteca) y que necesita cargar en tiempo de ejecución.
  • --conf spark.executor.extraLibraryPath=... Esto se pasa como la opción java.library.path para JVM. Úselo cuando necesite una ruta de biblioteca visible para la JVM.

¿Sería seguro asumir que, para simplificar, puedo agregar archivos jar de aplicación adicionales usando las 3 opciones principales al mismo tiempo:

Puede asumirlo de forma segura solo para el modo Cliente, no para el modo Grupo. Como dije anteriormente. Además, el ejemplo que dio tiene algunos argumentos redundantes. Por ejemplo, pasar --driver-library-path a --driver-library-path es inútil, debe pasarlos a extraClassPath si desea que estén en su classpath. En definitiva, lo que quiere hacer cuando implementa JAR externos tanto en el controlador como en el trabajador es:

spark-submit --jars additional1.jar,additional2.jar \
  --driver-class-path additional1.jar:additional2.jar \
  --conf spark.executor.extraClassPath=additional1.jar:additional2.jar \
  --class MyClass main-application.jar

Es cierto ... se ha discutido bastante.

Sin embargo, hay mucha ambigüedad y algunas de las respuestas proporcionadas ... incluyendo la duplicación de referencias de jar en la configuración / opciones de jars / executor / driver.

Los detalles ambiguos y / u omitidos

Se debe aclarar la ambigüedad, los detalles poco claros y / u omitidos para cada opción:

  • Cómo se ve afectado ClassPath
    • Conductor
    • Ejecutor (para tareas en ejecución)
    • Ambos
    • De ningún modo
  • Carácter de separación: coma, dos puntos, punto y coma
  • Si los archivos proporcionados se distribuyen automáticamente
    • para las tareas (para cada ejecutor)
    • para el controlador remoto (si se ejecutó en el modo de clúster)
  • tipo de URI aceptado: archivo local, hdfs, http, etc.
  • Si se copia en una ubicación común, ¿dónde está esa ubicación (hdfs, local?)

Las opciones a las que afecta:

  1. --jars
  2. SparkContext.addJar(...)
  3. SparkContext.addFile(...)
  4. --conf spark.driver.extraClassPath=... o --driver-class-path ...
  5. --conf spark.driver.extraLibraryPath=... , o --driver-library-path ...
  6. --conf spark.executor.extraClassPath=...
  7. --conf spark.executor.extraLibraryPath=...
  8. para no olvidar, el último parámetro de spark-submit es también un archivo .jar.

Soy consciente de dónde puedo encontrar la documentación principal de chispa , y específicamente sobre cómo enviar , las options disponibles, y también el JavaDoc . Sin embargo, eso me dejó todavía algunos agujeros, aunque también respondió parcialmente.

Espero que no sea tan complejo y que alguien pueda darme una respuesta clara y concisa.

Si --jars que adivinar a partir de la documentación, parece que --jars , y los SparkContext addJar y addFile son los que distribuirán automáticamente los archivos, mientras que las otras opciones simplemente modifican el ClassPath.

¿Sería seguro asumir que, para simplificar, puedo agregar archivos jar de aplicación adicionales usando las 3 opciones principales al mismo tiempo:

spark-submit --jar additional1.jar,additional2.jar \
  --driver-library-path additional1.jar:additional2.jar \
  --conf spark.executor.extraLibraryPath=additional1.jar:additional2.jar \
  --class MyClass main-application.jar

Encontré un buen artículo sobre una respuesta a otra publicación . Sin embargo, nada nuevo aprendido. El póster hace un buen comentario sobre la diferencia entre el controlador local (hilo-cliente) y el controlador remoto (hilo-clúster). Definitivamente importante a tener en cuenta.


Existe una restricción en el uso de --jars si desea especificar un directorio para la ubicación del archivo jar / xml, no permite expansiones de directorio. Esto significa que debe especificar la ruta absoluta para cada jar. si especifica --driver-class-path y lo está ejecutando en modo hilera cluster, la clase de controlador no se actualiza. Podemos verificar si la ruta de clases se actualiza o no en spark ui o en el servidor de historial de chispas en el entorno de pestañas. La opción que me sirvió para pasar tarros que contenían expansiones de directorios y que funcionaba en el modo hilado de clúster era la opción --conf. Es mejor pasar las rutas de las clases de controlador y ejecutor como --conf, que las agrega al objeto de sesión de inicio y esas rutas se reflejan en la Configuración de chispa. Pero asegúrese de poner tarros en la misma ruta en el clúster.

spark-submit --master yarn --queue spark_queue --deploy-mode cluster    --num-executors 12 --executor-memory 4g --driver-memory 8g --executor-cores 4 --conf spark.ui.enabled=False --conf spark.driver.extraClassPath=/usr/hdp/current/hbase-master/lib/hbase-server.jar:/usr/hdp/current/hbase-master/lib/hbase-common.jar:/usr/hdp/current/hbase-master/lib/hbase-client.jar:/usr/hdp/current/hbase-master/lib/zookeeper.jar:/usr/hdp/current/hbase-master/lib/hbase-protocol.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/scopt_2.11-3.3.0.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/spark-examples_2.10-1.1.0.jar:/etc/hbase/conf --conf spark.hadoop.mapred.output.dir=/tmp --conf spark.executor.extraClassPath=/usr/hdp/current/hbase-master/lib/hbase-server.jar:/usr/hdp/current/hbase-master/lib/hbase-common.jar:/usr/hdp/current/hbase-master/lib/hbase-client.jar:/usr/hdp/current/hbase-master/lib/zookeeper.jar:/usr/hdp/current/hbase-master/lib/hbase-protocol.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/scopt_2.11-3.3.0.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/spark-examples_2.10-1.1.0.jar:/etc/hbase/conf --conf spark.hadoop.mapreduce.output.fileoutputformat.outputdir=/tmp

Aquí está el comando spark submit ........

<path to spark directory>/spark-submit --class <specify the path of the class which contains main method> --jars <specify the all the necessary jars required with comma separated> --master <specify deployment mode eg: yarn-client/local> --num-executors <specify executor> --conf <specify required configurations> --executor-cores <specify cores> --executor-memory <specify executor memory>G --driver-memory <specify driver memory>g <specify the jar of the application> <specify the argument to main method if it is there>

Otro enfoque en la spark 2.1.0 es usar --conf spark.driver.userClassPathFirst=true durante spark-submit, que cambia la prioridad de la carga de dependencia, y por lo tanto el comportamiento de la chispa, dando prioridad a las jarras al usuario está agregando a class-path con la opción --jars .


Las opciones --archivos y --archivos admiten la especificación de nombres de archivos con # similar a Hadoop. Por ejemplo, puede especificar: --files localtest.txt # appSees.txt y esto cargará el archivo que ha nombrado localmente localtest.txt en HDFS, pero estará vinculado por el nombre appSees.txt, y su aplicación debe usar el nombre como appSees.txt para referenciarlo cuando se ejecuta en YARN.

esto funciona para mi aplicación de transmisión de chispa en modo hilado / cliente y hilado / clúster. tal vez pueda ayudarte





java scala apache-spark jar spark-submit