java - Spark spark-submit--jars argumentos quiere una lista de comas, ¿cómo declarar un directorio de jarras?
scala apache-spark (2)
En el envío de aplicaciones en los documentos de Spark, a partir de 1.6.0 y anteriores , no está claro cómo especificar el argumento --jars, ya que aparentemente no es una ruta de clase separada por dos puntos ni una expansión de directorio.
Los documentos dicen "Ruta de acceso a un archivo jar incluido que incluye su aplicación y todas las dependencias. La URL debe ser visible globalmente dentro de su clúster, por ejemplo, una ruta hdfs: // o una ruta file: // que esté presente en todos los nodos. "
Pregunta: ¿Cuáles son todas las opciones para enviar un classpath con --jars en el script de envío de chispas en $ SPARK_HOME / bin? ¿Algo no documentado que pueda presentarse como una mejora para los documentos?
Pregunto porque cuando estaba probando --jars hoy, tuvimos que proporcionar explícitamente una ruta a cada jarra:
/usr/local/spark/bin/spark-submit --class jpsgcs.thold.PipeLinkageData ---jars=local:/usr/local/spark/jars/groovy-all-2.3.3.jar,local:/usr/local/spark/jars/guava-14.0.1.jar,local:/usr/local/spark/jars/jopt-simple-4.6.jar,local:/usr/local/spark/jars/jpsgcs-core-1.0.8-2.jar,local:/usr/local/spark/jars/jpsgcs-pipe-1.0.6-7.jar /usr/local/spark/jars/thold-0.0.1-1.jar
Estamos eligiendo rellenar previamente el clúster con todos los frascos en / usr / local / spark / jars en cada trabajador, parece que si no se suministró local: / file: / o hdfs: entonces el valor predeterminado es file: / y el controlador hace que los frascos estén disponibles en un servidor web ejecutado por el controlador. Elegí local, como arriba.
Y parece que no necesitamos poner el jar principal en el argumento --jars, todavía no he probado si hay otras clases en el argumento final (application-jar arg per docs, es decir / usr / local / spark / jars / thold-0.0.1-1.jar) se envían a los trabajadores, o si necesito poner el jar de la aplicación en la ruta --jars para obtener clases que no tengan el nombre de --class para que se vean.
(Y con el modo autónomo Spark que utiliza el cliente --deploy-mode, también debe colocar una copia del controlador en cada trabajador, pero no sabe de antemano qué trabajador ejecutará el controlador)
De esta manera, funcionó fácilmente ... en lugar de especificar cada jarra con la versión por separado ...
#!/bin/sh
# build all other dependent jars in OTHER_JARS
JARS=`find ../lib -name ''*.jar''`
OTHER_JARS=""
for eachjarinlib in $JARS ; do
if [ "$eachjarinlib" != "APPLICATIONJARTOBEADDEDSEPERATELY.JAR" ]; then
OTHER_JARS=$eachjarinlib,$OTHER_JARS
fi
done
echo ---final list of jars are : $OTHER_JARS
echo $CLASSPATH
spark-submit --verbose --class <yourclass>
... OTHER OPTIONS
--jars $OTHER_JARS,APPLICATIONJARTOBEADDEDSEPERATELY.JAR
-
El uso del comando
tr
unix también puede ayudar, como en el siguiente ejemplo.--jars $(echo /dir_of_jars/*.jar | tr '' '' '','')
Una forma (¿la única forma?) De usar el argumento --jars es proporcionar una lista separada por comas de tarros con nombres explícitos. La única forma en que descubrí usar las comas fue una respuesta de que me llevó a mirar más allá de los documentos a la línea de comando:
spark-submit --help
El resultado de ese comando contiene:
--jars JARS Comma-separated list of local jars to include on the driver
and executor classpaths.
Hoy, cuando estaba probando --jars, tuvimos que proporcionar explícitamente una ruta a cada jarra:
/usr/local/spark/bin/spark-submit --class jpsgcs.thold.PipeLinkageData ---jars=local:/usr/local/spark/jars/groovy-all-2.3.3.jar,local:/usr/local/spark/jars/guava-14.0.1.jar,local:/usr/local/spark/jars/jopt-simple-4.6.jar,local:/usr/local/spark/jars/jpsgcs-core-1.0.8-2.jar,local:/usr/local/spark/jars/jpsgcs-pipe-1.0.6-7.jar /usr/local/spark/jars/thold-0.0.1-1.jar