web-dev-qa-db-fra.com

Ajouter des bocaux à un travail d'étincelle - spark-submit

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.

Les détails ambigus et/ou omis

Après ambiguïté, des détails peu clairs et/ou omis doivent être clarifiés pour chaque option:

  • Comment ClassPath est affecté
    • Driver
    • Exécuteur (pour les tâches en cours)
    • Tous les deux
    • pas du tout
  • Caractère de séparation: virgule, deux points, point-virgule
  • Si les fichiers fournis sont automatiquement distribués
    • pour les tâches (à chaque exécuteur)
    • pour le pilote distant (si exécuté en mode cluster)
  • type d'URI accepté: fichier local, hdfs, http, etc.
  • Si copié dans un emplacement commun, où se trouve cet emplacement (hdfs, local?)

Les options auxquelles cela affecte:

  1. --jars
  2. SparkContext.addJar(...) méthode
  3. SparkContext.addFile(...) méthode 
  4. --conf spark.driver.extraClassPath=... ou --driver-class-path ...
  5. --conf spark.driver.extraLibraryPath=... ou --driver-library-path ...
  6. --conf spark.executor.extraClassPath=...
  7. --conf spark.executor.extraLibraryPath=...
  8. ne pas oublier, le dernier paramètre de la spark-submit est également un fichier .jar.

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 SparkContextaddJar 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.

117
YoYo

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.

3
Stanislav

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.

1
DaRkMaN

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.

0
bala

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
0
Tanveer