共享變數的使用

2021-08-09 06:19:19 字數 1696 閱讀 6454

在預設情況下,當spark在集群的多個不同節點的多個任務上並行執行乙個函式時,它會把函式中涉及到的每個變數,在每個任務上都生成乙個副本。但是,有時候,需要在多個任務之間共享變數,或者在任務(task)和任務控制節點(driver program)之間共享變數。為了滿足這種需求,spark提供了兩種型別的變數:廣播變數(broadcast variables)和累加器(accumulators)。廣播變數用來把變數在所有節點的記憶體之間進行共享。累加器則支援在所有不同節點之間進行累加計算(比如計數或者求和)。

廣播變數(broadcast variables)允許程式開發人員在每個機器上快取乙個唯讀的變數,而不是為機器上的每個任務都生成乙個副本。通過這種方式,就可以非常高效地給每個節點(機器)提供乙個大的輸入資料集的副本。spark的「動作」操作會跨越多個階段(stage),對於每個階段內的所有任務所需要的公共資料,spark都會自動進行廣播。通過廣播方式進行傳播的變數,會經過序列化,然後在被任務使用時再進行反序列化。這就意味著,顯式地建立廣播變數只有在下面的情形中是有用的:當跨越多個階段的那些任務需要相同的資料,或者當以反序列化方式對資料進行快取是非常重要的。

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

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

broadcastvar:org.apache.spark.broadcast.broadcast[array[int]] = broadcast(0)

scala> broadcastvar.value

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

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

累加器是僅僅被相關操作累加的變數,通常可以被用來實現計數器(counter)和求和(sum)。spark原生地支援數值型(numeric)的累加器,程式開發人員可以編寫對新型別的支援。如果建立累加器時指定了名字,則可以在spark ui介面看到,這有利於理解每個執行階段的程序。

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

下面是乙個**例項,演示了使用累加器來對乙個陣列中的元素進行求和:

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

accum:org.apache.spark.util.longaccumulator = longaccumulator(id: 0, name: some(myaccumulator), value: 0)

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

scala> accum.value

res1: long = 10

Tensorflow 變數的共享

tensorflow exp example sparse tensor classification train validate.py 當你需要train的過程中validate的時候,如果用placeholder來接收輸入資料 那麼乙個compute graph可以完成這個任務。如果你用的是t...

Tensorflow 變數的共享

tensorflow exp example sparse tensor classification train validate.py 當你需要train的過程中validate的時候,如果用placeholder來接收輸入資料 那麼乙個compute graph可以完成這個任務。如果你用的是t...

Tensorflow 變數的共享

tensorflow exp example sparse tensor classification train validate.py 當你需要train的過程中validate的時候,如果用placeholder來接收輸入資料 那麼乙個compute graph可以完成這個任務。如果你用的是t...