Spark 原理 —— 從 akka 到 spark 叢集的啟動
阿新 • • 發佈:2018-12-20
1. actor 到 akka
- Actor 是一種訊息併發模型,基於事件模型的併發機制。
- Scala 的 Actor 類似於 Java 中的多執行緒程式設計,不同在於:
- Scala 的 Actor 設計的初衷在於儘可能地避免鎖和共享狀態,從而避免多執行緒併發時出現資源徵用的情況;
- 原因在於,Java 中多數使用的是可變狀態的物件資源,對這些資源進行共享實現多執行緒程式設計的話,需要控制好資源競爭與防止物件狀態被意外修改,而物件狀態的不變形往往很難保證;
- scala中,我們可以通過複製不可變狀態的資源(即物件,scala中一切皆物件,函式方法也是)的一個副本,再基於 Actor 的訊息傳送和接收機制進行並行程式設計;
- Akka
- Akka 使用 Scala 語言開發,基於 actor 併發模型實現;
- Spark 的 RPC 便是通過 Akka 類庫實現的;
- Actor是Akka中最核心的概念,它是一個封裝了狀態和行為的物件,Actor 之間可以通過交換訊息的方式進行通訊;
- 每個 Actor 都有自己的收件箱(mailbox),通過 Actor 能夠簡化鎖及執行緒管理;
- ActorSystem
- 使用ActorSystem這一重量級結構,能夠建立很多 Actor
- 它回去分配多個執行緒,在實際應用中,ActorSystem 通常是一個單例物件;
2. actor 用法
- Actor 方法的執行順序:
- 建立 Actor
- 通過 ActorSystem
- 呼叫 Actor 的 start() 方法啟動 Actor(類似於 Java 執行緒的 start() 方法)
- 便會去執行 act() 方法(對於 Java 執行緒即是執行執行緒中定義的 run 方法)
- 向 Actor 傳送訊息;
- 建立 Actor
- Akka 中的 Actor,Actor 負責通訊,
- preStart():該方法在 Actor 物件構造方法執行後執行,整個 Actor 生命週期僅執行一次;
- receive():該方法在 Actor 的 preStart 方法執行完成後執行,用於接收訊息,會被反覆執行;
- Spark 叢集模式下的啟動呼叫順序:
- 首先需要 Master 及 Worker 兩個角色(模組)
- Master 中的 ActorSystem 建立名為 “master” 的 actor
- Worker 中的 ActorSystem 建立名為 “worker” 的 actor
- 然後兩個 actor 進行通訊;
- Master 及 Worker 中的 Actor 通訊流程如下:
- worker actor 將請求的引數封裝進一個 case class 中(序列化後)傳送給 master actor;
- master actor 收到請求,對其進行反序列化,經過模式匹配後,獲取到函式呼叫及其引數;
- master actor 將計算後的結果返回給 worker actor;
- 首先需要 Master 及 Worker 兩個角色(模組)