欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Spark的閉包清理機制怎么理解

Spark的閉包清理機制怎么理解,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

成都創(chuàng)新互聯(lián)2013年至今,先為興山等服務建站,興山等地企業(yè),進行企業(yè)商務咨詢服務。為興山企業(yè)網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。

關于Spark任務運行時發(fā)生不可序列話的問題。今天就統(tǒng)一講解一下這塊的內容。

首先,要先讀懂scala的閉包是怎么回事兒。

簡單理解scala的閉包

接著就是要理解Spark 算子閉包生成及我們編寫的閉包執(zhí)行的原理。接下來我們就拿map和mapPartition兩個算子來開啟本文講解:

def map[U: ClassTag](f: T => U): RDD[U] = withScope {
   val cleanF = sc.clean(f)
   new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF))
 }

def mapPartitions[U: ClassTag](
     f: Iterator[T] => Iterator[U],
     preservesPartitioning: Boolean = false): RDD[U] = withScope {
   val cleanedF = sc.clean(f)
   new MapPartitionsRDD(
     this,
     (context: TaskContext, index: Int, iter: Iterator[T]) => cleanedF(iter),
     preservesPartitioning)
 }

對于任務劃分,調度,執(zhí)行,結果返回的原理浪尖就不在這里擴展了,浪尖在知識星球里分享過一套Spark 源碼的視頻,可以參考閱讀。

map和mapPartitions的區(qū)別面試常考的,對于兩者的區(qū)別從源碼里看很明顯,一個是f被迭代器迭代調用,一個是f的參數是迭代器。浪尖很早以前發(fā)過一篇文章,徹底講解過foreach和foreachPartition的區(qū)別。可以參考理解

Spark源碼系列之foreach和foreachPartition的區(qū)別

回到正題,之所以會發(fā)生不可序列化的錯誤,主要原因是傳遞給map的f函數不是在driver端執(zhí)行的,所以會被序列化傳輸到executor節(jié)點,然后在executor節(jié)點反序列化然后執(zhí)行。假如f函數里引用了map外部不可序列化的對象就會報不可序列化的異常。

但是,很多時候我們并沒有直接去在閉包里使用不可序列化的對象,這個時候報異常就有點不合適了。比如下面的例子:

*   class SomethingNotSerializable {
  *     def someValue = 1
  *     def scope(name: String)(body: => Unit) = body
  *     def someMethod(): Unit = scope("one") {
  *       def x = someValue
  *       def y = 2
  *       scope("two") { println(y + 1) }
  *     }
  *   }

此示例中,scope(two) 不可序列化,因為它引用了scope(one)(通過y),而scope(one)引用了SomethingNotSerializable(通過someValue)。但是,其實scope(two)并不直接依賴于SomethingNotSerializable。假如這種情況下拋出不可序列化異常就不科學了,所以Spark會對閉包進行一些清理操作,也即是本文中所要講的。

主要工具類是ClosureCleaner。該工具的主要作用是遍歷閉包的層次結構,并且將沒有被閉包實際引用的鏈路設置為null,但是仍然包含在已經編譯的匿名類中。請注意直接修改封閉中的閉包是不安全的,因為可能有其他代碼路徑會依賴于他們。所以,我們會克隆封閉中的閉包并且相應地設置父指針。

默認情況下,可以傳遞清除閉包。這就意味著,我們需要檢測封閉對象是否由起始對象實際引用,(要么直接引用要么間接引用),如果沒有被實際使用則從層次結構中切斷這些閉包。換句話說,除了清空無用字段的引用之外,也會將沒有被起始閉包引用的引用封閉對象的父指針清空。傳遞性的確定是通過遍歷閉包所調用的

再回到前面的例子,scope(two) 不可序列化,因為它引用了scope(one)(通過y),而scope(one)引用了SomethingNotSerializable(通過someValue)。但是,其實scope(two)并不直接依賴于SomethingNotSerializable。這就意味著我們可以安全的將其副本scope(one)的父指針清空,同時將其設置為scope(two)的父級,這樣scope(two)就不再需要間接傳遞引用SomethingNotSerializable了。

解決方法

實現(xiàn)序列化是最直接的,假如不能的話。那就讀下面的話:

那么為了不實現(xiàn)序列化還能盡量避免不可序列化錯誤,就不要在map等算子里引用外部變量,而是直接在算子中實例化,假如每次實例化代價高,那就使用mapPartitions。

看完上述內容,你們掌握Spark的閉包清理機制怎么理解的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

新聞名稱:Spark的閉包清理機制怎么理解
URL網址:http://aaarwkj.com/article32/igdipc.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供全網營銷推廣、軟件開發(fā)、網站改版、品牌網站設計網站內鏈、App開發(fā)

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

網站托管運營
日本亚洲一区二区在线观看| 91久久国产综合精品女同| 国产欧美日韩精品av| 黄片在线免费在线播放| 国产精品亚洲精品日韩在线| 日韩精品有码在线视频免费观看| 久久亚洲一本综合久久| 成人在线一区二区三区观看| 一区二区三区蜜桃av| 欧美老熟妇精品一区二区| 99精品国产中文字幕| 伊人丁香六月日日操操| 男人的天堂久久精品激情| 亚洲日本韩国一区二区| 韩国三级网站在线观看视频| 亚洲国产第一尤物视频| 免费观看久久久激情片| 青青草av一区二区三区| 乱码人妻精品一区二区三区| 国产精品99久久久久久人| 久久精品国产亚洲av久| 国产av一区二区三区| 91亚洲蜜桃内射后入在线观看 | 亚洲欧美日韩另类自拍| 男女激情视频久久精品| 国产午夜福利av在线麻豆| 91日本精品免费在线视频| 亚洲国产传媒在线观看| 欧美日韩一区二区黄色| 在线激情av中文字幕| 国产视频在线一区二区| 亚洲理论电影在线观看| 成人在线视频国产自拍| 国产精品情侣av自拍| 中文字幕国产精品91| 精品国产av色一区二区| 中文字幕人妻久久一区| 中文字幕精品一区二区三区在线| 99热只有这里才有精品| 日韩欧美亚洲综合久久精品 | av天堂午夜精品蜜臀|