Prefácio
Com mais e mais sistemas de negócios internos nos serviços da empresa e da JVM, pode haver vários conjuntos de JDKs executando serviços diferentes no ambiente on-line. Todo mundo sabe que os serviços escritos com base na versão superior da especificação Java aparecerão na versão inferior da JVM: java.lang.UnsupportedClassVersionError Exception.
O Spark 2.2 começou a remover o suporte para o Java 7. Na maioria dos casos, nosso aplicativo Spark é um JDK compartilhado com o sistema Hadoop. Se a versão 7 do JDK de que o Hadoop depende é 7, haverá problemas com o aplicativo escrito com base no JDK 8.
Este artigo apresenta principalmente como especificar diferentes versões JDK para aplicação de Spark em diferentes cenários.
O cluster implantou a versão JDK especificada
Suponha que o caminho de implantação do JDK para cada nó no cluster seja: /usr/java/jdk1.8
Spark fornece spark.executorEnv.[EnvironmentVariableName] Configuração, que pode ser usada para adicionar variáveis de ambiente ao processo do executor. Se o gerente de cluster usado pelo Spark Application for independente, você só precisará formular o caminho JDK do lado do executor através spark.executorEnv.JAVA_HOME , como segue:
$ Spark_home/bin/spark-submit/---conf "spark.executorenv.java_home =/usr/java/jdk1.8"/...
No modo de fio, você também precisa especificar diferentes variáveis de ambiente Java_Home para o mestre do aplicativo, como segue:
$ Spark_home/bin/spark-submit/---conf "spark.executorenv.java_home =/usr/java/jdk1.8"/---conf "spark.yarn.appmasterenv.java_home =/usr/java/jdk1.8"/...
Ao implantar no fio no modo de cluster, spark.yarn.appMasterEnv.JAVA_HOME é equivalente a definir uma versão JDK específica para o driver do aplicativo Spark;
Ao implantar no modo Client, spark.yarn.appMasterEnv.JAVA_HOME simplesmente define uma versão JDK específica para o Executor Launcher.
A versão JDK do lado do driver é a mesma que a variável de ambiente Spark_Home na máquina em que o Spark-Submit está localizado e pode ser especificado diretamente no Spark-env.sh.
O cluster não possui uma versão JDK específica e não possui permissões administrativas no cluster.
Em alguns cenários especiais, não temos permissões de gerenciamento para o cluster e só podemos enviar a inscrição através do YARN, e a versão JDK de que precisamos não é implantada no cluster. Nesse caso, precisamos enviar o pacote de instalação do JDK juntos.
Aqui, exigimos que nosso pacote de instalação JDK esteja no formato GZ e seja colocado no mesmo diretório que o pacote JAR após o seu código for embalado. Suponha que o pacote de instalação do JDK que baixemos seja: 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.arenv.java_home =./Jdk-8u141-linux-x64.art.java_home =./Jdk-8u141-linux-x64.arnv.java_home =./Jdk-8u141-linux-x64.ar. "Spark.yarn.appmasterenv.java_home =./jdk-8u141-linux-x64.tar.gz/jdk1.8.0_141"/...
Podemos distribuir o pacote de instalação do JDK para o diretório de trabalho de todos os executores (incluindo o executor do mestre do aplicativo) especificando a configuração spark.yarn.dist.archives . Além disso, o pacote compactado TAR.GZ também será automaticamente descomprimido. Supondo que o diretório descompactado do JDK-8U141-linux-x64.tar.gz seja JDK1.8.0_141, o diretório do nosso JDK específico é: ./jdk-8u141-linux-x64.tar.gz/jdk1.8.0_141,
Nota: Como o Spark Standalone não fornece a função de distribuir pacotes de instalação JDK e descomprimir automaticamente, esse método só pode ser usado em fios.
verificar
Através do PS -EF Grep, você pode ver que o caminho de inicialização do Java está configurado com sucesso para Java em nosso diretório JDK específico.
A seguir, são apresentadas as informações de inicialização do processo para o executor que especifique a versão JDK no modo de fio:
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:+desblockDignicVMoptions -xx:+g1sMAR -Xx: initiatingHeApCupancyPercent = 35 -xx: PermSize = 256m -xx:+printgcdetails -xx:+printgcdatestamps -xloggc: ./ gc.log -verbose: gc: gc -Djava.io.tmpdir =/home/stan/tmp/hadoop-stan/nm-local-DIR/userCache/stan/appcache/Application_1508397483453_0095/container_1508397753_0095_001_00000444830953_0095/tmp -Dspark.yarn.app.container.log.dir =/home/stan // hadoop -2.6.4/logs/userlogs/application_1508397483453_0095/container_150839748343_0095_01_000004 -xxxxxxxx. org.apache.spark.executor.coarsegrinedExecutorbackend-driver-url spark: //[email protected]: 52986 --executor-id 3-hostname stan--cores 1 --p-id Application_150839748344530 Arquivo:/home/stan/tmp/hadoop-stan/nm-local-Dir/usercache/stan/appcache/appold_1508397483453_0095/container_1508397483453_0095_01_000004/__ App __. Jar
Anexo: Solução para o erro incompatível da versão de tempo de execução do aplicativo Spark
17/06/27 14:34:41 Informações depreciação: mapRed.map.tasks está descontinuado. Em vez disso, use o mapReduce.job.maps 17/06/27 14:34:41 Info MemoryStore: Block Broadcast_0 armazenado como valores na memória (tamanho estimado 788,8 kb, grátis 1246,5 mb) 17/06/27 14:34:41 Informações Memoratore: Block Dreming: Filmast_0cast, 06/06/27 14:34:41 Memorystore: Bloco Broadtcast, 06/06/27 14:34:41 Memoration: Blocktlet. 17/06/27 14:34:41 Info BlockManagerInfo: Adicionado Broadcast_0_Piece0 na memória em 10.50.70.121:37335 (Tamanho: 54,0 KB, Free: 1247.2 MB) 17/06/27 14:3:41 Info SparkContext: Crieftcast 0 a partir de Rddd, a partir de Ridt. java.lang.nosuchmethoderror: scala.reflect.api.javauniverse.runtimemirror (ljava/lang/classloader;) lscala/refletir/api/javauniverse $ javamirror; em com.fangdd.data.profile.outlier.tradeInfooutlier $ .Main (tradeInfooutlier.scala: 30) em com.fangdd.data.profile.implier.tradeinfooutlier.main (nfooutlier.Acmat.Reflet.RadeInFoatlier.Main (nFooutlier.Acma) em sunRade.reflect.RadeInFoatlier.Main (nfooutlier.Acnaet.Reflet.Radein.RefLier.MaClier.Mokin. em sun.reflelect.nativeMethodAccessorImpl.invoke (nativemethodaccessorimpl.java:62) em sun.reflelect.delegatingMethodAccessorimpl.invake (delegatingMethodAccessorImpl.Java:43) em java.lang.reflectMenMethMenMethMenMetMenMetM. org.apache.spark.deploy.sparksubMit $ .org $ apache $ spark $ implantar $ sparksubmit $$ runmain (sparksubmit.scala: 745) em org.apache.spark.deploy.sparksubmit $ .DorunMain $ 1 (SparksubMitmit.sCala: org.apache.spark.deploy.sparksubmit $ .submit (sparksubmit.scala: 206) em org.apache.spark.deploy.sparksubmit $ .Main (Sparksubmit.scala: 121) em org.apache.spark.deploy.deplo 14:34:42 Informações SparkContext: Invocando Stop () From Shutdown Hook
Esse erro ocorre porque o ambiente de produção usa o ambiente de corrida do Scala 2.10 + Spark1.6.3, e o frasco de aplicativos local usa o ambiente de compilação do Scala 2.11 + Spark.1.6.3. Portanto, o erro acima foi relatado no cluster do ambiente de produção. Depois de alterar a versão do Scala e se envolver novamente no pacote JAR, o erro acima foi relatado.
Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.