2017-08-05 15 views
1

あまりにも多くのメモリを使用しているPythonワーカー(PySparkアプリ)を実行しようとしていますが、メモリ制限を超過しているためにアプリがYARNを殺していますより多くの労働者を育てることができるようにするために)。Spark + PythonでGCメモリのしきい値を設定しました

私はPythonのGCは、私の頭の中でJVMよりも似ていますので...

はそれが持っている「使用可能なメモリ」の量は、何のPythonを伝える方法がありますが、Javaの/スカラ座から来ますか?つまり、ヒープサイズがほぼ満杯になったJava GCです。私はPython上で同じ操作をしたいので、糸が私のアプリケーションを殺すことはありません。なぜなら、そのメモリがガーベジであるときに多すぎるメモリを使うからです(私はPython3.3を使用しています。

私はリソースのハードとソフトの制限を見てきましたが、GCがトリガーしたかどうかを示すドキュメントはありません。 AFAIKはメモリ使用量によってGCをトリガするものではありませんが、any1はそうする方法を知っていますか?

おかげで、

答えて

1

CPythonのは(私はこれがあなたが使用するものであると仮定)は、Javaと比較して著しく異なっています。メインのガベージコレクション方法はreference countingです。循環参照(通常のPySparkワークフローでは一般的ではありません)を扱わない限り、完全なGCスイープはまったく必要ありません(データが流出/節約されるとデータ関連オブジェクトを収集する必要があります)。

Sparkは再利用オプションを有効にしてもアイドル状態のPythonワーカーを殺すことが知られているので、GCを完全にスキップします。

あなたはset_thresholdメソッドを使用して、CPythonのガベージコレクションの動作を制御することができます。

gc.set_threshold(threshold0[, threshold1[, threshold2]] 

または手動でトリガGCスイープcollectと:

gc.collect(generation=2) 

が、私の経験でPySparkにおけるGCの問題のほとんどはから来

PythonではなくJVMの部分。

+0

ありがとう(もう一度)。はい、私はCythonを使用しています。私はこれらの閾値オプションを見ましたが、AFAIKは使用されるメモリの量をトリガーしません。いくつかのコピーの後で手動収集を実行しました(私は巨大なパンダメモリコピーを持っています。シリアライザをCompressedSerializer(PickleSerializer())をデフォルト(SparkContextコンストラクタのもの)に変更したため、JVMの問題は発生していません。私のCPUは私の他の懸念事項(基本的にはmem)と比較してvstrong/running lightであるため、圧縮はここではうまくいきます(私はそれがなくても高速です)。 – BiS

+0

*私の前のコメントに追加するので、メモリサイズに基づいてそれを行うオプションはないと思います。私は、デフォルトのGCがそれぞれのX時間/割り当てをトリガーするのを読んだことがあります(GCのためにYARNが起こるのを待っていません)ので、今はあなたが言ったように手動で呼び出すつもりです。 私が困惑しているのは、no1がPySparkのCompressedSerializerについて言及していて、ブロードキャストのデフォルトとして使用していますが、Googleには何も見つかりませんでした(私はコードに潜んで見つけました)。少なくとも私のためにはそれは不思議に過ぎません。 – BiS

関連する問題