머리말
엔터프라이즈 및 JVM 기반 서비스에 점점 더 많은 내부 비즈니스 시스템이 있으므로 온라인 환경에서 다른 서비스를 실행하는 여러 세트의 JDK가있을 수 있습니다. Higher 버전의 Java 사양을 기반으로 작성된 서비스는 JVM의 하위 버전 : java.lang.UnsupportedClassVersionError 예외에 나타납니다.
Spark 2.2는 Java 7에 대한 지원을 제거하기 시작했습니다. 대부분의 경우 Spark 응용 프로그램은 Hadoop 시스템과 공유되는 JDK입니다. Hadoop에 의존하는 JDK 버전 7이 7이면 JDK 8을 기반으로 작성된 응용 프로그램에 문제가 있습니다.
이 기사는 주로 다른 시나리오에서 Spark Application을 위해 다른 JDK 버전을 지정하는 방법을 소개합니다.
클러스터가 지정된 JDK 버전을 배포했습니다
클러스터의 각 노드에 대한 JDK의 배포 경로가 : /usr/java/jdk1.8이라고 가정합니다.
Spark는 spark.executorEnv.[EnvironmentVariableName] 구성으로 환경 변수를 Executor 프로세스에 추가하는 데 사용할 수 있습니다. Spark Application에서 사용하는 클러스터 관리자가 독립형 인 경우 spark.executorEnv.JAVA_HOME 을 통해 Executor 측의 JDK 경로 만 공식화하면됩니다.
$ spark_home/bin/spark-submit/--conf "spark.executorenv.java_home =/usr/java/jdk1.8"/...
원사 모드에서는 다음과 같이 응용 프로그램 마스터의 다른 Java_home 환경 변수를 지정해야합니다.
$ spark_home/bin/spark-submit/---conf "spark.executorenv.java_home =/usr/java/jdk1.8"/---conf "spark.yarn.appmasterenv.java_home =/usr/java/jdk1.8"/...
클러스터 모드에서 원사에 배포 할 때 spark.yarn.appMasterEnv.JAVA_HOME Spark 응용 프로그램 드라이버에 대한 특정 JDK 버전을 설정하는 것과 같습니다.
클라이언트 모드에서 배포 할 때 spark.yarn.appMasterEnv.JAVA_HOME 단순히 Executor Launcher의 특정 JDK 버전을 설정합니다.
드라이버 측의 JDK 버전은 Spark-Submit이 위치한 기계의 Spark_home 환경 변수와 동일하며 Spark-Env.sh에서 직접 지정할 수 있습니다.
클러스터에는 특정 JDK 버전이 없으며 클러스터에 대한 관리 권한이 없습니다.
일부 특수 시나리오에서는 클러스터에 대한 관리 권한이 없으며 원사를 통해서만 응용 프로그램을 제출할 수 있으며 필요한 JDK 버전은 클러스터에 배포되지 않았습니다. 이 경우 JDK 설치 패키지를 함께 제출해야합니다.
여기서는 JDK 설치 패키지가 GZ 형식이어야하며 코드가 패키지 된 후 JAR 패키지와 동일한 디렉토리에 배치해야합니다. 우리가 다운로드 한 JDK 설치 패키지는 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.0.8.0.8.0.8.0.8.0.8.0.8.0.8.0.8.8.011111111. "spark.yarn.appmasterenv.java_home =./jdk-8u141-linux-x64.tar.gz/jdk1.8.0_141"/...
spark.yarn.dist.archives 구성을 지정하여 JDK 설치 패키지를 모든 집행자 (애플리케이션 마스터의 집행자 포함)의 작업 디렉토리에 배포 할 수 있습니다. 또한 TAR.GZ 압축 패키지도 자동으로 압축 해제됩니다. JDK-8U141-linux-x64.tar.gz의 감압 된 디렉토리가 JDK1.8.0_141이라고 가정하면, 우리의 특정 jdk 디렉토리는 다음과 같습니다. ./jdk-8u141-linux-x64.tar.gz/jdk1.8.0_141 및 JDK Versions 및 On.
참고 : Spark 독립형은 JDK 설치 패키지를 배포하고 자동으로 압축 해제하는 기능을 제공하지 않기 때문에이 방법은 원사에서만 사용할 수 있습니다.
확인하다
PS -EF GREP를 통해 특정 JDK 디렉토리에서 Java 시작 경로가 Java에 대해 성공적으로 구성되어 있음을 알 수 있습니다.
다음은 실행자 I의 프로세스 시작 정보입니다. I는 원사 모드에서 JDK 버전을 지정합니다.
스탠 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 :+g1summmarm. -xx : inittiateHeapoccupancePercent = 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/application/application_1508397483453_0095/container_1508397483453_0095_01000004/tmp -dspark.port.port.port -dspark.yarn.app.container.log.dir =/home/stan // hadoop -2.6.4/logs/usplice_1508397483453_0095/container_1508397483453_0095_01000004 -xx : OUNTOFMOROREROR = OUNFOFMOROREROR = OUNCMORORER = org.apache.spark.executor.coarsegrainedexecutorbackend-driver-url spark : //[email protected] : 52986 -executor-id 3 -hostname stan -cores -cores applact_1508397483453_0095-USER CLASS-POST 파일 :/home/stan/tmp/hadoop-stan/nm-local-dir/usercache/stan/appcache/application_1508397483453_0095/container_1508397483453_0095_01_000004/__ APP __. JAR
첨부 파일 : 스파크 애플리케이션 런타임 버전의 호환되지 않는 오류에 대한 솔루션
17/06/27 14:34:41 정보 감가 상각 : mapred.map.tasks가 더 이상 사용되지 않습니다. 대신 Mapreduce.job.maps 17/06/27 14:34:41 정보 메모리 스토어 : 블록 브로드 캐스트 _0 메모리 값 (추정 크기 788.8 kb, 무료 1246.5 MB) 17/06/27 17/06/27 14:34:41 정보 MemoryStore : Block Broadcast_0_0_0_0_0_0. 17/06/27 14:34:41 정보 BlockmanagerInfo : Memory에 10.50.70.121:37335 (크기 : 54.0 KB, 무료 : 1247.2 MB) 17/06/27 14:34:41 Infore SparkContxt : Rdd에서 생성 된 5.STRILLOOUTLIER.SCALLA : 30 in STRENGLA. java.lang.nosuchmethoderror : scala.reflect.api.javauniverse.runtimemirror (ljava/lang/classloader;) lscala/infi/api/javauniverse $ javamirror; com.fangdd.data.profile.outlier.tradeinfooutlier $ .main (com.fangdd.data.profile.outlier.tradeinfooutlier.main (sun.reflect.radeinfooutlier.main)에서 sun.reflect.natodacsorimplet Sun.Reflect.nativeMeThodaccessorimpl.invoke (nativeMethodaccessorimpl.java:62)에서 sun.reflect.delegatingMethodaccessorimpl.invoke (java.lang.lang.rffect.method.cet at org.apache.spark.deploy.sparksubmit $ .org $ apache $ spark $ spark $ 배포 $ sparksubmit $$ runmain (sparksubmit.scala : 745)에서 org.apache.spark.deploy.sparksubmit $ .dorunmain $ 1 (SparkSubmit.scala : 181) at org.apache.spark.deploy.sparksubmit $ .submit (sparksubmit.scala : 206) at org.apache.spark.deploy.sparksubmit $ .main (sparksubmit.scala : 121) at org.apache.spark.deploy.sparksubmit.main (sparksubmit.4) 17/06/27 Info SparkContext : Shutdown Hook에서 STOP ()을 호출합니다
이 오류는 생산 환경이 Scala 2.10 + Spark1.6.3의 실행 환경을 사용하고 로컬 애플리케이션 JAR은 Scala 2.11 + Spark.1.6.3의 컴파일 환경을 사용하기 때문입니다. 따라서 위의 오류는 생산 환경 클러스터에보고되었습니다. Scala 버전을 변경하고 JAR 패키지를 다시 참여한 후 위의 오류 가보고되었습니다.
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.