私は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インフラストラクチャに送り返す前にすべてバッファリングしますか?
愛でこの説明をしてみてください。それを本当に保つためにありがとう。 – deepelement
お手伝いしました! THX – g07kore