2017-06-01 16 views
0

私は非常に大きな行列を扱うSparkアプリケーションを構築しています。Javaヒープがspark-submitで要求されたメモリを取得しない

spark-submit --driver-memory 20g --executor-memory 20g --class "mycoordinates.App" --master local[7] my.jar args 

設定私の問題は、私はOOMエラーを取得し、問題が解決しないドライバーのメモリを増やす開始し、特定のサイズのしきい値に達すると(私の理解がある:私は、次の呼び出しを使用して、単一のAWSインスタンス上でスパークを実行していますmaster = localの場合、エグゼキュータのメモリ設定は問題ではありません。確かにそれを増やしても効果はありませんでした)。私のアプリケーション内

私は、ヒープ(スカラ座でのプログラミング)を確認するには、次の文を置く:

println(" mem avail: " + java.lang.Runtime.getRuntime().totalMemory()) 
println(" max mem: " + java.lang.Runtime.getRuntime().maxMemory()) 
println(" free mem: " + java.lang.Runtime.getRuntime().freeMemory()) 

後は、一般的な出力です:20G

mem avail: 2075918336 
max mem: 21099708416 
free mem: 1720845616 
に設定

ドライバのメモリ

ドライバメモリを8Gに設定

mem avail: 2075918336 
max mem: 8303607808 
free mem: 1720720376 

ドライバメモリは、ドライバメモリが1G

maxMemory値が期待どおりに、コマンドラインからドライバ設定メモリを追跡するために思わ
mem avail: 1037959168 
max mem: 1037959168 
free mem: 1000899656 

に設定3G

mem avail: 2075918336 
max mem: 3113877504 
free mem: 1720850720 

に設定します。しかし、totalMemoryとfreeMemoryはそうではありません。 ドライバメモリの設定を2G未満にすると、totalMemoryとfreeMemoryが期待どおりに減少します。しかし、2G以上のドライバのメモリ設定については、変更されません。 totalMemoryの値は常に同じです。 freeMemoryの値は少し変わりますが、ランダムなバリエーションのように見えます。値は常に小さい範囲内です。

私はまた、アプリ内からspark設定を印刷しました。それらはすべてコマンドライン設定に一致しているようです。

私が今までに見つけたすべての情報--driver-memoryはヒープサイズを増やすことを示しています。しかし、ヒープサイズを2GBに制限する他のパラメータ設定があるようです。

ヒープが2GBを超えて成長するには、他にどのような設定が必要か教えてください。

+0

より検索した後、私はJVMに至るまでの引数を渡すことができることを見つけることができました。今私は、これらの2つの異なる引数を調整する必要がないように、初期割り当てに最大メモリを使用するようにjvmをデフォルトにする方法があるかどうか疑問に思っています。 –

答えて

0

Javaはメモリを遅延割り当てします。起動時に指定しないかぎり、現在必要なメモリより多くのメモリを割り当てません。この場合、2Gが必要ですが、正しく読むと、指定したGB値まで上がることができます。

はSO上に書く:--driver-java-optionsの-Xms8gを: What are Runtime.getRuntime().totalMemory() and freeMemory()?

+0

はい、それは私が期待していたものですが、最大のヒープが十分に大きかったにもかかわらず、メモリ不足が発生していたケースがありました。最大ヒープを使用する初期ヒープを指定すると、問題が解決されたようです。しかし、今私はその例を再現しようとしており、私はできない。だから多分何か変わったし、私はそれを認識しませんでした。 –

関連する問題