序文
企業やJVMベースのサービスにますます多くの内部ビジネスシステムがあるため、オンライン環境で異なるサービスを実行しているJDKの複数のセットがある場合があります。 Java仕様のより高いバージョンに基づいて書かれたサービスは、JVM: java.lang.UnsupportedClassVersionError例外の下位バージョンに表示されることを誰もが知っています。
Spark 2.2はJava 7のサポートを削除し始めました。ほとんどの場合、SparkアプリケーションはHadoopシステムと共有されるJDKです。 Hadoopが依存しているJDKバージョン7が7である場合、JDK 8に基づいて書かれたアプリケーションに問題があります。
この記事では、主に、さまざまなシナリオでSparkアプリケーションに異なるJDKバージョンを指定する方法を紹介します。
クラスターは、指定されたJDKバージョンを展開しています
クラスター内の各ノードのJDKの展開パスは、/usr/java/jdk1.8であると仮定します
Sparkはspark.executorEnv.[EnvironmentVariableName]構成を提供します。これは、環境変数を実行プロセスに追加するために使用できます。 Sparkアプリケーションで使用されるクラスターマネージャーがスタンドアロンである場合、次のように、 spark.executorEnv.JAVA_HOMEを介してエグゼキューター側のJDKパスを策定するだけです。
$ spark_home/bin/spark-submit/-conf "spark.executorenv.java_home =/usr/java/jdk1.8"/...
YARNモードでは、次のように、アプリケーションマスターに異なる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"/...
クラスターモードでYARNに展開する場合、 spark.yarn.appMasterEnv.JAVA_HOME 、Sparkアプリケーションのドライバー用の特定のJDKバージョンを設定することに相当します。
クライアントモードで展開するとき、 spark.yarn.appMasterEnv.JAVA_HOME 、エグゼクティアランチャー用の特定のJDKバージョンを設定するだけです。
ドライバー側のJDKバージョンは、Spark-Submitが配置されているマシンのSpark_home環境変数と同じであり、Spark-Env.shで直接指定できます。
クラスターには特定のJDKバージョンがなく、クラスターに管理権限がありません。
いくつかの特別なシナリオでは、クラスターの管理権限はなく、YARNを介してアプリケーションを送信することができ、必要な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.8 "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
注: Spark Standaloneは、JDKインストールパッケージの分布の機能を提供しておらず、自動的に減圧するため、この方法はYARNでのみ使用できます。
確認する
PS -EF Grepを通じて、特定のJDKディレクトリのJavaに対してJavaスタートアップパスが正常に構成されていることがわかります。
以下は、YARNモードで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:+G1 DUSMARIZECONCMAMS -xx:initiatingheapoccupancepercent = 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/contate -dspark.yarn.app.container.log.dir =/home/stan // hadoop -2.6.4/logs/userlogs/application_1508397483453_0095/container_1508397483453_0095_01_000004 -XX:onotofmemoryerr = kid Dike%p org.apache.spark.executor.coarsegrainedexecutorbackend ---driver-url spark://[email protected]:52986-executor-id 3 - hostname stan - -cores 1 -app-id application_1508397483453453_0095-USUSER-CLASS-PSATH file:/home/stan/tmp/hadoop-stan/nm-local-dir/usercache/stan/appcache/application_1508397483453_0095/container_1508397483453_0095_01_000004/__アプリ__
添付ファイル:Sparkアプリケーションランタイムバージョンの互換性のないエラーの解決策
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 MB)17/06/27 14:34:41情報BlockManagerInfo:10.50.70.121:37335(サイズ:54.0 KB、無料:1247.2 MB)17/06/27 14:34:41 Infoccuntext:30のSpreptienfoutでのBroadcast 0から作成された17/06/27 14:34:41にbroadcast_0_piece0をメモリに追加しました:17/06/27 14:34:41 "Main" Java.lang.Nosuchmethoderror:Scala.Reflect.api.javauniverse.runtimemirror(ljava/lang/classloader;)lscala/resprem/api/javauniverse $ javamirror; com.fangdd.data.profile.outlier.tradeinfooutlier $ .main(tradeinfooutlier.scala:30)at com.fangdd.data.profile.outlier.tradeinfooutlier.main(tradeinfooutlier.scala) sun.refllect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62)sun.refllect.delegatingmethodaccessorimpl.invoke(Delegatingmethodaccessorimpl.java:43)at java.lang.reflect.method.javoke org.apache.spark.deploy.sparksubmit $ .org $ apache $ spark $ deploy $ sparksubmit $$ runmain(sparksubmit.scala:745)at org.apache.spark.deploy.sparksubmit $ .dorunmain $ 1(Sparksubmit.scala:181) 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.scala) 17/06/27 14:34:42情報SparkContext:シャットダウンフックからstop()を呼び出す
このエラーは、生産環境がSCALA 2.10 + Spark1.6.3の実行環境を使用し、ローカルアプリケーションJARがScala 2.11 + Spark.1.6.3のコンピレーション環境を使用するためです。したがって、上記のエラーは、生産環境クラスターで報告されました。 SCALAバージョンを変更し、JARパッケージを再インティングした後、上記のエラーが報告されました。
要約します
上記は、この記事のコンテンツ全体です。この記事の内容には、すべての人の研究や仕事に特定の参照値があることを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。 wulin.comへのご支援ありがとうございます。