2016-06-24 11 views
9

私はspark pythonアプリケーションを使用しています。少し重いリソース(500MB以上)を読み込むステップがあるので、mapPartitionsを使用しています。基本的には:Python Spark/Yarn memory usage

def process_and_output(partition): 
    resources = load_resources() 
    for record in partition: 
     yield transform_record(resources, record) 

input = sc.textFile(input_location) 
processed = input.mapPartitions(process_and_output) 
processed.saveAsTextFile(output_location) 

実行しているとき、私は一貫して、このエラーを取得する:

ERRORのYarnScheduler:(アドレス削除)上の失われたエグゼキュータ1:コンテナは、メモリの制限を超えたためYARNにより死亡しました。 11.4 GBの物理メモリが使用されています。 spark.yarn.executor.memoryOverheadを追加することを検討してください。

私はmemoryOverheadを非常に高くしてみましたが、それでも同じ問題です。私は一緒に走った:

--conf "spark.python.worker.memory=1200m" \ 
--conf "spark.yarn.executor.memoryOverhead=5300" \ 
--conf "spark.executor.memory=6g" \ 

確かに、それは十分なメモリですか?

もっと一般的には、私は、パイソンワーカーのメモリが全体の合計でどのように制御/カウントされているかを理解するのに苦労しています。これに関する文書はありますか?

また、ジェネレータ関数を使用して実際にメモリ使用量を削減するかどうかを知りたいと思います。私は望んでいるように、Pythonプロセスを通じてデータをストリーミングするか、JVM/sparkインフラストラクチャに送り返す前にすべてバッファリングしますか?

答えて

3

ご覧のとおり、11.2 GBは糸で作られたコンテナの最大メモリです。これは、エグゼキュータのメモリー+オーバーヘッドと同じです。だから、Pythonのメモリはそれのために数えられません。

例外は、オーバーヘッドを増やすことを望みますが、オーバーヘッドメモリを増やすことなくエグゼキュータメモリを増やすことができます。なぜなら、私はあなたが単一のエグゼキュータでそのような多くのメモリを必要としているのか、デカルトであるか、そんなに多くのメモリを必要とするようなものがあるのか​​分からずに言うことができます。

5

糸は執行を殺すときに、あなたはそれが有効な例外であるように見える設定から

memory usage > (executor-memory + executor.memoryOverhead)

(memory usage)11.4GB > 11.18GB (executor-memory=6GB + memoryOverhead=5.18GB)

--conf "spark.yarn.executor.memoryOverhead=6144"

+0

愛でこの説明をしてみてください。それを本当に保つためにありがとう。 – deepelement

+0

お手伝いしました! THX – g07kore