java - what - Agregar frascos a un trabajo Spark-spark-submit
traducir de ingles a español (5)
Es cierto ... se ha discutido bastante.
Sin embargo, hay mucha ambigüedad y algunas de las respuestas proporcionadas ... incluida la duplicación de referencias jar en la configuración u opciones de jar / ejecutor / controlador.
Los detalles ambiguos y / u omitidos
Después de la ambigüedad, se deben aclarar los detalles poco claros y / u omitidos para cada opción:
-
Cómo se afecta 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 provistos se distribuyen automáticamente
- para las tareas (a cada ejecutor)
- para el controlador remoto (si se ejecuta en 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:
-
--jars
-
SparkContext.addJar(...)
-
SparkContext.addFile(...)
-
--conf spark.driver.extraClassPath=...
o--driver-class-path ...
-
--conf spark.driver.extraLibraryPath=...
, o--driver-library-path ...
-
--conf spark.executor.extraClassPath=...
-
--conf spark.executor.extraLibraryPath=...
- Sin olvidar que el último parámetro del envío de chispas también es 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 por 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, por simplicidad, puedo agregar archivos jar de aplicaciones 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 (cliente de hilo) y el controlador remoto (grupo de hilo). Definitivamente importante tener en cuenta.
ClassPath:
ClassPath se ve afectado según lo que proporcione. Hay un par de formas de configurar algo en el classpath:
-
spark.driver.extraClassPath
o es alias--driver-class-path
para establecer rutas de--driver-class-path
adicionales en el nodo que ejecuta el controlador. -
spark.executor.extraClassPath
para establecer una ruta de clase adicional en los nodos de Worker.
Si desea que cierto JAR se efectúe 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: 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"
-
por ejemplo:
-
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"
-
por ejemplo:
Distribución de archivos:
Esto depende del modo en el que esté ejecutando su trabajo:
-
Modo cliente: Spark activa un servidor HTTP Netty que distribuye los archivos al inicio de cada uno de los nodos de trabajo. Puedes ver eso cuando comienzas tu trabajo de 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
-
Modo de clúster: en el modo de clúster, spark seleccionó un nodo de trabajador líder para ejecutar el proceso del controlador. Esto significa que el trabajo no se ejecuta directamente desde el nodo maestro. Aquí, Spark no configurará un servidor HTTP. Debe hacer que sus JARS estén disponibles manualmente para todos los nodos de trabajo a través de HDFS / S3 / Otras fuentes que están disponibles para todos los nodos.
URI aceptados para archivos
En "Envío de solicitudes" , la documentación de Spark hace un buen trabajo al explicar los prefijos aceptados para los archivos:
Cuando se utiliza el envío de chispas, la jarra de la aplicación junto con las jarras incluidas con la opción --jars se transferirán automáticamente al clúster. Spark utiliza el siguiente esquema de URL para permitir diferentes estrategias para diseminar frascos:
- archivo: - Las rutas absolutas y el archivo: / URI son servidos por el servidor de archivos HTTP del controlador, y cada ejecutor extrae el archivo del servidor HTTP del controlador.
- hdfs :, http :, https :, ftp: estos archivos desplegables y JAR del URI como se esperaba
- local: un URI que comienza con local: / se espera que exista como un archivo local en cada nodo de trabajo. 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 archivos JAR y los archivos se copian en el directorio de trabajo para cada SparkContext en los nodos ejecutores.
Como se señaló, los JAR se copian en el
directorio de trabajo
para cada nodo Worker.
¿Dónde es exactamente eso?
Por lo
general,
está en
/var/run/spark/work
, los verá 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 dentro, verás todos los JAR que desplegaste:
[*@*]$ 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 pasa cualquier propiedad a través del código, tendrá prioridad sobre cualquier opción que especifique a través de
spark-submit
.
Esto se menciona en la documentación de Spark:
Cualquier valor especificado como banderas o en el archivo de propiedades se pasará a la aplicación y se combinará con los especificados a través de SparkConf. Las propiedades configuradas directamente en SparkConf tienen 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
vsSparkContext.addJar
: son idénticos, solo uno se configura mediante envío de chispa y otro mediante código. Elija el que mejor le convenga. 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 , deberá agregarlos explícitamente usando la configuraciónextraClassPath
en ambos. -
SparkContext.addJar
vsSparkContext.addFile
: use el primero cuando tenga una dependencia que deba usarse con su código. Use este último cuando simplemente quiera pasar un archivo arbitrario a sus nodos de trabajo, lo 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 puede incluir en un JAR uber (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ónjava.library.path
para la JVM. Use esto cuando necesite una ruta de biblioteca visible para la JVM.
¿Sería seguro asumir que, por simplicidad, puedo agregar archivos jar de aplicaciones adicionales usando las 3 opciones principales al mismo tiempo:
Puede asumir esto con seguridad solo para el modo Cliente, no para el modo Clúster.
Como he dicho anteriormente.
Además, el ejemplo que dio tiene algunos argumentos redundantes.
Por ejemplo, pasar los
--driver-library-path
a
--driver-library-path
es inútil, debe pasarlos a
extraClassPath
si desea que estén en su classpath.
En última instancia, lo que desea 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
Hay restricciones para usar
--jars
: si desea especificar un directorio para la ubicación del archivo
jar/xml
, no permite expansiones de directorio.
Esto significa que si necesita especificar una ruta absoluta para cada jar.
Si especifica
--driver-class-path
y está ejecutando en modo cluster de hilo, entonces la clase de controlador no se actualiza.
Podemos verificar si la ruta de clase 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 funcionó para pasar frascos que contienen expansiones de directorio y que funcionó en modo cluster de hilo fue la opción
--conf
.
Es mejor pasar las rutas de clase de controlador y ejecutor como
--conf
, que las agrega al objeto de sesión de
--conf
sí mismo y esas rutas se reflejan en Spark Configuration.
Pero asegúrese de colocar frascos en la misma ruta a través del 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
Otras opciones de Spark configurables relacionadas con jarras y classpath, en caso de
yarn
como modo de despliegue son las siguientes
De la documentación de chispa,
spark.yarn.jars
Lista de bibliotecas que contienen código Spark para distribuir a contenedores YARN. De forma predeterminada, Spark en YARN usará los frascos Spark instalados localmente, pero los frascos Spark también pueden estar en una ubicación legible en todo el mundo en HDFS. Esto permite a YARN almacenarlo en caché en los nodos para que no necesite distribuirse cada vez que se ejecuta una aplicación. Para apuntar a frascos en HDFS, por ejemplo, establezca esta configuración en hdfs: /// some / path. Se permiten globos.
spark.yarn.archive
Un archivo que contiene los frascos Spark necesarios para su distribución al caché YARN. Si se establece, esta configuración reemplaza spark.yarn.jars y el archivo se usa en todos los contenedores de la aplicación. El archivo debe contener archivos jar en su directorio raíz. Al igual que con la opción anterior, el archivo también se puede alojar en HDFS para acelerar la distribución de archivos.
Los usuarios pueden configurar este parámetro para especificar sus jarras, que se incluyen en el classpath del controlador Spark.
Otro enfoque en
spark 2.1.0
es usar
--conf spark.driver.userClassPathFirst=true
durante el envío de chispas que cambia la prioridad de la carga de dependencia y, por lo tanto, el comportamiento del trabajo de chispa, dando prioridad a los tarros del usuario se agrega a la ruta de clase con la opción
--jars
.
Si bien enviamos trabajos de chispa utilizando la utilidad de envío de chispas, existe una opción:
--jars
.
Con esta opción, podemos pasar el archivo jar a aplicaciones de chispa.