Spark性能調優:廣播大變量broadcast

Spark性能調優:廣播大變量broadcast

原文連接:https://blog.csdn.net/leen0304/article/details/78720838網絡

概要

有時在開發過程當中,會遇到須要在算子函數中使用外部變量的場景(尤爲是大變量,好比100M以上的大集合),那麼此時就應該使用Spark的廣播(Broadcast)功能來提高性能。函數

在算子函數中使用到外部變量時,默認狀況下,Spark會將該變量複製多個副本,經過網絡傳輸到task中,此時每一個task都有一個變量副本。若是變量自己比較大的話(好比100M,甚至1G),那麼大量的變量副本在網絡中傳輸的性能開銷,以及在各個節點的Executor中佔用過多內存致使的頻繁GC,都會極大地影響性能。性能

所以對於上述狀況,若是使用的外部變量比較大,建議使用Spark的廣播功能,對該變量進行廣播。廣播後的變量,會保證每一個Executor的內存中,只駐留一份變量副本,而Executor中的task執行時共享該Executor中的那份變量副本。這樣的話,能夠大大減小變量副本的數量,從而減小網絡傳輸的性能開銷,並減小對Executor內存的佔用開銷,下降GC的頻率。spa


問題分析

Spark Application的Driver進程,其實就是咱們寫的Spark做業打成的jar運行起來的進程,以隨機抽取map步驟爲例,其工做時過程大體爲:.net

img

這種默認的狀況下,task執行的算子中使用了外部的變量,每一個task都會獲取一份變量的副本,有什麼缺點呢?在什麼狀況下會出現性能上的惡劣的影響呢?線程

由於map自己是不小,存放數據的一個單位是Entry,還有可能會用鏈表的格式的來存放Entry鏈條,因此map是比較消耗內存的數據格式。好比,map總共是1M。你前面調優都調的特好,資源給的到位,配合着資源並行度調節的絕對到位,設置1000個task,大量task的確都在並行運行。3d

第一點,這些task裏面都用到了佔用1M內存的map,那麼首先,map會拷貝1000份副本,經過網絡傳輸到各個task中去,給task使用。總計有1G的數據,會經過網絡傳輸。網絡傳輸的開銷不容樂觀啊!網絡傳輸也許就會消耗掉你的spark做業運行的總時間的一小部分。對象

第二點,map副本傳輸到了各個task上以後是要佔用內存的。也許1個map的確不大,也就1M,但1000個map分佈在你的集羣中,一會兒就耗費掉1G的內存。這對性能會有什麼影響呢?
首先沒必要要的內存的消耗和佔用,就致使了你在進行RDD持久化到內存,也許就無法徹底在內存中放下,就只能寫入磁盤,最後致使後續的操做在磁盤IO上消耗性能;還有可能你的task在建立對象的時候,也許會發現堆內存放不下全部對象,也許就會致使頻繁的垃圾回收器的回收(GC)。GC的時候必定是會致使工做線程中止,也就是致使Spark暫停工做那麼一點時間。頻繁GC的話對Spark做業的運行的速度會有至關可觀的影響。blog

這種舉例的隨機抽取的map爲1M還算小的,若是你是從哪一個表裏面讀取了一些維度數據,比方說,全部商品品類的信息,在某個算子函數中要使用到,也許會達到100M,若是有1000個task,就會有100G的數據進行網絡傳輸,集羣瞬間由於這個緣由消耗掉100G的內存。進程


廣播大變量

img

如上圖所示,每一個Executor會對應本身的BlockManager,BlockManager是負責管理某個Executor對應的內存和磁盤上的數據。

廣播變量初始的時候就在Drvier上有一份副本,task在運行的時候,想要使用廣播變量中的數據,此時首先會在本身本地的Executor對應的BlockManager中,嘗試獲取變量副本。若是本地沒有,那麼就從Driver遠程拉取變量副本,並保存在本地的BlockManager中,此後這個executor上的task都會直接使用本地的BlockManager中的副本。executor的BlockManager除了從driver上拉取,也可能從其餘節點的BlockManager上拉取變量副本,距離越近越好。

廣播變量的優勢:不是每一個task一份變量副本,而是變成每一個節點的executor才一份副本。這樣的話,就可讓變量產生的副本大大減小。

根據在實際企業中的生產環境舉例來講:總共有50個executor,1000個task,一個map大小爲10M。 默認狀況下,1000個task,1000份副本,共有10G的數據進行網絡傳輸,在集羣中,耗費10G的內存資源。 若是使用了廣播變量,50個execurtor就只有50個副本,有500M的數據進行網絡傳輸,並且不必定都是從Driver傳輸到每一個節點,還多是就近從最近的節點的executor的bockmanager上拉取變量副本,網絡傳輸速度大大增長,只有500M的內存消耗。 以前是10000M,如今是500M,大約20倍以上的網絡傳輸性能消耗的下降,20倍的內存消耗的減小。對性能的提高和影響,仍是很客觀的。 雖說,不必定會對性能產生決定性的做用。好比運行30分鐘的spark做業,可能作了廣播變量之後,速度快了2分鐘,或者5分鐘。可是一點一滴的調優,聚沙成塔,最後仍是會有效果的。

相關文章
相關標籤/搜索