ClassPath:
ClassPath est affecté en fonction de ce que vous fournissez. Il existe plusieurs façons de définir quelque chose sur le chemin de classe:
spark.driver.extraClassPath
ou c'est un alias --driver-class-path
pour définir des chemins de classe supplémentaires sur le nœud exécutant le pilote.
spark.executor.extraClassPath
pour définir un chemin de classe supplémentaire sur les nœuds Worker.
Si vous voulez qu'un certain JAR soit effectué à la fois sur le maître et sur le travailleur, vous devez les spécifier séparément dans les DEUX indicateurs.
Caractère de séparation:
En suivant les mêmes règles que la JVM :
- Linux: un deux-points
:
- par exemple:
--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
;
- par exemple:
--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 sous lequel vous exécutez votre travail:
Mode client - Spark déclenche un serveur Netty HTTP qui distribue les fichiers au démarrage pour chacun des nœuds de travail. Vous pouvez le voir lorsque vous démarrez votre tâche Spark:
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
Mode cluster - En mode cluster, Spark a sélectionné un nœud Worker leader sur lequel exécuter le processus Driver. Cela signifie que le travail ne s'exécute pas directement à partir du nœud maître. Ici, Spark ne définira pas de serveur HTTP. Vous devez rendre manuellement votre JARS disponible à tous les nœuds de travail via HDFS / S3 / Autres sources qui sont disponibles pour tous les nœuds.
URI acceptés pour les fichiers
Dans "Soumettre des demandes" , la documentation Spark explique bien les préfixes acceptés pour les fichiers:
Lorsque vous utilisez spark-submit, le fichier jar de l'application ainsi que tous les fichiers jar inclus avec l'option --jars seront automatiquement transférés vers le cluster. Spark utilise le schéma d'URL suivant pour autoriser différentes stratégies de diffusion de fichiers JAR:
- file: - Les chemins absolus et le fichier: / Les URI sont servis par le serveur de fichiers HTTP du pilote, et chaque exécuteur extrait le fichier du serveur HTTP du pilote.
- hdfs :, http :, https :, ftp: - ces fichiers déroulants et JAR de l'URI comme prévu
- local: - un URI commençant par local: / devrait exister en tant que fichier local sur chaque nœud worker. Cela signifie qu'aucune E / S réseau ne sera encourue et fonctionne bien pour les fichiers / JAR volumineux qui sont poussés vers chaque travailleur ou partagés via NFS, GlusterFS, etc.
Notez que les fichiers JAR et les fichiers sont copiés dans le répertoire de travail de chaque SparkContext sur les nœuds exécuteurs.
Comme indiqué, les fichiers JAR sont copiés dans le répertoire de travail de chaque nœud Worker. Où est-ce exactement? C'est généralement sous /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 JAR que vous avez déployés:
[*@*]$ 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
Options affectées:
La chose la plus importante à comprendre est la priorité . Si vous passez une propriété via le code, elle prévaudra sur toute option que vous spécifiez via spark-submit
. Ceci est mentionné dans la documentation Spark:
Toutes les valeurs spécifiées comme indicateurs ou dans le fichier de propriétés seront transmises à l'application et fusionnées avec celles spécifiées via SparkConf. Les propriétés définies directement sur SparkConf ont la priorité la plus élevée , puis les indicateurs passés à spark-submit ou spark-shell, puis les options dans le fichier spark-defaults.conf
Assurez-vous donc de définir ces valeurs aux bons endroits, de sorte que vous ne serez pas surpris si l'une a priorité sur l'autre.
Permet d'analyser chaque option en question:
--jars
vs SparkContext.addJar
: Ils sont identiques, un seul est défini via la soumission d'étincelle et un via le code. Choisissez celui qui vous convient le mieux. Une chose importante à noter est que l'utilisation de l'une de ces options n'ajoute pas le JAR au chemin de classe de votre pilote / exécuteur , vous devrez les ajouter explicitement en utilisant la extraClassPath
configuration sur les deux.
SparkContext.addJar
vs SparkContext.addFile
: utilisez le premier lorsque vous avez une dépendance qui doit être utilisée avec votre code. Utilisez ce dernier lorsque vous souhaitez simplement transmettre un fichier arbitraire à vos nœuds de travail, ce qui n'est pas une dépendance d'exécution dans votre code.
--conf spark.driver.extraClassPath=...
ou --driver-class-path
: ce sont des alias, peu importe celui que vous choisissez
--conf spark.driver.extraLibraryPath=..., or --driver-library-path ...
Idem que ci-dessus, alias.
--conf spark.executor.extraClassPath=...
: Utilisez cette option lorsque vous avez une dépendance qui ne peut pas être incluse dans un JAR uber (par exemple, car il y a des conflits de compilation entre les versions de bibliothèque) et que vous devez charger au moment de l'exécution.
--conf spark.executor.extraLibraryPath=...
Ceci est passé comme java.library.path
option pour la JVM. Utilisez cette option lorsque vous avez besoin d'un chemin de bibliothèque visible par la JVM.
Serait-il prudent de supposer que pour plus de simplicité, je peux ajouter des fichiers jar d'application supplémentaires en utilisant les 3 options principales en même temps:
Vous pouvez supposer cela en toute sécurité uniquement pour le mode client et non pour le mode cluster. Comme je l'ai déjà dit. De plus, l'exemple que vous avez donné contient des arguments redondants. Par exemple, passer des fichiers JAR à --driver-library-path
est inutile, vous devez les transmettre à extraClassPath
si vous voulez qu'ils soient sur votre chemin de classe. En fin de compte, ce que vous voulez faire lorsque vous déployez des JAR externes sur le pilote et le worker 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