Spark
支持三種集群部署模式薄辅,分別為
1.Standalone: 獨立模式,Spark 原生的簡單集群管理器抠璃, 自帶完整的服務站楚, 可單獨部署到一個集群中,無需依賴任何其他資源管理系統(tǒng)搏嗡, 使用 Standalone 可以很方便地搭建一個集群窿春,一般在公司內(nèi)部沒有搭建其他資源管理框架的時候才會使用。
2.Mesos:一個強大的分布式資源管理框架采盒,它允許多種不同的框架部署在其上旧乞,包括 yarn,由于mesos這種方式目前應用的比較少磅氨,這里沒有記錄mesos的部署方式尺栖。
3.YARN: 統(tǒng)一的資源管理機制, 在上面可以運行多套計算框架烦租, 如map reduce延赌、storm 等除盏, 根據(jù) driver 在集群中的位置不同,分為 yarn client 和 yarn cluster挫以。
實際上Spark內(nèi)部為了方便用戶測試者蠕,自身也提供了一些部署模式。由于在實際工廠環(huán)境下使用的絕大多數(shù)的集群管理器是 Hadoop YARN掐松,因此我們關(guān)注的重點是 Hadoop YARN 模式下的 Spark 集群部署踱侣。
Spark 的運行模式取決于傳遞給 SparkContext 的 MASTER 環(huán)境變量的值, 個別模式還需要輔助的程序接口來配合使用大磺,目前支持的 Master 字符串及 URL 包括:
Master URL | Meaning |
---|---|
local | 在本地運行抡句,只有一個工作進程,無并行計算能力 |
local[K] | 在本地運行量没,有 K 個工作進程玉转,通常設(shè)置 K 為機器的CPU 核心數(shù)量 |
local[*] | 在本地運行,工作進程數(shù)量等于機器的 CPU 核心數(shù)量殴蹄。 |
spark://HOST:PORT | 以 Standalone 模式運行究抓,這是 Spark 自身提供的集群運行模式,默認端口號: 7077 |
mesos://HOST:PORT | 在 Mesos 集群上運行袭灯,Driver 進程和 Worker 進程運行在 Mesos 集群上刺下,部署模式必須使用固定值:--deploy-mode cluster |
yarn-client | 在 Yarn 集群上運行,Driver 進程在本地稽荧, Work 進程在 Yarn 集群上橘茉, 部署模式必須使用固定值:--deploy-modeclient。Yarn 集群地址必須在HADOOP_CONF_DIRorYARN_CONF_DIR 變量里定義姨丈。 |
yarn-cluster 效率比yarn-client高 |
在 Yarn 集群上運行畅卓,Driver 進程在 Yarn 集群上,Work 進程也在 Yarn 集群上蟋恬,部署模式必須使用固定值:--deploy-mode cluster翁潘。Yarn 集群地址必須在HADOOP_CONF_DIRorYARN_CONF_DIR 變量里定義。 |
用戶在提交任務給 Spark 處理時歼争,以下兩個參數(shù)共同決定了 Spark 的運行方式拜马。
·– master MASTER_URL :決定了 Spark 任務提交給哪種集群處理。
·– deploy-mode DEPLOY_MODE:決定了 Driver 的運行方式沐绒,可選值為 Client
或者 Cluster俩莽。
Standalone 模式運行機制
Standalone 集群有四個重要組成部分, 分別是:
1)Driver: 是一個進程乔遮,我們編寫的 Spark 應用程序就運行在 Driver 上扮超, 由Driver 進程執(zhí)行;
2)Master:是一個進程,主要負責資源的調(diào)度和分配瞒津,并進行集群的監(jiān)控等職責蝉衣;
3)Worker:是一個進程,一個 Worker 運行在集群中的一臺服務器上巷蚪,主要負責兩個職責病毡,一個是用自己的內(nèi)存存儲 RDD 的某個或某些 partition;另一個是啟動其他進程和線程(Executor) 屁柏,對 RDD 上的 partition 進行并行的處理和計算啦膜。
4)Executor:是一個進程, 一個 Worker 上可以運行多個 Executor淌喻, Executor 通過啟動多個線程( task)來執(zhí)行對 RDD 的 partition 進行并行計算僧家,也就是執(zhí)行我們對 RDD 定義的例如 map、flatMap裸删、reduce 等算子操作八拱。
Standalone Client 模式
在 Standalone Client 模式下,Driver 在任務提交的本地機器上運行涯塔,Driver 啟動后向 Master 注冊應用程序肌稻,Master 根據(jù) submit 腳本的資源需求找到內(nèi)部資源至少可以啟動一個 Executor 的所有 Worker,然后在這些 Worker 之間分配 Executor匕荸,Worker 上的 Executor 啟動后會向 Driver 反向注冊爹谭,所有的 Executor 注冊完成后,Driver 開始執(zhí)行 main 函數(shù)榛搔,之后執(zhí)行到 Action 算子時诺凡,開始劃分 stage,每個 stage 生成對應的 taskSet践惑,之后將 task 分發(fā)到各個 Executor 上執(zhí)行腹泌。
Standalone Cluster 模式
在 Standalone Cluster 模式下,任務提交后尔觉,Master 會找到一個 Worker 啟動 Driver進程凉袱, Driver 啟動后向 Master 注冊應用程序, Master 根據(jù) submit 腳本的資源需求找到內(nèi)部資源至少可以啟動一個 Executor 的所有 Worker穷娱,然后在這些 Worker 之間分配 Executor绑蔫,Worker 上的 Executor 啟動后會向 Driver 反向注冊运沦,所有的 Executor 注冊完成后泵额,Driver 開始執(zhí)行 main 函數(shù),之后執(zhí)行到 Action 算子時携添,開始劃分 stage嫁盲,每個 stage 生成對應的 taskSet,之后將 task 分發(fā)到各個 Executor 上執(zhí)行。
注意羞秤, Standalone 的兩種模式下( client/Cluster) 缸托, Master 在接到 Driver 注冊
Spark 應用程序的請求后,會獲取其所管理的剩余資源能夠啟動一個 Executor 的所有 Worker瘾蛋, 然后在這些 Worker 之間分發(fā) Executor俐镐, 此時的分發(fā)只考慮 Worker 上的資源是否足夠使用,直到當前應用程序所需的所有 Executor 都分配完畢哺哼, Executor 反向注冊完畢后佩抹,Driver 開始執(zhí)行 main 程序。
YARN 模式運行機制
YARN Client 模式
在 YARN Client 模式下取董,Driver 在任務提交的本地機器上運行企量,Driver 啟動后會和 ResourceManager 通訊申請啟動 ApplicationMaster戚哎, 隨后 ResourceManager 分配 container , 在 合 適 的 NodeManager 上啟動 ApplicationMaster ,此時的 ApplicationMaster 的功能相當于一個 ExecutorLaucher枣接, 只負責向 ResourceManager
申請 Executor 內(nèi)存。
ResourceManager 接到 ApplicationMaster 的資源申請后會分配 container窑业,然后
ApplicationMaster 在資源分配指定的 NodeManager 上啟動 Executor 進程翔怎, Executor 進程啟動后會向 Driver 反向注冊, Executor 全部注冊完成后 Driver 開始執(zhí)行 main 函數(shù)画侣,之后執(zhí)行到 Action 算子時冰悠,觸發(fā)一個 job,并根據(jù)寬依賴開始劃分 stage配乱,每個 stage 生成對應的 taskSet溉卓,之后將 task 分發(fā)到各個 Executor 上執(zhí)行。
YARN Cluster 模式
在 YARN Cluster 模式下搬泥, 任務提交后會和 ResourceManager 通訊申請啟動
ApplicationMaster桑寨, 隨后 ResourceManager 分配 container,在合適的 NodeManager
上啟動 ApplicationMaster忿檩,此時的 ApplicationMaster 就是 Driver尉尾。
Driver 啟動后向 ResourceManager 申請 Executor 內(nèi)存, ResourceManager 接到
ApplicationMaster 的資源申請后會分配 container燥透,然后在合適的 NodeManager 上啟動 Executor 進程沙咏,Executor 進程啟動后會向 Driver 反向注冊, Executor 全部注冊完成后 Driver 開始執(zhí)行 main 函數(shù)班套,之后執(zhí)行到 Action 算子時肢藐,觸發(fā)一個 job,并根據(jù)寬依賴開始劃分 stage吱韭,每個 stage 生成對應的 taskSet吆豹,之后將 task 分發(fā)到各個Executor 上執(zhí)行。