一站削、背景
舉例來說,(雖然是舉例孵稽,但是基本都是用我們實(shí)際在企業(yè)中用的生產(chǎn)環(huán)境中的配置和經(jīng)驗(yàn)來說明的)许起。50個(gè)executor,1000個(gè)task菩鲜。一個(gè)map园细,10M。
默認(rèn)情況下接校,1000個(gè)task猛频,1000份副本。10G的數(shù)據(jù)蛛勉,網(wǎng)絡(luò)傳輸鹿寻,在集群中,耗費(fèi)10G的內(nèi)存資源诽凌。
如果使用了廣播變量毡熏。50個(gè)execurtor,50個(gè)副本侣诵。500M的數(shù)據(jù)痢法,網(wǎng)絡(luò)傳輸恬试,而且不一定都是從Driver傳輸?shù)矫總€(gè)節(jié)點(diǎn),還可能是就近從最近的節(jié)點(diǎn)的executor的bockmanager上拉取變量副本疯暑,網(wǎng)絡(luò)傳輸速度大大增加;500M的內(nèi)存消耗哑舒。
10000M妇拯,500M,20倍洗鸵。20倍~以上的網(wǎng)絡(luò)傳輸性能消耗的降低越锈;20倍的內(nèi)存消耗的減少。
對性能的提升和影響膘滨,還是很客觀的甘凭。
雖然說,不一定會(huì)對性能產(chǎn)生決定性的作用火邓。比如運(yùn)行30分鐘的spark作業(yè)丹弱,可能做了廣播變量以后,速度快了2分鐘铲咨,或者5分鐘躲胳。但是一點(diǎn)一滴的調(diào)優(yōu),積少成多纤勒。最后還是會(huì)有效果的坯苹。
沒有經(jīng)過任何調(diào)優(yōu)手段的spark作業(yè),16個(gè)小時(shí)摇天;三板斧下來粹湃,就可以到5個(gè)小時(shí);然后非常重要的一個(gè)調(diào)優(yōu)泉坐,影響特別大为鳄,shuffle調(diào)優(yōu),2-3個(gè)小時(shí)坚冀;應(yīng)用了10個(gè)以上的性能調(diào)優(yōu)的技術(shù)點(diǎn)济赎,JVM+廣播,30分鐘记某。16小時(shí)~30分鐘司训。
二、流程圖示
如果說液南,task使用大變量(1m~100m)壳猜,明知道會(huì)導(dǎo)致性能出現(xiàn)惡劣的影響。那么我們怎么來解決呢滑凉?
廣播统扳,Broadcast喘帚,將大變量廣播出去。而不是直接使用
- Question
這種默認(rèn)的咒钟,task執(zhí)行的算子中吹由,使用了外部的變量,每個(gè)task都會(huì)獲取一份變量的副本朱嘴,有什么缺點(diǎn)呢倾鲫?在什么情況下,會(huì)出現(xiàn)性能上的惡劣的影響呢萍嬉?
- Answer
1乌昔、map,本身是不小壤追,存放數(shù)據(jù)的一個(gè)單位是Entry磕道,還有可能會(huì)用鏈表的格式的來存放Entry鏈條。所以map是比較消耗內(nèi)存的數(shù)據(jù)格式行冰。
2溺蕉、比如,map是1M悼做”捍總共,你前面調(diào)優(yōu)都調(diào)的特好贿堰,資源給的到位辙芍,配合著資源,并行度調(diào)節(jié)的絕對到位羹与,1000個(gè)task故硅。大量task的確都在并行運(yùn)行。
3纵搁、這些task里面都用到了占用1M內(nèi)存的map吃衅,那么首先,map會(huì)拷貝1000份副本腾誉,通過網(wǎng)絡(luò)傳輸?shù)礁鱾€(gè)task中去徘层,給task使用±埃總計(jì)有1G的數(shù)據(jù)趣效,會(huì)通過網(wǎng)絡(luò)傳輸。網(wǎng)絡(luò)傳輸?shù)拈_銷猪贪,不容樂觀磅尉础!H妊骸西傀!網(wǎng)絡(luò)傳輸斤寇,也許就會(huì)消耗掉你的spark作業(yè)運(yùn)行的總時(shí)間的一小部分。
4拥褂、map副本娘锁,傳輸?shù)搅烁鱾€(gè)task上之后,是要占用內(nèi)存的饺鹃。1個(gè)map的確不大致盟,1M;1000個(gè)map分布在你的集群中尤慰,一下子就耗費(fèi)掉1G的內(nèi)存。對性能會(huì)有什么影響呢雷蹂?
5伟端、不必要的內(nèi)存的消耗和占用,就導(dǎo)致了匪煌,你在進(jìn)行RDD持久化到內(nèi)存责蝠,也許就沒法完全在內(nèi)存中放下;就只能寫入磁盤萎庭,最后導(dǎo)致后續(xù)的操作在磁盤IO上消耗性能霜医;
6、你的task在創(chuàng)建對象的時(shí)候驳规,也許會(huì)發(fā)現(xiàn)堆內(nèi)存放不下所有對象肴敛,也許就會(huì)導(dǎo)致頻繁的垃圾回收器的回收,GC吗购。GC的時(shí)候医男,一定是會(huì)導(dǎo)致工作線程停止,也就是導(dǎo)致Spark暫停工作那么一點(diǎn)時(shí)間捻勉。頻繁GC的話镀梭,對Spark作業(yè)的運(yùn)行的速度會(huì)有相當(dāng)可觀的影響。
- Answer
廣播變量踱启,初始的時(shí)候报账,就在Drvier上有一份副本。
task在運(yùn)行的時(shí)候埠偿,想要使用廣播變量中的數(shù)據(jù)透罢,此時(shí)首先會(huì)在自己本地的Executor對應(yīng)的BlockManager中,嘗試獲取變量副本冠蒋;如果本地沒有琐凭,那么就從Driver遠(yuǎn)程拉取變量副本,并保存在本地的BlockManager中浊服;此后這個(gè)executor上的task统屈,都會(huì)直接使用本地的BlockManager中的副本胚吁。
executor的BlockManager除了從driver上拉取,也可能從其他節(jié)點(diǎn)的BlockManager上拉取變量副本愁憔,舉例越近越
BlockManager腕扶,也許會(huì)從遠(yuǎn)程的Driver上面去獲取變量副本;也有可能從距離比較近的其他節(jié)點(diǎn)的Executor的BlockManager上去獲取