Spark高階篇 共享變數

2021-09-29 20:20:47 字數 1577 閱讀 8821

目錄

共享變數

廣播變數 概述

原理 實現

總結累加器 概述

實現 總結

使用廣播變數,每個executor的記憶體中,只駐留乙份變數副本,而不是對每個task都傳輸一次變數,省去了很多的網路傳輸,對效能的提公升有很大的幫助,而且通過高效的廣播演算法來減少傳輸代價。

使用廣播變數的場景很多,spark一種常見的優化方式就是小表廣播,使用map join來代替reduce join,通過把小的資料集廣播到各個節點上。節省了一次昂貴的shuffle操作。比如driver上有一行資料量很小的表,其他節點上的task都需要lookup這張表,那麼driver可以先把這張表資料廣播到各個executor節點,這樣task就可以在本地查表了。

在driver端將序列化的物件分成小塊,並將這些塊儲存在driver的blockmanager中。在每個executor上,executor首先嘗試從自身的blockmanager中獲取物件,如果不存在,則使用網路傳輸從driver端或者其他的executor(如果可用)中取出塊,一旦他獲得了塊,他會將塊放入自己的blockmanager中供其他的執行者從中獲取。

這可以防止driver程式成為傳送廣播資料的多個副本(每個executor乙個)的瓶頸。

**如下:

def main(args: array[string]): unit = ).foreach(println)

}

其中呼叫sparkcontext.broadcast(v)就可以對變數進行廣播。

1. 廣播變數快取到每乙個executor的記憶體中,而不是每個task,每個executor中的task共享乙份廣播資料。

2. 廣播變數被建立後,能被集群中執行的任何函式呼叫,通過廣播變數的.value獲取值

3. 廣播變數是唯讀的,只能在executor中讀取,不能對該廣播變數進行修改。

4.rdd不能廣播,如果需要廣播rdd中的資料需要呼叫collect方法收集到driver端,然後在廣播。

什麼時候使用廣播變數:

中間資料,應用資料,需要廣播。知識庫資料

資料特點:資料穩定,資料量不大,資料會頻繁被使用

累加器是被相關操作累加的變數,因此可以在並行中被有效的支援,他可以被同來實現計數器和總和。

累加器通過對乙個初始化的變數'v'呼叫sparkcontext.accumulator(v)來建立。在spark執行的任務可以通過add或者+=方法來在累加器上進行累加操作。但是它們不能讀取它的值,只有driver能夠讀取它的值通過累加器的value方法

累加器只支援加法操作,可以高效的並行,用於實現計數器和變數求和 。

def main(args: array[string]): unit =
在driver端檢視累加器的值,用.value,在executor中,直接檢視,通過累加器的name。

Spark共享變數

預設情況下,如果在乙個運算元的函式中使用到了某個外部的變數,那麼這個變數的值會被拷貝到每個task中。此時每個task只能操作自己的那份變數副本。如果多個task想要共享某個變數,那麼這種方式是做不到的。spark為此提供了兩種共享變數,一種是broadcast variable 廣播變數 另一種是...

Spark特性之共享變數

spark乙個非常重要的特性就是共享變數。預設情況下,如果在乙個運算元的函式中使用到了某個外部的變數,那麼這個變數的值會被拷貝到每個task中。此時每個task只能操作自己的那份變數副本。如果多個task想要共享某個變數,那麼這種方式是做不到的。spark為此提供了兩種共享變數,一種是broadca...

Spark基礎 4 共享變數

廣播變數 broadcast variables 允許程式開發人員在每個機器上面快取乙個唯讀的變數,而不是為機器上的每個任務都生成乙個副本。spark的 行動 操作會跨越多個階段 stage 對於每個階段內的所有任務所需要的公共資料,spark都會自動進行廣播。可以通過sparkcontext.br...