「大數據」(七十八)Spark之通信模塊

【導讀:數據是二十一世紀的石油,蘊含巨大價值,這是·情報通·大數據技術系列第[78]篇文章,歡迎閱讀和收藏】

1 基本概念

Spark 在模塊間通信使用的是出色的高效的 AKKa 框架。 Akka 是 JAVA 虛擬機 JVM 平臺上構建高併發、分佈式和容錯應用的 工具包 和 運行時 。 Akka 用 Scala 語言寫成,同時提供了 Scala 和 JAVA 的開發接口。 Akka 處理併發的方法基於 Actor 模型。在 Akka 裡, Actor 之間通信的唯一機制就是消息傳遞 .

Spark 通信模塊主要分兩點:

l AKKA 通信框架

l Client 、 Master 和 Worker 間的通信

模塊之間的通信機制可以分為基於消息的傳遞和基於資源共享的同步機制。在 Spak 中的 Client 、 Master 和 Worker 實際上都是一個 actor 。

2 術語解釋

「大數據」(七十八)Spark之通信模塊

3 Spark 通信機制介紹

3.1 Actor 模型

所有對象都可以是 Actor , Actor 之間完全獨立。 Actor 之間只有發送信息這一種通信方式。消息通信的方式看似不如直接方法調用來的直接,但是大量的消息可以同時執行。同時,消息讓 Actor 之間解耦。

Actor 執行的唯一事件是接收到一個消息,而一個 Actor 很可能會做多件事情。模型需要一種消息分發機制,把消息分發到相應的代碼段,並指定各自需要的參數。

每一個 Actor 都擁有自己的屬性和操作、郵箱、子 Actor 和一個監管策略,所有這些包含在一個 Actor Reference 裡。

「大數據」(七十八)Spark之通信模塊

Actor 能創建更多的 Actor ,發送更多的消息。 Actor 模型內在設計是並行的、異步的。 Actor 之間不共享狀態,如果要獲取其他 actor 的信息,必須通過消息請求方式。交換的信息存放在接收方的郵箱中。

每個 actor 有且僅有一個監管者,就是創建它的那個 actor 。如果一個 actor 對某種狀況無法進行處理,它會發送相應的失敗消息給它的監管者請求幫助,這樣遞歸結構使得失敗能夠在正確的層次進行處理。

一個 actor 對象需要與外界隔離開才能從 actor 模型中獲益。所以 actor 是以 actor 引用的形式展現給外界的, actor 引用可以被自由的無限制地傳遞。

3.2 初始行為

actor 對象在創建時所定義的初始行為是特殊的,當 actor 重啟時會恢復這個初始行為。

一個 actor 的初始行為在構造方法之前就被抽取出來了,如果希望初始行為受到成員狀態的影響,需要在構造方法中調用 become 方法 。

3.3 郵箱

每個 actor 有且只有一個郵箱,所有的發來的消息都在郵箱裡排隊。排隊按照發送操作的時間順序來進行。從同一個 actor 發送多個消息到相同的 actor ,消息會按照發送的順序排隊。

可以設置郵箱中消息處理方式,默認的是 FIFO : actor 處理消息的順序與消息入隊列的順序一致。如果應用需要對某些消息進行優先處理,設置隊列的算法,消息的處理順序由隊列的算法決定。

3.4 消息

Actor 在消息內部指定了接收消息的 Actor 地址。 Actor 可以用自己的地址發送信息,相當於自己接收到自己發送的消息,驅動自己的狀態。消息傳遞是非阻塞和異步的,其機制是郵件隊列。

一般而言,每個 Actor 都在一個獨立線程上處理消息。

Actor 模型的缺點:

1) 由於 Actor 能夠動態創建其他 Actor ,這種行為使得系統的行為動態變化,很難控制。一個 actor 可能永遠陷入接收和處理消息的循環中。

2) 異步消息對於某些方式和算法並不合適。

3.5 子 Actor

子 Actor 列表維護在 actor 的上下文中, actor 可以訪問它。對列表的更改是通過創建 context.actorOf() 或者停止 context.stop(child) 子 actor 來實現的,這些更改會立刻生效。

3.6 監管策略

一旦 actor 被創建,它的監管策略便不能被修改。每個 actor 只有唯一的策略。如果一個 actor 的子 actor 應用了不同的策略,這些子 actor 按照相同的策略來進行分組。

監管描述的是 actor 之間的關係:監管者將任務委託給下屬並對下屬的失敗狀況進行響應。當一個下屬出現一個異常時,它會將自己和所有的下屬掛起然後向自己的監管者發送一個提示失敗的信息。監管者根據所監管工作的性質和失敗的性質給出答覆。

(1) 讓下屬繼續執行,保持下屬當前的內部狀態。

(2) 永久終止下屬

(3) 將失敗沿監管樹向上傳遞

(4) 重新啟動下屬,清除下屬的內部狀態

讓 actor 繼續執行同時會繼續執行它的下屬;重啟一個 actor 也必須重啟它的下屬;終止一個 actor 會終止它所有的下屬。每個監管者都有相應的一個函數,將所有可能的失敗原因歸結到上述四種選擇之一。

Actor 只能由其他的 Actor 創建,而頂部的 actor 是由庫來提供的。

3.7 Actor 終止

如果一個 actor 終止後不能用重啟來解決,就會被停止並且釋放其資源,將它郵箱中所有未處理的消息放到系統的“死信郵箱”。而 actor 引用中的郵箱會被一個系統郵箱所代替,系統郵箱會將所有新的消息重定向到“排水溝”。這些操作並不能保證一定完成。

3.8 Actor 引用

Actor 引用是 ActorRef 的子類。每個 actor 通過 self 來訪問自己的本地引用,在發送給其它 actor 的消息中也缺省包含這個引用。在消息處理的過程中, actor 可以通過 sender 來訪問到當前信息的發送者的引用。

向一個 actor 引用發送消息,會在 actor 系統樹中從根開始一層一層從父向子 actor 發送消息,直到消息到達目標或是出現某種失敗。

一個 actor 系統通常是在根 actor 上使用 ActorSystem.actorOf 創建 actor 。

ActorSystem system=ActorSystem.create("systemname");

ActorRef actor=system.actorOf(Props.create(xxx.class));

通過具體的路徑來查找 actor,ActorSystem.actorFor() 。

3.9 Actor 路徑

沿著子 actor 到父 actor 的監管鏈一直到 actor 系統的根存在一條唯一的 actor 名字序列。一個 actor 可能通過不同的路徑訪問到,除了原始路徑外,其它的路徑都包含到 actor 實際的監管祖先鏈的轉換方法。


分享到:


相關文章: