Préface
Avec de plus en plus de systèmes commerciaux internes dans les services basés sur l'entreprise et JVM, il peut y avoir plusieurs ensembles de JDK exécutant différents services dans l'environnement en ligne. Tout le monde sait que les services écrits sur la base de la version supérieure de la spécification Java apparaîtront sur la version inférieure de JVM: java.lang.UnsupportedClassVersionError Exception.
Spark 2.2 a commencé à supprimer la prise en charge de Java 7. Dans la plupart des cas, notre application Spark est un JDK partagé avec le système Hadoop. Si la version 7 JDK dont dépend Hadoop est de 7, il y aura des problèmes avec l'application qui lui est écrite sur la base de JDK 8.
Cet article présente principalement comment spécifier différentes versions JDK pour l'application Spark dans différents scénarios.
Le cluster a déployé la version JDK spécifiée
Supposons que le chemin de déploiement de JDK pour chaque nœud du cluster est: /usr/java/jdk1.8
Spark fournit spark.executorEnv.[EnvironmentVariableName] Configuration, qui peut être utilisée pour ajouter des variables d'environnement au processus exécuteur. Si le gestionnaire de cluster utilisé par l'application Spark est autonome, il vous suffit de formuler le chemin JDK du côté exécuteur via spark.executorEnv.JAVA_HOME , comme suit:
$ Spark_Home / bin / Spark-Submit / --Conf "Spark.execurenv.java_home = / usr / java / jdk1.8" / ...
En mode fil, vous devez également spécifier différentes variables d'environnement Java_Home pour le maître d'application, comme suit:
$ Spark_Home / bin / Spark-Submit / --conf "Spark.executorenv.java_home = / usr / java / jdk1.8" / --conf "spark.yarn.appmasterenv.java_home = / usr / java / jdk1.8" / ...
Lors du déploiement sur le fil en mode cluster, spark.yarn.appMasterEnv.JAVA_HOME équivaut à définir une version JDK spécifique pour le pilote de l'application Spark;
Lors du déploiement en mode client, spark.yarn.appMasterEnv.JAVA_HOME définit simplement une version JDK spécifique pour le lanceur d'exécuteur.
La version JDK du côté conducteur est la même que la variable d'environnement Spark_Home dans la machine où se trouve Spark-Sumit, et il peut être directement spécifié dans Spark-env.sh.
Le cluster n'a pas une version JDK spécifique et n'a aucune autorisation administrative sur le cluster.
Dans certains scénarios spéciaux, nous n'avons pas d'autorisations de gestion pour le cluster et ne pouvons soumettre une application que via le fil, et la version JDK dont nous avons besoin n'est pas déployée dans le cluster. Dans ce cas, nous devons soumettre ensemble le package d'installation JDK.
Ici, nous exigeons que notre package d'installation JDK soit au format GZ et soit placé dans le même répertoire que le package JAR après l'emballage de votre code. Supposons que le package d'installation JDK que nous avons téléchargé soit: JDK-8U141-LINUX-X64.TAR.gz.
关键配置如下:
$ Spark_Home / bin / Spark-Submit / --conf "Spark.yarn.dist.archives = jdk-8u141-linux-x64.tar.gz" / - -conf "Spark.execurenv.java_home =. / Jdk-8u141-linux-x64.tar.gz / jdk1.8.0_141" "Spark.yarn.appmasterenv.java_home =. / jdk-8u141-linux-x64.tar.gz / jdk1.8.0_141" / ...
Nous pouvons distribuer le package d'installation JDK au répertoire de travail de tous les exécuteurs (y compris l'exécuteur du maître d'application) en spécifiant la configuration spark.yarn.dist.archives . De plus, le package compressé TAR.GZ sera également automatiquement décompressé. En supposant que le répertoire décompressé de JDK-8U141-Linux-X64.Tar.gz est JDK1.8.0_141, alors le répertoire de notre JDK spécifique est: ./JDK-8U141-LINUX-X64.TAR.GZ/JDK1.8.0_141, et différents versions JDK et SO.
Remarque: Étant donné que Spark Standalone ne fournit pas la fonction de distribution des packages d'installation JDK et de décompression automatique, cette méthode ne peut être utilisée que sous le fil.
vérifier
Grâce à PS -ef Grep, vous pouvez voir que le chemin de démarrage Java est configuré avec succès pour Java dans notre répertoire JDK spécifique.
Ce qui suit est les informations de démarrage de processus pour l'exécuteur exécuteur Je spécifie la version JDK en mode fil:
Stan 590751 590745 0 20:45? 00:00:14 ./JDK-8U141-Linux-x64.tar.gz/jdk1.8.0_141/bin/java -server -xmx512m -xx: + useg1gc -xx: + unlockDiagnosticVMoptions -xx: + g1summarzeconcmark -Xx: InitiantHeapoCcupancyPercent = 35 -xx: permsize = 256m -xx: + printgcdetails -xx: + printgcdatestamps -xloggc: ./ gc.log -verbose: gc -Djava.io.tmpdir = / home / stan / tmp / hadoop-stan / nm-lical-diir / usercache / stan / appcache / application_1508397483453_0095 / contener_1508397483453_0095_01_000004 / tmp -dspark.driver.port = 529866 -Dspark.yarn.app.connainer.log.dir = / home / stan // hadoop-2.6.4 / logs / userlogs / application_1508397483453_0095 / contener_1508397483453_0095_01_000004 org.apache.spark.executor.coarsegratedExecutorbackend --driver-url Spark: //[email protected]: 52986 --executor-id 3 - hostname stan --cores 1 --App-id application_1508397483453_0095 --usser-Class-path-path-path-path_0095 --usser-Class-Path_Ser-Class-Path_0095 --USER-CLASS-PATh Fichier: / home / stan / tmp / hadoop-stan / nm-local-diir / userCache / stan / appcache / application_1508397483453_0095 / conteneur_1508397483453_0095_01_000004 / __ App __. Jar.
Attachement: solution à l'erreur incompatible de la version d'exécution de l'application Spark
17/06/27 14:34:41 Info Devrécisation: mapred.map.tasks est obsolète. Au lieu de cela, utilisez MapReduce.Job.Maps 17/06/27 14:34:41 Info Memorystore: Block Broadcast_0 stocké comme valeurs dans la mémoire (taille estimée 788.8 KB, gratuit 1246,5 Mo) 17/06/27 14:34:41 Info Memorystore: Block Broadcast_0_Piece0 As Bytes dans le mémoire (Taille estimée 54.0 KB, Free 12. MB) dans le mémoire (SUJETT SIMEL 17/06/27 14:34:41 Info BlockManageRinfo: Ajout de Broadcast_0_Piece0 en mémoire le 10.50.70.121:37335 (taille: 54.0 kb, gratuit: 1247.2 MB) 17/06/27 14:34:41 Info SparkContex java.lang.nosuchMethoDerror: scala.reflect.api.javauniverse.runtimemirror (ljava / lang / classloader;) lScala / reflect / api / javauniverse $ javamirror; à com.fangdd.data.profile.outlier.tradeinfooutlier $ .main (TradeInfooutlier.Scala: 30) à com.fangdd.data.profile.outlier.tradeinfooutlier.main (TradeInFooutlier.ina) à Sun.reflect.NatiVEMethodaccessoralimp.in) à Sun.reflect.NattiVEMethodaccess à Sun.reflect.NativeMethodAccessOrimpl.invoke (nativemethodaccessorimp.java:62) à Sun.Reflect.delegatingMethodaccessorimp.invoke (déléguantmethodaccessorimpl.java:43) à java.lang.reflect.method.invoke (méthode org.apache.spark.deploy.sparksubmit $ .org $ apache $ spark $ deploy $ sparksubmit $$ runmain (sparksubmit.scala: 745) sur org.apache.spark.deploy.sparksubmit.dorunmain $ $ (sparksubmitte.scala: 181) à 2 .dorunmain org.apache.spark.deploy.sparksubmit $ .submit (sparksubmit.scala: 206) sur org.apache.spark.deploy.sparksubmit $. 14:34:42 Info SparkContext: invoquer Stop () de Shutdown Hook
Cette erreur est due à l'environnement de production utilise l'environnement de course de Scala 2.10 + Spark1.6.3, et le pot d'application local utilise l'environnement de compilation de Scala 2.11 + Spark.1.6.3. Par conséquent, l'erreur ci-dessus a été signalée dans le cluster d'environnement de production. Après avoir modifié la version Scala et réengageant le package JAR, l'erreur ci-dessus a été signalée.
Résumer
Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article a une certaine valeur de référence pour l'étude ou le travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer. Merci pour votre soutien à wulin.com.