29、Java仮想マシンのガベージコレクションのチューニング

一、背景

RDDの永続性、大量のデータの永続化時の場合は、ガベージコレクタのJava仮想マシンは、パフォーマンスのボトルネックになることがあります。定期的にJava仮想マシンのガベージコレクションなので、それはすべてのJavaオブジェクトの追跡、維持されます
と、もはや使用され、これらのオブジェクトを見つけるためにガベージコレクタをして、新しいオブジェクトのメモリを解放するために古いオブジェクトをクリーンアップ。

ガベージコレクションのパフォーマンスのオーバーヘッドは、メモリ内のオブジェクトの数、および比例しています。したがって、ガベージコレクションの問題の性能は、最初は、そのような配列と文字列などのより効率的なデータ構造を使用して、であり;第二の場合、永続RDDあり、
永続的な配列のレベル、およびKryoのライブラリの配列を使用してその結果、各パーティションだけ一つのオブジェクト-バイトのアレイ。

画像


第二に、ガベージコレクションを監視

私たちはどのように多くの場合、ガベージコレクション、および各時間ガベージコレクションを費やした時間を含め、ガベージコレクションを監視することができます。限り火花防止としてスクリプトを提出、あなたは、設定を追加することができます
 --conf "spark.executor.extraJavaOptions = -verbose:gcを-XXを:+ PrintGCDetails -XX:+ PrintGCTimeStampsを" 

しかし、Java仮想マシンのガベージコレクションについての情報がプリントアウトされますが、覚えているが、それは労働者ではなく、ドライバーのログにログに出力されます。

しかし、これはSparkUI(4040ポート)によってガベージコレクションの各段階の状況を観察するために、実際には、唯一の完全に可能な方法です。


第三に、メモリの最適化実行者の割合

図1に示すように、図示

画像


0002

对于垃圾回收来说,最重要的就是调节RDD缓存占用的内存空间,与算子执行时创建的对象占用的内存空间的比例。默认情况下,Spark使用每个executor 60%的内存空间来缓存RDD,
那么在task执行期间创建的对象,只有40%的内存空间来存放。

在这种情况下,很有可能因为你的内存空间的不足,task创建的对象过大,那么一旦发现40%的内存空间不够用了,就会触发Java虚拟机的垃圾回收操作。因此在极端情况下,
垃圾回收操作可能会被频繁触发。

在上述情况下,如果发现垃圾回收频繁发生。那么就需要对那个比例进行调优,使用new SparkConf().set("spark.storage.memoryFraction", "0.5")即可,可以将RDD缓存占用空间的比例降低,
从而给更多的空间让task创建的对象进行使用。

因此,对于RDD持久化,完全可以使用Kryo序列化,加上降低其executor内存占比的方式,来减少其内存消耗。给task提供更多的内存,从而避免task的执行频繁触发垃圾回收。


四、高级的垃圾回收调优

1、图解

画像


2、说明

Java堆空间被划分成了两块空间,一个是年轻代,一个是老年代。年轻代放的是短时间存活的对象,老年代放的是长时间存活的对象。年轻代又被划分了三块空间,Eden、Survivor1、Survivor2。

首先,Eden区域和Survivor1区域用于存放对象,Survivor2区域备用。创建的对象,首先放入Eden区域和Survivor1区域,如果Eden区域满了,那么就会触发一次Minor GC,
进行年轻代的垃圾回收。Eden和Survivor1区域中存活的对象,会被移动到Survivor2区域中。然后Survivor1和Survivor2的角色调换,Survivor1变成了备用。

如果一个对象,在年轻代中,撑过了多次垃圾回收,都没有被回收掉,那么会被认为是长时间存活的,此时就会被移入老年代。此外,如果在将Eden和Survivor1中的存活对象,
尝试放入Survivor2中时,发现Survivor2放满了,那么会直接放入老年代。此时就出现了,短时间存活的对象,进入老年代的问题。

如果老年代的空间满了,那么就会触发Full GC,进行老年代的垃圾回收操作。






Spark中,垃圾回收调优的目标就是,只有真正长时间存活的对象,才能进入老年代,短时间存活的对象,只能呆在年轻代。不能因为某个Survivor区域空间不够,
在Minor GC时,就进入了老年代。从而造成短时间存活的对象,长期呆在老年代中占据了空间,而且Full GC时要回收大量的短时间存活的对象,导致Full GC速度缓慢。

如果发现,在task执行期间,大量full gc发生了,那么说明,年轻代的Eden区域,给的空间不够大。此时可以执行一些操作来优化垃圾回收行为:
1、spark.storage.memoryFractionの割合を減らすことを含む、若い世代に店にスペースが短期生存オブジェクトの詳細を与える;
 2、エデンの領域に多くのスペースを割り当てられ、あなたは一般エデンエリアに推奨-Xmn使用することができ、予想されたサイズの4/3  3 、HDFSファイルの場合、良好な推定値エデン領域サイズ、それぞれ4つのタスクエグゼキュータを有している場合、各圧縮ブロック伸張器のHDFSサイズはそれぞれに加えて、3倍HDFSブロックサイズは、64Mである
:次いで、予想面積はエデンのサイズである 4 * 3 *の64メガバイトは、その後、再び-Xmnパラメータで、エデン領域サイズが64 * 3 * 4 * 4/3に設定されているが






##要約
実際には、ああ、経験に基づいて、ガベージコレクションをチューニングするために、それは可能な限り、その上のメモリの比率エグゼキュータを調整しています。JVMのチューニングは非常に複雑で敏感だからです。それは、本当に場所に最後の手段である場合を除き
、その後、自分自身と関連する技術的なJVMの非常に理解し、その後、時間エデン地域を調整するために、チューニングが可能です。

一部の高度なパラメータ
 -XX:SurvivorRatio = 4:値が4であれば、それはエデンを持つ2つのサバイバーの比が2:4、それは若い世代によって占有され、各サバイバーの割合が1/6であると言うことですので、あなた実際には、あなたはまた、サバイバーの主要な領域のサイズを試すことができます。
-XX:NewRatio = 4:新世代の割合と老後を調整します

おすすめ

転載: www.cnblogs.com/weiyiming007/p/11263457.html