web-dev-qa-db-ja.com

Sparkドライバメモリとエグゼキュータメモリ

私は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を最適化する方法は?ここに私のローカルシステムで起こる流出のビューがあります

enter image description here

8
nnc

メモリが多すぎるエグゼキュータを実行すると、多くの場合、ガベージコレクションの遅延が過剰になります。したがって、より多くのメモリを割り当てることは得策ではありません。 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をスローしています

  1. Javaヒープを12 GBに割り当てることは使用できません。4GB以下に減らす必要があります。
  2. エグゼキューターのメモリーをexecutor-memory 1G以下に減らします
  3. ローカルで実行しているため、構成からdriver-memoryを削除します。

ジョブを送信します。スムーズに実行されます。

spark=メモリ管理テクニックを知りたい場合は、この便利な記事を参照してください。

Spark on yarn executorリソース割り当て

8
Sandeep Singh