私はSparkの初心者で、テキストフィールドから14KBのデータを読み取り、いくつかの変換とアクション(collect、collectAsMap)を実行し、データをデータベースに保存するためにアプリケーションを実行しています。
16Gメモリ、8つの論理コアを搭載したMacbookでローカルに実行しています。
Java Maxヒープは12Gに設定されます。
以下は、アプリケーションを実行するために使用するコマンドです。
bin/spark-submit --class com.myapp.application --master local [*] --executor-memory 2G --driver-memory 4G /jars/application.jar
次の警告が表示されます
2017-01-13 16:57:31.579 [Executor task launch worker-8hread] WARN org.Apache.spark.storage.MemoryStore-rdd_57_0をメモリにキャッシュするのに十分なスペースがありません! (これまでに計算された26.4 MB)
ここで何が間違っているのか、どのようにパフォーマンスを向上させることができますか?また、suffle-spillを最適化する方法は?ここに私のローカルシステムで起こる流出のビューがあります
メモリが多すぎるエグゼキュータを実行すると、多くの場合、ガベージコレクションの遅延が過剰になります。したがって、より多くのメモリを割り当てることは得策ではありません。 14KBのデータしかありませんので、2GBのエグゼキューターメモリと4GBのドライバーメモリで十分です。これだけのメモリを割り当てる必要はありません。このジョブは100MBのメモリでも実行でき、パフォーマンスは2GBよりも優れています。
アプリケーションのマスターはドライバーを実行するため、アプリケーションを糸クラスターモードで実行する場合、ドライバーメモリはより便利です。ここでは、ローカルモードでアプリケーションを実行していますdriver-memory
は必要ありません。この設定をジョブから削除できます。
アプリケーションで割り当てた
Java Max heap is set at: 12G.
executor-memory: 2G
driver-memory: 4G
合計メモリ割り当て= 16GBおよびMacbookに16GBのみのメモリがあります。ここで、RAMメモリの合計をsparkアプリケーションに割り当てました。
これは良くない。オペレーティングシステム自体は約1GBのメモリを消費し、RAMメモリも消費する他のアプリケーションを実行している可能性があります。アプリケーションがエラーNot enough space to cache the RDD
をスローしています
executor-memory 1G
以下に減らしますdriver-memory
を削除します。ジョブを送信します。スムーズに実行されます。
spark=メモリ管理テクニックを知りたい場合は、この便利な記事を参照してください。