1. 程式人生 > >Spark 原理 —— 從 akka 到 spark 叢集的啟動

Spark 原理 —— 從 akka 到 spark 叢集的啟動

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 傳送訊息;
  • 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;