本篇博客簡述 Spark 集羣相關的概念。html
Spark 的"集羣"不是提供運算服務的,而是一種資源分配的調度器。
執行任務的 Spark 進程做爲客戶端向"集羣"申請資源(運算節點), "集羣"分配資源之後,
這個 Spark 進程會分解一些計算工做,並把他們放到這些申請來的資源中運行。node
提交給 Spark 執行的工做稱作 application
(應用),對應的主程序稱做:driver program
。driver program
經過一個叫作 SparkContext
的對象來協調 Spark 集羣中不一樣進程的任務。數據庫
具體來講:apache
driver program
向"集羣"申請到得運算節點稱做 worker node;app
一旦申請到 worker node,driver program
會鏈接這些 worker node, 並在 worker node 上建立(acquire)執行計算的進程(executor
);分佈式
接下來 driver program
將計算須要的代碼和數據發給 executor
;函數
最後 SparkContext
將分解出來的 task
(任務) 發送給各個 executor
去執行。oop
過程以下圖所示:ui
這裏有一些注意點:spa
每一個 application
都得到本身獨立的 executor
進程,這個executor
進程利用多個線程運行多個 task
。這樣能夠保證不一樣application
的隔離性,不管是調度端(driver program
分解各自的 task
),仍是執行端(每一個executor
只跑來自同一個 application
的 task
)。不過這也意味着,不一樣的 application
之間除非藉助外部存儲系統(例如數據庫),不然是不能夠共享數據的。
Spark 是不須要知道運行在什麼樣的 "集羣" 上的。Spark 只須要能夠建立進程,而且和這些進程通訊,不管是運行在什麼樣的集羣上(eg. Mesos/YARN)均可以。
driver program
必須在整個生命週期中能夠從不一樣的 executor
接受鏈接。所以,driver program
對於 executor
來講,
必須是網路可及的。
由於由driver program
分解 task
,它必須和 worker
節點很接近,最好在同一個局域網。
若是你不能作到這一點(例如從遠程提交 application
),最好開一個 RPC,利用靠近 Spark 集羣的機器來運行 driver program
實現集羣的程序稱爲:集羣管理器
。目前有三種集羣管理器
:
Standalone - 這個集羣管理器打包在 spark 的程序裏,是最簡單的集羣管理器。
Apache Mesos - 一個很是成熟的分佈式操做系統,能夠用來運行除 Spark 之外的不少系統。
Hadoop YARN - Hadoop 的 資源管理器。
術語 | 解釋 |
---|---|
Application | 在 Spark 上運行的工做, 由 driver program 和 executors 組成 |
Application jar | 包含 Application 代碼的 jar 包。在一些應用場景中,jar 須要包含依賴的庫。不過永遠不要包含 Hadoop 和 Spark 的庫 |
Driver program | 運行 Application 的main() 函數的進程,而且 SparkContext 對象在此進程中建立 |
Cluster manager(集羣管理器) | 實現集羣的資源調度分配的外部程序 |
Deploy mode | 用於區分 driver program 進程在哪裏運行。cluster 模式下,driver 在集羣中的節點上運行。 client 模式下,driver 在集羣之外的地方運行 |
Worker node | 集羣中運行程序的節點 |
Executor | 在 worker node 中爲 各 Application 建立的進程。它會執行 Application 相關的 task,將它們的數據保存在內存中或磁盤上。 |
Task | 執行具體計算的單元,會被髮送給特定的 executor 執行 |
Job | 一個由多個 task 組成的並行計算集,它們生成 Spark 動做(eg. save, collect) 的結果。這個術語會出如今 driver 的日誌中 |
Stage | 每一個 job 會被分解成更小的 task 的集合,這些集合被稱做 stage 。它們彼此依賴(就像 MapReduce 中的 map 和 reduce 兩個 stage );這個術語會出如今 driver 的日誌中 |