207 votes

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

Vrai ... il a été discuté de beaucoup de choses.

Cependant il y a beaucoup d'ambiguïté et certaines des réponses fournies ... y compris la duplication pot de références dans les pots, exécuteur de configuration du pilote ou des options.

L'ambiguïté et/ou omis de détails

Suite à l'ambiguïté, le flou, et/ou omis les détails doivent être précisés pour chaque option:

  • Comment la classe est affecté
    • Pilote
    • Exécuteur (pour les tâches en cours d'exécution)
    • Les deux
    • pas du tout
  • Caractère de séparation: la virgule, deux-points, point-virgule
  • Si les fichiers sont automatiquement distribués
    • pour les tâches (à chaque interprète)
    • pour le Pilote distant (si couru en mode cluster)
  • type d'URI acceptés: fichier local, hdfs, http, etc
  • Si copiés dans un emplacement commun, où que l'emplacement est (hdfs, local?)

Les options qu'il 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-soumettre est aussi une .fichier jar.

Je suis conscient où je peux trouver les principaux étincelle de la documentation, et en particulier sur la façon de soumettre, les options disponibles, et aussi la JavaDoc. Cependant qu'il me reste encore pas mal de trous, même si elle a répondu que partiellement.

J'espère que ce n'est pas tout le complexe, et que quelqu'un peut me donner une claire et concise réponse.

Si je devais deviner à partir de la documentation, il semble que l' --jars, et l' SparkContext addJar et addFile méthodes sont ceux qui vont distribuer automatiquement des fichiers, tandis que les autres options de simplement modifier le ClassPath.

Serait-il raisonnable de supposer que, pour des raisons de simplicité, je peux ajouter d'autres applications jar fichiers en utilisant les 3 principales options 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

Trouvé un article intéressant sur une réponse à une autre affectation. Cependant rien de nouveau a appris. L'affiche fait une bonne remarque sur la différence entre un chauffeur Local (fil-client) et le Conducteur (fil-cluster). Certainement important de garder à l'esprit.

231voto

Yuval Itzchakov Points 13820

ClassPath:

ClassPath est affectée en fonction de ce que vous fournissez. Il ya un couple de façons de mettre quelque chose sur le chemin de la classe:

  • spark.driver.extraClassPath ou alias --driver-class-path de mettre les chemins de classe sur le nœud qui exécute le pilote.
  • spark.executor.extraClassPath de mettre du chemin de classe sur les nœuds du Travailleur.

Si vous voulez un certain JAR effectués à la fois le Maître et l'Ouvrier, vous devez spécifier séparément dans les DEUX drapeaux.

Caractère de séparation:

Suivant les mêmes règles que la JVM:

  • Linux: Un colon :
    • e.g: --conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar"
  • Windows: Un point-virgule ;
    • e.g: --conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar;/opt/prog/aws-java-sdk-1.10.50.jar"

Distribution de fichiers:

Cela dépend du mode dans lequel vous êtes en cours d'exécution de votre travail sous:

  1. En mode Client - Allumage des feux un Netty serveur HTTP qui distribue les fichiers de démarrage pour chacun des nœuds du travailleur. Vous pouvez voir que lorsque vous commencez votre Étincelle d'emploi:

    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. Le mode Cluster En mode cluster étincelle sélectionné un chef de file Travailleur nœud pour exécuter le processus de Pilote. Cela signifie que le travail n'est pas en cours d'exécution directement à partir du nœud Maître. Ici, l'Étincelle ne sera pas définir un serveur HTTP. Vous devez effectuer manuellement vos POTS à la disposition de tous les travailleurs nœud via HDFS/S3/d'Autres sources qui sont disponibles à tous les nœuds.

Accepté d'URI pour les fichiers

Dans "Soumettre des Demandes", l'Étincelle de la documentation fait un bon travail en expliquant la accepté les préfixes pour les fichiers:

Lors de l'utilisation de bougies de soumettre, l'application jar avec tous les pots inclus avec l'option --pots option sera automatiquement transféré à le cluster. Spark utilise l'URL suivante pour permettre différentes stratégies pour la diffusion des pots:

  • fichier: - chemins Absolus et file:/ Uri sont servis par le conducteur du HTTP serveur de fichiers, et chaque exécuteur tire le fichier du pilote HTTP serveur.
  • hdfs:, http: https:, ftp: - les tirer vers le bas les fichiers et les Pots à partir de l'URI comme prévu
  • local: - un URI commençant par local:/ est devrait exister en tant que fichier local sur chaque travailleur nœud. Cela signifie que pas de réseau IO seront engagés, et fonctionne bien pour les gros fichiers/Pots qui sont poussés à chaque travailleur, ou partagé via NFS, GlusterFS, etc.

Notez que les Pots et les fichiers sont copiés dans le répertoire de travail pour chaque SparkContext sur l'exécuteur des nœuds.

Comme indiqué, les Pots sont copiés dans le répertoire de travail pour chaque Travailleur nœud. Où, exactement, est-ce que? Il est généralement en vertu de l' /var/run/spark/work, vous les verrez comme ceci:

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

Et quand vous regardez à l'intérieur, vous verrez tous les Bocaux vous sont déployées le long de:

[*@*]$ 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

Touchés options:

La chose la plus importante à comprendre est la priorité. Si vous passez toute la propriété via le code, il aura préséance sur toute option que vous spécifiez via spark-submit. Cela est mentionné dans l'Étincelle de la documentation:

Toutes les valeurs spécifiées comme les drapeaux ou dans le fichier de propriétés sera passé sur l'application et l'a fusionné avec ceux spécifiés par le biais de SparkConf. Propriétés directement sur la SparkConf prendre plus la priorité, alors indicateurs transmis à étincelle soumettre ou spark-shell, puis options dans l'étincelle de paramètres par défaut.fichier conf

Donc, assurez-vous de définir ces valeurs au bon endroit, donc vous ne serez pas surpris lorsque l'on prend la priorité sur l'autre.

Permet l'analyse de chaque option en question:

  • --jars vs SparkContext.addJar: elles sont identiques, un seul est définie par l'étincelle de soumettre et d'un via le code. Choisissez celui qui suites vous mieux. Une chose importante à noter est que l'utilisation de ces options ne pas ajouter le POT de votre chauffeur/exécuteur classpath, vous devez explicitement les ajouter à l'aide de l' extraClassPath config sur les deux.
  • SparkContext.addJar vs SparkContext.addFile: Utiliser l'ancien quand vous avez une dépendance qui doit être utilisé avec votre code. Utilisez le second, quand vous voulez simplement passer un fichier arbitraire autour de vos nœuds de travail, ce qui n'est pas un moment de l'exécution de la dépendance dans votre code.
  • --conf spark.driver.extraClassPath=... ou --driver-class-path: ce sont des alias, n'est pas n'importe celle que vous choisissez
  • --conf spark.driver.extraLibraryPath=..., or --driver-library-path ... Comme ci-dessus, les alias.
  • --conf spark.executor.extraClassPath=...: Utilisez cette fonction lorsque vous avez une dépendance qui ne peut pas être inclus dans un uber POT (par exemple, parce qu'il y a de la compilation des conflits entre les versions de la bibliothèque) et que vous avez besoin de charger à l'exécution.
  • --conf spark.executor.extraLibraryPath=... C'est passé comme l' java.library.path option pour la JVM. Utilisez cette fonction lorsque vous avez besoin d'un chemin de la bibliothèque visible à la JVM.

Serait-il raisonnable de supposer que, pour des raisons de simplicité, je peux en ajouter d'autres application jar fichiers en utilisant les 3 principales options en même temps:

Vous pouvez supposer que pour le mode Client, pas en mode Cluster. Comme je l'ai dit précédemment. Aussi, l'exemple que vous avez donné a certains arguments redondants. Par exemple, en passant Pots --driver-library-path est inutile, vous avez besoin de les faire passer extraClassPath si vous voulez être sur votre chemin de classe. En fin de compte, ce que vous voulez faire quand vous déployez externe Pots à la fois le conducteur et le travailleur est:

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

6voto

Stanislav Points 13

Une autre approche dans spark 2.1.0 consiste à utiliser --conf spark.driver.userClassPathFirst=true lors de la soumission de l'étincelle, ce qui modifie la priorité de la charge de dépendance, et donc le comportement de l'étincelle, en donnant la priorité aux fichiers jar de l'utilisateur. ajoute au chemin de classe avec l’option --jars .

4voto

Tanveer Points 195

Il y a restriction sur l'utilisation de l' --jars: si vous souhaitez spécifier un répertoire pour l'emplacement de jar/xml le fichier, il ne permet pas de répertoire extensions. Cela signifie que si vous devez spécifier un chemin absolu pour chaque pot.

Si vous spécifiez --driver-class-path et vous êtes en cours d'exécution dans le fil de mode de cluster, puis de la classe du pilote n'est pas mis à jour. Nous pouvons vérifier si le chemin de classe est mis à jour ou non en vertu de l'étincelle de l'interface utilisateur ou l'étincelle de l'histoire de serveur sous l'onglet environnement.

L'Option qui a travaillé pour moi de passer des bocaux qui contiennent répertoire des expansions et qui a travaillé dans le fil de mode de cluster a été --conf option. C'est mieux de passer du pilote et exécuteur testamentaire de la classe des chemins --conf, ce qui ajoute à l'étincelle de la session de l'objet lui-même et ces chemins sont répercutées sur l'Étincelle de Configuration. Mais s'il vous Plaît assurez-vous de placer les pots sur le même chemin d'accès sur l'ensemble du 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X