Spark集群是主從結(jié)構(gòu)。節(jié)點(diǎn)分為驅(qū)動(dòng)器(Driver) 節(jié)點(diǎn)以及執(zhí)行器(executor) 節(jié)點(diǎn)享完。驅(qū)動(dòng)器節(jié)點(diǎn)可以和大量的執(zhí)行器節(jié)點(diǎn)進(jìn)行通信灼芭, 它們也都作為獨(dú)立的 Java 進(jìn)程運(yùn)行。驅(qū)動(dòng)器節(jié)點(diǎn)和所有的執(zhí)行器節(jié)點(diǎn)一起被稱為一個(gè) Spark 應(yīng)用(application)般又。
驅(qū)動(dòng)器節(jié)點(diǎn)
Spark驅(qū)動(dòng)器是執(zhí)行程序中的 main() 方法的進(jìn)程彼绷。它執(zhí)行用戶編寫的用來(lái)創(chuàng)建SparkContext巍佑、創(chuàng)建 RDD,以及進(jìn)行 RDD 的轉(zhuǎn)化操作和行動(dòng)操作的代碼苛预。當(dāng)啟動(dòng) Spark shell 時(shí)句狼,就啟動(dòng)了一個(gè) Spark 驅(qū)動(dòng)器程序(Spark shell 總是會(huì)預(yù)先加載一個(gè)叫作 sc 的 SparkContext 對(duì)象)。驅(qū)動(dòng)器程序一旦終止热某, Spark 應(yīng)用也就結(jié)束了腻菇。
主要職責(zé)
- 把用戶程序轉(zhuǎn)為任務(wù):Spark 驅(qū)動(dòng)器程序負(fù)責(zé)把用戶程序轉(zhuǎn)為多個(gè)物理執(zhí)行的單元, 這些單元也被稱為任務(wù)(task)昔馋。Spark 會(huì)對(duì)邏輯執(zhí)行計(jì)劃作一些優(yōu)化筹吐,比如將連續(xù)的映射轉(zhuǎn)為流水線化執(zhí)行,將多個(gè)操作合并到一個(gè)步驟中等秘遏。 這樣 Spark 就把邏輯計(jì)劃轉(zhuǎn)為一系列步驟(stage)丘薛。而每個(gè)步驟又由多個(gè)任務(wù)組成。這些任務(wù)會(huì)被打包并送到集群中邦危。任務(wù)是 Spark 中最小的工作單元洋侨,用戶程序通常要啟動(dòng)成百上千的獨(dú)立任務(wù)。
- 為執(zhí)行器節(jié)點(diǎn)調(diào)度任務(wù):有了物理執(zhí)行計(jì)劃之后倦蚪, Spark 驅(qū)動(dòng)器程序必須在各執(zhí)行器進(jìn)程間協(xié)調(diào)任務(wù)的調(diào)度希坚。執(zhí)行器進(jìn)程啟動(dòng)后,會(huì)向驅(qū)動(dòng)器進(jìn)程注冊(cè)自己陵且。因此裁僧,驅(qū)動(dòng)器進(jìn)程始終對(duì)應(yīng)用中所有的執(zhí)行器節(jié)點(diǎn)有完整的記錄。每個(gè)執(zhí)行器節(jié)點(diǎn)代表一個(gè)能夠處理任務(wù)和存儲(chǔ) RDD 數(shù)據(jù)的進(jìn)程慕购。Spark 驅(qū)動(dòng)器程序會(huì)根據(jù)當(dāng)前的執(zhí)行器節(jié)點(diǎn)集合聊疲, 嘗試把所有任務(wù)基于數(shù)據(jù)所在位置分配給合適的執(zhí)行器進(jìn)程。 當(dāng)任務(wù)執(zhí)行時(shí)沪悲,執(zhí)行器進(jìn)程會(huì)把緩存數(shù)據(jù)存儲(chǔ)起來(lái)获洲,而驅(qū)動(dòng)器進(jìn)程同樣會(huì)跟蹤這些緩存數(shù)據(jù)的位置, 并且利用這些位置信息來(lái)調(diào)度以后的任務(wù)殿如,以盡量減少數(shù)據(jù)的網(wǎng)絡(luò)傳輸贡珊。
執(zhí)行器節(jié)點(diǎn)
工作進(jìn)程Spark 應(yīng)用啟動(dòng)時(shí), 執(zhí)行器節(jié)點(diǎn)就被同時(shí)啟動(dòng)握截,并且始終伴隨著整個(gè) Spark 應(yīng)用的生命周期而存在飞崖。如果有執(zhí)行器節(jié)點(diǎn)發(fā)生了異常或崩潰谨胞, Spark 應(yīng)用也可以繼續(xù)執(zhí)行固歪。
主要職責(zé)
- 它們負(fù)責(zé)運(yùn)行組成 Spark 應(yīng)用的任務(wù):并將結(jié)果返回給驅(qū)動(dòng)器進(jìn)程
- 它們通過(guò)自身的塊管理器(Block Manager)為用戶程序中要求緩存的 RDD 提供內(nèi)存式存儲(chǔ)。 RDD 是直接緩存在執(zhí)行器進(jìn)程內(nèi)的,因此任務(wù)可以在運(yùn)行時(shí)充分利用緩存數(shù)據(jù)加速運(yùn)算牢裳。
集群管理器
Spark 依賴于集群管理器來(lái)啟動(dòng)執(zhí)行器節(jié)點(diǎn)逢防,而在某些特殊情況下,也依賴集群管理器來(lái)啟動(dòng)驅(qū)動(dòng)器節(jié)點(diǎn)蒲讯。集群管理器是 Spark 中的可插拔式組件忘朝。除了 Spark 自帶的獨(dú)立集群管理器, Spark 也可以運(yùn)行在其他外部集群管理器上判帮, 比如 YARN 局嘁。
不論你使用的是哪一種集群管理器,你都可以使用 Spark 提供的統(tǒng)一腳本 spark-submit 將你的應(yīng)用提交到那種集群管理器上晦墙。 通過(guò)不同的配置選項(xiàng)悦昵, spark-submit 可以連接到相應(yīng)的集群管理器上, 并控制應(yīng)用所使用的資源數(shù)量晌畅。
任務(wù)的大致執(zhí)行過(guò)程
- 用戶通過(guò) spark-submit 腳本提交應(yīng)用但指。
- spark-submit 腳本啟動(dòng)驅(qū)動(dòng)器程序,調(diào)用用戶定義的 main() 方法抗楔。
- 驅(qū)動(dòng)器程序與集群管理器通信棋凳,申請(qǐng)資源以啟動(dòng)執(zhí)行器節(jié)點(diǎn)。
- 集群管理器為驅(qū)動(dòng)器程序啟動(dòng)執(zhí)行器節(jié)點(diǎn)连躏。
- 驅(qū)動(dòng)器進(jìn)程執(zhí)行用戶應(yīng)用中的操作剩岳。 根據(jù)程序中所定義的對(duì) RDD 的轉(zhuǎn)化操作和行動(dòng)操
作,驅(qū)動(dòng)器節(jié)點(diǎn)把工作以任務(wù)的形式發(fā)送到執(zhí)行器進(jìn)程反粥。 - 任務(wù)在執(zhí)行器程序中進(jìn)行計(jì)算并保存結(jié)果卢肃。
- 如果驅(qū)動(dòng)器程序的 main() 方法退出疲迂,或者調(diào)用了 SparkContext.stop()才顿,驅(qū)動(dòng)器程序會(huì)終止執(zhí)行器進(jìn)程,并且通過(guò)集群管理器釋放資源
spark-submit的使用
spark-submit的一些常見(jiàn)的標(biāo)記如下:
其中的標(biāo)記后可以接不同的參數(shù)尤蒿,例如對(duì)于--master可以配置的參數(shù)如下表所示:
下面是一些應(yīng)用部署的例子:
bin/spark-submit [options] <app jar | python file> [app options]
# 一般的執(zhí)行格式如上
bin/spark-submit my_script.py
# 本地執(zhí)行
bin/spark-submit --master spark://host:7077 --executor-memory 10g my_script.py
# --master 標(biāo)記指定要連接的集群 URL郑气;spark:// 表示集群使用獨(dú)立模式。稍后會(huì)討論其他的 URL 類型
$ ./bin/spark-submit \
--master spark://hostname:7077 \
--deploy-mode cluster \
--class com.databricks.examples.SparkExample \
--name "Example Program" \
--jars dep1.jar,dep2.jar,dep3.jar \
--total-executor-cores 300 \
--executor-memory 10g \
myApp.jar "options" "to your application" "go here"
# 使用獨(dú)立集群模式提交Java應(yīng)用
$ export HADOP_CONF_DIR=/opt/hadoop/conf
$ ./bin/spark-submit \
--master yarn \
--py-files somelib-1.2.egg,otherlib-4.4.zip,other-file.py \
--deploy-mode client \
--name "Example Program" \
# 使用YARN客戶端模式提交Python應(yīng)用
打包代碼以及依賴
對(duì)于python:你可以通過(guò)標(biāo)準(zhǔn)的 Python 包管理器(比如 pip 和 easy_install)直接在集群中的所有機(jī)器上安裝所依賴的庫(kù)腰池, 或者把依賴手動(dòng)安裝到 Python 安裝目錄下的 sitepackages/ 目錄中尾组。 你也可以使用 spark-submit 的 --py-Files 參數(shù)提交獨(dú)立的庫(kù),這樣它們也會(huì)被添加到 Python 解釋器的路徑中示弓。如果你沒(méi)有在集群上安裝包的權(quán)限讳侨,可以手動(dòng)添加依賴庫(kù)。
對(duì)于Java 和 Scala: spark-submit 的 --jars 標(biāo)記提交獨(dú)立的 JAR 包依賴奏属。當(dāng)只
有一兩個(gè)庫(kù)的簡(jiǎn)單依賴跨跨, 并且這些庫(kù)本身不依賴于其他庫(kù)時(shí),這種方法比較合適。一
般 Java 和 Scala 的工程會(huì)依賴很多庫(kù)勇婴。當(dāng)你向 Spark 提交應(yīng)用時(shí)忱嘹,你必須把應(yīng)用的整個(gè)依賴傳遞圖中的所有依賴都傳給集群。 你不僅要傳遞你直接依賴的庫(kù)耕渴,還要傳遞這些庫(kù)的依
賴拘悦, 等等。常規(guī)的做法是使用構(gòu)建工具橱脸,生成單個(gè)大 JAR 包础米, 包含應(yīng)用的所有的傳遞依賴。大多數(shù) Java 或 Scala 的構(gòu)建工具都支持生成這樣的工件添诉。例如java的maven以及scala的sbt椭盏。
獨(dú)立的集群管理器
- 將編譯好的 Spark 復(fù)制到所有機(jī)器的一個(gè)相同的目錄下,比如 /home/yourname/spark吻商。
- 設(shè)置好從主節(jié)點(diǎn)機(jī)器到其他機(jī)器的 SSH 無(wú)密碼登陸掏颊。
# 在主節(jié)點(diǎn)上:運(yùn)行ssh-keygen并接受默認(rèn)選項(xiàng)
$ ssh-keygen -t dsa
Enter file in which to save the key (/home/you/.ssh/id_dsa): [回車]
Enter passphrase (empty for no passphrase): [空]
Enter same passphrase again: [空]
# 在工作節(jié)點(diǎn)上:
# 把主節(jié)點(diǎn)的~/.ssh/id_dsa.pub文件復(fù)制到工作節(jié)點(diǎn)上,然后使用:
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
$ chmod 644 ~/.ssh/authorized_keys
- 編輯主節(jié)點(diǎn)的 conf/slaves 文件并填上所有工作節(jié)點(diǎn)的主機(jī)名艾帐。
# A Spark Worker will be started on each of the machines listed below.
192.168.142.136
192.168.142.137
- 在主節(jié)點(diǎn)上運(yùn)行 sbin/start-all.sh(要在主節(jié)點(diǎn)上運(yùn)行而不是在工作節(jié)點(diǎn)上)以啟動(dòng)集群乌叶。如果全部啟動(dòng)成功, 你不會(huì)得到需要密碼的提示符柒爸,而且可以在http://masternode:8080看到集群管理器的網(wǎng)頁(yè)用戶界面准浴,上面顯示著所有的工作節(jié)點(diǎn)。
- 要停止集群捎稚,在主節(jié)點(diǎn)上運(yùn)行 bin/stop-all.sh乐横。配置獨(dú)立集群管理器的更多細(xì)節(jié)請(qǐng)參考 Spark 的官方文檔(http://spark.apache.org/docs/latest/spark-standalone.html)
- 提交應(yīng)用:spark-submit --master spark://masternode:7077 yourapp
可以使用 --master 參數(shù)以同樣的方式啟動(dòng) spark-shell 或 pyspark,來(lái)連接到該集群上:
spark-shell --master spark://masternode:7077
pyspark --master spark://masternode:7077