Spark基礎 4 共享變數

2021-10-03 05:45:47 字數 1139 閱讀 3390

廣播變數(broadcast variables)允許程式開發人員在每個機器上面快取乙個唯讀的變數,而不是為機器上的每個任務都生成乙個副本。

spark的「行動」操作會跨越多個階段(stage),對於每個階段內的所有任務所需要的公共資料,spark都會自動進行廣播。

可以通過sparkcontext.broadcast(v)來從乙個普通變數v中建立乙個廣播變數。這個廣播變數就是對普通變數v的乙個包裝器,通過呼叫value方法可以獲得這個廣播變數的值。

scala> val broadcastvar = sc.broadcast(array(1,2,3))

scala> broadcastvar.value

res0:array[int] = array(1,2,3)

廣播變數被建立後,在集群中的任何函式中,都應該使用廣播變數broadcastvar的值,而不是使用v的值,這樣就不會把v重複分發到這些節點上。此外,一旦廣播變數建立後,普通變數v的值就不能再發生修改,從而確保所有節點都獲得廣播變數的值是相同的。

完整程式:

import org.apache.spark.sparkconf

import org.apache.spark.sparkcontext

object broadcastvalue

}

累加器是僅僅被相關操作累加的變數,通過可以被用來實現(counter)和求和(sum)

乙個數值型累加器,可以通過呼叫sparkcontext.longaccumulator()或者sparkcontext.doubleaccmulator()來建立執行在集群中的任務,就可以使用add方法來把數值累加到累加器上,但是,這些任務只能累加操作,不能讀取累加器的值,只有任務控制節點(driver program)可以使用value方法來讀取累加器的值。

scala> val accum = sc.longaccumulator("my accumulator")

scala> sc.parallelize(array(1,2,3,4)).foreach(x => accum.add(x))

scala> accum.value

在有很多節點/海量資料的情況下,使用累加器的add方法可以較大的提公升效率。

Spark共享變數

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

Spark特性之共享變數

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

Spark高階篇 共享變數

目錄 共享變數 廣播變數 概述 原理 實現 總結累加器 概述 實現 總結 使用廣播變數,每個executor的記憶體中,只駐留乙份變數副本,而不是對每個task都傳輸一次變數,省去了很多的網路傳輸,對效能的提公升有很大的幫助,而且通過高效的廣播演算法來減少傳輸代價。使用廣播變數的場景很多,spark...