Java8とJava11が共存している環境下でSparkを使おうとしたときに出たエラーを解決
概要
spark-shellからsparkを使ってもpysparkを実行しても以下のような同じエラーが出ていたので直した。
'Unsupported class file major version 55'
環境
Ubuntu18.04
Spark 2.4.3
解決方法(試行錯誤つき)
原因はJava11を使っていることらしい。使用しているJavaのバージョンを確認して、別のバージョンを選ぶために以下を実行。
$ sudo update-alternatives --config java
alternative java (/usr/bin/java を提供) には 3 個の選択肢があります。
選択肢 パス 優先度 状態
------------------------------------------------------------
0 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1101 自動モード
1 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1101 手動モード
* 2 /usr/lib/jvm/java-11-oracle/bin/java 1091 手動モード
3 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 手動モード
現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください:3
これでJava8を使うようになるかと思ったのだけれど、以下のように、そうはならなかった。
$ java --version
openjdk 11.0.2 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
そもそもどこを見に行っているのか調べてみる。すると、
$ which java
/home/ksn/.sdkman/candidates/java/current/bin/java
となっておりJava(とKotlin)はSDKMANを使ってインストールした形跡があり。
ここで、SDKMANでsparkをインストールできるらしいことを知ったのでそちらを試すことに。
$ sdk install spark
でインストールして$spark-session
から動作確認を試みたが、やはり'Unsupported class file major version 55'
のような同じエラーが出ている。
$ sdk list java
をしてSDKMANでJava8がインストール出来るのか見てみると、Javaは8以下はインストールできないっぽいことが判明。そうなるとこちらで解決しようというのは無理だということを判断。
よって、以下でSDKMANで入れたjavaをアンインストール。
$ sdk uninstall java 11.0.2-open
これで、
$ java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-8u212-b03-0ubuntu1.18.04.1-b03)
OpenJDK 64-Bit Server VM (build 25.212-b03, mixed mode)
$ which java
/usr/bin/java
となり、/usr/bin/
下のjavaを読んでくれることに。
$ spark-shell
としてSDKMANでインストールしたsparkを立ち上げてみる。すると
$ spark-shell
...
scala> val textFile = spark.read.text("README.md")
textFile: org.apache.spark.sql.DataFrame = [value: string]
scala> textFile.count()
res0: Long = 109
となり、無事エラーがでなくなった。
調べた限りだと、SparkやHadoopと一緒にJava11を使うのはまだ早すぎでJava11を使いたければSpark3.xに期待しろとのことであった。これで先日のHadoopを導入した際の問題も解決すると思われる。