2016-10-27 11 views
1

私の入力データセットは約150Gです。 私はスパーク:エグゼキュータのメモリが物理的な制限を超えています

--conf spark.cores.max=100 
--conf spark.executor.instances=20 
--conf spark.executor.memory=8G 
--conf spark.executor.cores=5 
--conf spark.driver.memory=4G 

を設定していますが、データが均等執行に分散されていないので、私はここに

Container killed by YARN for exceeding memory limits. 9.0 GB of 9 GB physical memory used 

を取得保管が私の質問です:

1. Did I not set up enough memory in the first place? I think 20 * 8G > 150G, but it's hard to make perfect distribution, so some executors will suffer 
2. I think about repartition the input dataFrame, so how can I determine how many partition to set? the higher the better, or? 
3. The error says "9 GB physical memory used", but i only set 8G to executor memory, where does the extra 1G come from? 

ありがとうございました! 0.1 *あなたのエグゼキュータのメモリ設定に

spark.yarn.executor.memoryOverhead 

これはデフォルト:

+0

sparkエグゼキュータのインスタンスを20に設定しています。これは、正しく呼び出すと、8Gのエグゼキュータを20人ずつ起動することを意味します。それを減らして試してみることはできますか?それを1に減らすことが始まりです。 – ar7

+0

こんにちは、エグゼクティブを1に減らすと、8Gメモリのエグゼキュータが1つしかないので、150Gの入力が入りません – user2628641

+0

糸容器が十分なメモリに設定されていない可能性があります。あなたが直面しているエラーの可能な解決策? http://stackoverflow.com/a/33118489/6199146とhttp://m.blog.csdn.net/article/details?id=50387104 – ar7

答えて

2

9ギガバイトは、あなたが.1に設定されたパラメータ、spark.yarn.executor.memoryOverheadとして追加8GBのエグゼキュータのメモリで構成されているので、コンテナの総メモリは8GB + (.1 * 8GB) ≈ 9GBあるspark.yarn.executor.memoryOverhead + (spark.yarn.executor.memoryOverhead * spark.yarn.executor.memoryOverhead)です。

単一のエグゼキュータを使用してプロセス全体を実行できますが、これには時間がかかります。 To understand this you need to know the notion of partitions and tasks.パーティションの数は、入力とアクションによって定義されます。たとえば、hdfsから150GBのcsvを読み込み、hdfsのブロックサイズが128MBの場合は、150 * 1024/128 = 1200パーティションになります。このパーティションは、Spark UIの1200個のタスクに直接マッピングされます。

すべての単一のタスクは、エグゼキュータによってピックアップされます。これまでに150GBのメモリをすべて保持する必要はありません。たとえば、単一のエグゼキュータがある場合、明らかにSparkの並列機能の恩恵を受けることはありませんが、最初のタスクから開始し、データを処理してdfsに保存し直します。次のタスク。

どうかをチェックする必要があります

  • 入力パーティションはどのくらいありますか? Is the input file splittable at all? 1つのエグゼキュータが膨大な量のメモリをロードしなければならない場合、メモリが不足しています。
  • あなたはどのような行動をしていますか?たとえば、カーディナリティーが非常に低い結合を実行すると、特定の値を持つすべての行が同じパーティションで終了するため、大量のパーティションになります。
  • 非常に高価な、または非効率なアクションが実行されましたか?任意のデカルト製品など

これは役立ちます。ハッピースパーク!

2

糸を使用して、あなたのエグゼキュータ用の糸コンテナ要求をするためにどのように大きな数字に別の設定があります。あなたのエグゼキュータ・メモリーとして指定するものに加えて、余分なオーバーヘッド・メモリーの容量を定義します。最初にこの番号を増やしてみてください。

また糸容器はあなたに任意のサイズのメモリを与えません。小さい番号に「オーバーシュート」あなたのリスクを軽減することを設定

yarn.scheduler.minimum-allocation-mb 

:それはそれだけの倍数は、この設定によって制御される最小割り当てサイズ、ですされたメモリサイズで割り当てられたコンテナを返します。あなたが求めた金額。

私は通常、スパークリクエストが私のエグゼキュータがどれだけ大きいかを制御するために、希望のコンテナサイズより大きな値に以下のキーを設定します。これは糸の最大サイズです。

nodemanager.resource.memory-mb 
関連する問題