C'est vrai ... on en a beaucoup parlé.
Cependant, il y a beaucoup d'ambiguïté et certaines des réponses fournies ... y compris la duplication des références de jar dans la configuration ou les options de jars/executor/driver.
Après ambiguïté, des détails peu clairs et/ou omis doivent être clarifiés pour chaque option:
--jars
SparkContext.addJar(...)
méthodeSparkContext.addFile(...)
méthode --conf spark.driver.extraClassPath=...
ou --driver-class-path ...
--conf spark.driver.extraLibraryPath=...
ou --driver-library-path ...
--conf spark.executor.extraClassPath=...
--conf spark.executor.extraLibraryPath=...
Je sais où je peux trouver la documentation principale sur l'étincelle , et plus particulièrement sur comment soumettre , les options disponibles et aussi le JavaDoc . Cependant, cela me laissait encore quelques trous, même si cela répondait partiellement aussi.
J'espère que ce n'est pas si complexe et que quelqu'un peut me donner une réponse claire et concise.
Si je devais deviner à partir de la documentation, il semblerait que --jars
et les méthodes SparkContext
addJar
et addFile
soient celles qui distribueront automatiquement les fichiers, tandis que les autres options ne font que modifier le ClassPath.
Serait-il prudent de supposer que pour des raisons de simplicité, je peux ajouter des fichiers jar d'application supplémentaires en utilisant les 3 options principales en même temps:
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
J'ai trouvé un article de Nice sur une réponse à une autre publication } _. Cependant rien de nouveau appris. L’affiche fait une bonne remarque sur la différence entre Pilote local (client-fil) et Pilote distant (cluster-fil). Certainement important de garder à l'esprit.
Une autre approche dans spark 2.1.0
consiste à utiliser --conf spark.driver.userClassPathFirst=true
pendant spark-submit, ce qui modifie la priorité de la charge de dépendance, et donc le comportement du travail-spark, en donnant la priorité aux fichiers jar que l'utilisateur ajoute au chemin de classe avec l'option --jars
.
Autre option configurable Spark relative aux fichiers JAR et Classpath, dans le cas de yarn
en mode déploiement, comme suit:
À partir de la documentation spark,
spark.yarn.jars
Liste des bibliothèques contenant le code Spark à distribuer aux conteneurs YARN. Par défaut, Spark sur YARN utilisera les fichiers Spark installés localement, mais les fichiers Spark peuvent également se trouver dans un emplacement lisible par tout le monde sur HDFS. Cela permet à YARN de le mettre en cache sur les nœuds, de sorte qu'il ne soit pas nécessaire de le distribuer à chaque exécution d'une application. Pour pointer vers des fichiers jar sur HDFS, par exemple, définissez cette configuration sur hdfs: /// some/path. Globs sont autorisés.
spark.yarn.archive
Une archive contenant les fichiers JAR Spark nécessaires à la distribution dans le cache YARN. Si elle est définie, cette configuration remplace spark.yarn.jars et l'archive est utilisée dans tous les conteneurs de l'application. L’archive doit contenir des fichiers jar dans son répertoire racine. Comme avec l'option précédente, l'archive peut également être hébergée sur HDFS pour accélérer la distribution des fichiers.
Les utilisateurs peuvent configurer ce paramètre pour spécifier leurs fichiers JAR, qui sont inclus dans le chemin d'accès aux classes du pilote Spark.
Bien que nous soumettions des travaux spark à l'aide de l'utilitaire spark-submit, il existe une option --jars
. En utilisant cette option, nous pouvons transmettre le fichier jar aux applications spark.
L'utilisation de --jars
est soumise à des restrictions: si vous souhaitez spécifier un répertoire pour l'emplacement du fichier jar/xml
, les extensions de répertoire ne sont pas autorisées. Cela signifie que vous devez spécifier un chemin absolu pour chaque fichier.
Si vous spécifiez --driver-class-path
et que vous exécutez en mode cluster de fils, la classe de pilote n'est pas mise à jour. Nous pouvons vérifier si le chemin d'accès aux classes est mis à jour ou non sous spark ui ou serveur d'historique d'étincelles sous environnement à onglets.
L'option qui permettait de transmettre des fichiers JAR contenant des extensions de répertoire et fonctionnant en mode grappe de fil était --conf
option. Il est préférable de transmettre les chemins d'accès aux classes de pilote et d'exécuteur en tant que --conf
, ce qui les ajoute à l'objet de session spark lui-même et ces chemins sont reflétés dans la configuration de Spark. Mais assurez-vous de placer les bocaux sur le même chemin à travers le cluster.
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