hatunina’s blog

メモと日記です

apache sparkでInvalid maximum heap sizeって言われた時の対処

結論から言うとJDKが32bitのせいなので64bitをインストール&環境変数の設定をしましょう。

結論にたどり着くまでに色々ハマったので以下メモ(微妙な情報が混ぜってるかも)

sparkの処理中にjava.io.IOException: ディスクに十分な空き領域がありません。というエラーが出たので--driver-memoryを指定するとこんな感じのエラーが発生

>>> spark-submit --driver-memory 4g my_app.py
Invalid maximum heap size: -Xmx4g
The specified size exceeds the maximum representable size.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.


ググってみるとJDKが32bitだとヒープ領域として1.5Gしか確保できないので64bitを入れろとのこと。
確認のためjava --version

>>> java --version
java 10.0.1 2018-04-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)


ちゃんと64bitになっている。。。
てきとーにHelloWorldを作ってヒープ領域の設定が効くか確認

>>> java -Xms4G -Xmx4G HelloWorld
HelloWorld


動くやんけ。。。
でも、環境変数にはJava1.8を設定しているので、そもそもjava --verisonでJava10が表示されることがおかしいと気づく。
複数のバージョンのJDKがインストールされていて環境変数がごっちゃになっているのかも?

ググるとこんな記事が。 web.plus-idea.net
上記の通りにjava.exe周辺のリネームと余分な環境変数が設定されていたのでそれを削除
そしてもう一度確認

>>> java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) Client VM (build 25.171-b11, mixed mode)

>>> java -Xms4G -Xmx4G HelloWorld
Invalid initial heap size: -Xms4G
The specified size exceeds the maximum representable size.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.


すると、使用されるJavaは1.8になったけどヒープ領域の指定はできず。
というよりインストーラーを見るとまんまと32bitをインストールしていた。

1.8の64bitを再度インストールし各コマンド実行

>>> java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

>>> java -Xms4G -Xmx4G HelloWorld
Hello World!

>>> spark-submit --driver-memory 4g my_app.py


動いた!

よくわからん状況だけどまとめると
JDKたくさんインストールして環境変数も複数設定されていた
・$JAVA_HOMEはJava10, 64bitを見ていたのでjavaコマンドでのヒープ領域指定はうまくいくが、spark-submitではうまくいかない
spark-submitではJava1.8, 32bitを見ていた?
JDK, 環境変数を整理してJava1.8, 64bitを設定することで解決