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:
-
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
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