理解spark中的閉包問題

2021-08-21 14:09:20 字數 813 閱讀 6095

理解spark中的閉包

(spark官方文件「spark.apachecn.org」解釋)

什麼叫閉包: 跨作用域

(即在work節點訪問driver節點

)訪問函式變數。又指的乙個擁有許多變數和繫結了這些變數的環境的表示式(通常是乙個函式),因而這些變數也是該表示式的一部分。

**展示:

def

main(args:array[

string

]):unit =

問題分析: 

counter是在foreach函式外部定義的,也就是說是在driver程式中定義,而foreach函式是屬於rdd的,rdd函式的執行位置為各個worker節點上(或者是在worker程序),main函式是在driver節點上(或者說driver程序上)執行的,所以當counter變數在driver中定義,被rdd函式使用的時候就出現了」跨域

」的問題,也就是閉包問題

問題解釋: 

由於main函式和rdd物件的foreach函式是屬於不同」閉包

」的,所以,傳進foreach函式的counter是乙個副本,初始值都為0。foreach中疊加的是counter的副本,不管副本如何變化,都不會影響到main函式中的counter,所以最終結果還是0。

Spark中閉包的理解

概念的理解 函式可以訪問函式外面的變數,但是函式內對變數的修改,在函式外是不可見的。rdd相關操作都需要傳入自定義閉包函式 closure 如果這個函式需要訪問外部變數,那麼需要遵循一定得規則,否則會丟擲執行時異常。閉包函式傳入到節點時,需要經過下面的步驟 注意 外部變數在閉包內的修改不會被反饋到驅...

大資料開發 Spark 閉包的理解

閉包是乙個函式,返回值依賴於宣告在函式外部的乙個或多個變數。閉包通常來講可以簡單的認為是可以訪問乙個函式裡面區域性變數的另外乙個函式。如下面這段匿名的函式 val multiplier i int i 10函式體內有乙個變數 i,它作為函式的乙個引數。如下面的另一段 val multiplier i...

理解C 中的閉包

內層的函式可以引用包含在它外層的函式的變數,即使外層函式的執行已經終止。但該變數提供的值並非變數建立時的值,而是在父函式範圍內的最終值。使用閉包,我們可以輕鬆的訪問外層函式定義的變數,這在匿名方法中普遍使用。比如有如下場景,在winform應用程式中,我們希望做這麼乙個效果,當使用者關閉窗體時,給使...