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を設定することで解決