troubleshooting 之解決yarn-cluster模式的JVM棧內存溢出無法執行

sparkCluster模式提交方式

spark-submit腳本提交yarn-cluster模式,

首先由腳本,提交提交spark Application 到ResourceManager上,然後ResourceManager找到一個NodeManager啓動ApplicationMaster進程,這時,我們的NodeManager就會啓動一個ApplicationMaster進程,這個就相當於我們的Driver進程,我們的Driver進程不是在本地機器跑了,這時,我們的ApplicationMaster(Driver)會去找我們的ResourceManager,申請executor,分配container(內存+cpu),然後ApplicationMaster就會找到一個NodeManager申請啓動executor,然後executor想ApplicationMaster進行反向註冊

到這裏爲止,ApplicationMaster(Driver),就知道自己有哪些資源可以用(executor),然後就會去執行job,拆分stage,提交stage的task,進行task調度,分配到各個executor上面去執行

 

yarn-client和yarn-cluster的不同之處:

yarn-client模式,driver運行在本地機器上的;

yarn-cluster模式,deriver是運行在yarn集羣上某個nodemanager節點上面的,

 

yarn-client會導致本地機器負責spark作業的調度,所以網卡流量會激增,yarn-cluster模式就沒有這個問題

yarn-client的driver運行在本地,通常來說本地機器跟yarn集羣都不會是在一個機房的,所以說性能可能不是特別好,

yarn-cluster,driver是跟yarn集羣運行在一個機房內,性能上也會好一點

實戰經驗,碰到的yarn-cluster的問題:

有的時候,運行一些包含了spark sql的spark作業,可能會碰到yarn-clent模式下,可以正常提交運行,yarn-cluster模式下,可能是無法提交運行的,會報出JVM的PermGen(永久代)的內存溢出,OOM

 

yarn-client模式下,driver是運行在本地機器上的,spark使用的JVM的PermGen的配置,是本地的spark-class文件(spark客戶端是默認有配置的),JVM的永久代的大小是128M,這個是沒有問題的,但是呢,在yarn-cluster模式下,driver是運行在yarn集羣的某個節點上的,使用的是,沒有經過配置的默認設置(PermGen的大小),82M。

spark-sql,它的內部是要進行很複雜的SQL語義解析,語法樹的轉換等等,特別複雜,在這種複雜的情況下,如果說你的sql本身特別複雜的話, 很可能會比較導致性能的消耗,內存的消耗,可能對PermGen永久代的佔用會比較大。

所以,此時,如果對永久代的佔用需求,超過了82M,但是呢又在128M以內,就會出現如上述的問題,yarn-client模式下,默認是128M,這個還可以運行,如果在yarn-cluster模式下,默認是82M,就有問題了,會報出PermGen Out of Memory error log。

 

如何解決這種問題,?

既然是JVM的PermGen永久代內存溢出,那麼就是內存不夠用,就給yarn-cluster模式下,driver的PermGen多設置一些

spark-submit腳本中,加入一下配置

--conf spark.driver.extraJavaOptions="-XX:PermSize=128M -XX:MaxPermSize=256M"  

這個就設置了driver的永久代大小,默認是128M,最大是256M,這樣就基本可以保證以上問題的出現

 

spark sql,sql,要注意,一個問題

sql,有大量的or語句,當達到or語句有成千上百的時候,此時可能會出現一個driver端的JVM stack overFlow,Jvm棧內存溢出的問題

JVM棧內存溢出,基本上就是由於調用的方法層級過多,因爲產生了大量的,非常深的,超過了JVM棧深度的限制的,遞歸,遞歸方法,我們的猜測,spark sql ,有大量or語句的時候,spark sql內部源碼中,在解析sql,不如轉換成語法樹,或者進行執行計劃的生成的時候,對or處理是遞歸,or特別多就會發生大量的遞歸

就會發生JVM stack Memory overflow,棧內存溢出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章