Prefacio
Con más y más sistemas comerciales internos en la empresa y los servicios basados en JVM, puede haber múltiples conjuntos de JDK que ejecutan diferentes servicios en el entorno en línea. Todos saben que los servicios escritos basados en la versión superior de la especificación Java aparecerán en la versión inferior de JVM: java.lang.UnsupportedClassVersionError Exception.
Spark 2.2 ha comenzado a eliminar el soporte para Java 7. En la mayoría de los casos, nuestra aplicación Spark es un JDK compartido con el sistema Hadoop. Si la versión 7 de JDK de la que depende Hadoop es 7, entonces habrá problemas con la aplicación escrita en base a JDK 8.
Este artículo presenta principalmente cómo especificar diferentes versiones JDK para la aplicación Spark en diferentes escenarios.
El clúster ha implementado la versión JDK especificada
Suponga que la ruta de implementación de JDK para cada nodo en el clúster es: /usr/java/jdk1.8
Spark proporciona spark.executorEnv.[EnvironmentVariableName] Configuración, que puede usarse para agregar variables de entorno al proceso del Ejecutor. Si el administrador de clúster utilizado por la aplicación Spark es independiente, solo necesita formular la ruta JDK del lado del ejecutor a través de spark.executorEnv.JAVA_HOME , como sigue:
$ Spark_Home/bin/Spark-Submit/--Conf "Spark.executorenv.java_home =/usr/java/jdk1.8"/...
En el modo de hilo, también debe especificar diferentes variables de entorno Java_Home para el maestro de aplicaciones, como sigue:
$ Spark_Home/bin/Spark-Submit/--conf "Spark.Executorenv.java_home =/usr/java/jdk1.8"/--conf "spark.yarn.appmasterenv.java_home =/usr/java/jdk1.8"/... ...
Al implementar en el hilo en modo clúster, spark.yarn.appMasterEnv.JAVA_HOME es equivalente a establecer una versión JDK específica para la aplicación del controlador de Spark;
Al implementar en modo cliente, spark.yarn.appMasterEnv.JAVA_HOME simplemente establece una versión JDK específica para el lanzador de ejecutores.
La versión JDK del lado del controlador es la misma que la variable de entorno Spark_Home en la máquina donde se encuentra Spark-Submit, y se puede especificar directamente en Spark-Env.sh.
El clúster carece de una versión JDK específica y no tiene permisos administrativos en el clúster.
En algunos escenarios especiales, no tenemos permisos de gestión para el clúster, y solo podemos enviar la solicitud a través del hilo, y la versión JDK que necesitamos no se implementa en el clúster. En este caso, necesitamos enviar el paquete de instalación JDK juntos.
Aquí requerimos que nuestro paquete de instalación JDK esté en formato GZ y se coloque en el mismo directorio que el paquete JAR después de que su código se empaqueta. Supongamos que el paquete de instalación JDK que descargamos es: JDK-8U141-Linux-X64.tar.gz.
关键配置如下:
$SPARK_HOME/bin/spark-submit / --conf "spark.yarn.dist.archives=jdk-8u141-linux-x64.tar.gz" / --conf "spark.executorEnv.JAVA_HOME=./jdk-8u141-linux-x64.tar.gz/jdk1.8.0_141" / --conf "Spark.yarn.appmasterenv.java_home =./jdk-8u141-linux-x64.tar.gz/jdk1.8.0_141"/...
Podemos distribuir el paquete de instalación de JDK al directorio de trabajo de todos los ejecutores (incluido el ejecutor del maestro de aplicaciones) especificando la configuración de spark.yarn.dist.archives . Además, el paquete comprimido TAR.GZ también se descomprimará automáticamente. Suponiendo que el directorio descomprimido de JDK-8U141-Linux-X64.tar.gz es JDK1.8.0_141, entonces el directorio de nuestro JDK específico es: ./jdk-8u141-Linux-x64.tar.gz/jdk1.8.0_141, y diferentes versiones JDK y así.
Nota: Dado que Spark Standalone no proporciona la función de distribuir paquetes de instalación de JDK y descomprimirse automáticamente, este método solo se puede usar bajo hilo.
verificar
A través de PS -EF GREP, puede ver que la ruta de inicio de Java está configurada con éxito para Java en nuestro directorio JDK específico.
La siguiente es la información de inicio del proceso para el ejecutor. Especifique la versión JDK en modo de hilo:
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:+desaplaceDiagnostSticvmoptions -xx:+g1summarizconcmark -Xx: iniciatingHeapOccUpancyPORCent = 35 -xx: permSize = 256m -xx:+printgcdetails -xx:+printgcdateStamps -xloggc: ./ gc.log -verbose: gc -Djava.io.tmpdir=/home/stan/tmp/hadoop-stan/nm-local-dir/usercache/stan/appcache/application_1508397483453_0095/container_1508397483453_0095_01_000004/tmp -Dspark.driver.port=52986 -Dspark.yarn.app.container.log.dir =/home/stan // hadoop-2.6.4/logs/userlogs/application_1508397483453_0095/contenedor_1508397483453_0095_01_000004 -xx: onoutofmoryerror = kill %phes org.apache.spark.executor.coarseGrainedExecutorbackend --driver-url spark: //[email protected]: 52986 --executor-id 3 --hostName stan --cores 1 --app-did aplicación_1508397483453_0095 --user-path Archivo:/home/stan/tmp/hadoop-stan/nm-local-diir/usercache/stan/appcache/application_1508397483453_0095/contenedor_1508397483453_0095_01_000004/__ App __. Jar __.
Adjunto: solución al error incompatible de la versión de tiempo de ejecución de la aplicación Spark
17/06/27 14:34:41 Info Deprecation: Mapred.Map.Tasks está en desuso. En su lugar, use mapreduce.job.maps 17/06/27 14:34:41 Info Memorystore: Block Broadcast_0 almacenado como valores en la memoria (tamaño estimado 788.8 KB, gratuito 1246.5 MB) 17/06/27 14:34:41 Información de la información MemoryStore: Bloque Broadcast_0_piT0 almacenado como bytes en la memoria (Tamaño estimado 54.0 Kb. 17/06/27 14:34:41 Info BlockManagerInfo: Se agregó Broadcast_0_Piece en memoria en 10.50.70.121:37335 (tamaño: 54.0 KB, libre: 1247.2 MB) 17/06/27 14:34:41 Información SparkContext: Broadcastado creado 0 de RDD AT Commesinfooutlier. java.lang.nosuchmethoderror: scala.reflect.api.javauniverse.runtimemirror (ljava/lang/classloader;) lscala/reflej/api/javauniverse $ javamirror; en com.fangdd.data.profile.outlier.tradeinfooutlier $ .Main (TradeInfooutlier.scala: 30) en com.fangdd.data.profile.outlier.tradeinfooutlier.main (TradeInfooutlier.scala) en Sun.Reflect.NativExetheCessImpl.Invok.Invok.inVoke) Sun.Reflect.nativemethodacCessorImpl.invoke (nativemethodaccessorImpl.java:62) en Sun.reflect.DelegatingMethodaccessorImpl.invoke (delegatingmethodaccessorsiM.Java:43) en java.lang.reflect.method.invoke (Method.Java:499999) org.apache.spark.deploy.sparksubmit $ .org $ apache $ spark $ implement $ sparksubmit $$ runmain (sparksubmit.scala: 745) en org.apache.spark.deploy.sparksubmit $ .dorunmain $ 1 (chispa (sparksubmit.scala: 181) org.apache.spark.deploy.sparksubmit $ .submit (sparksubmit.scala: 206) en org.apache.spark.deploy.sparksubmit $ .main (sparksubmit.scala: 121) en org.apache.spark.deploy.sparksubmit.Main (Sparksubsub.scala) 17/06/27 14:34:42 Información SparkContext: Invocing Stop () desde el anzuelo de cierre
Este error se debe a que el entorno de producción utiliza el entorno de ejecución de Scala 2.10 + Spark1.6.3, y el jar de aplicaciones local utiliza el entorno de compilación de Scala 2.11 + Spark.1.6.3. Por lo tanto, el error anterior se informó en el clúster de entorno de producción. Después de cambiar la versión Scala y volver a participar el paquete JAR, se informó el error anterior.
Resumir
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo tenga cierto valor de referencia para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse. Gracias por su apoyo a Wulin.com.