1. spark三種分布式部署模式
Spark支持的主要的三種分布式部署方式分別是standalone、spark on mesos和 spark on YARN羹唠。standalone模式,即獨(dú)立模式方咆,自帶完整的服務(wù)娃圆,可單獨(dú)部署到一個(gè)集群中,無需依賴任何其他資源管理系統(tǒng)滓走。它是Spark實(shí)現(xiàn)的資源調(diào)度框架,其主要的節(jié)點(diǎn)有Client節(jié)點(diǎn)帽馋、Master節(jié)點(diǎn)和Worker節(jié)點(diǎn)搅方。而yarn是統(tǒng)一的資源管理機(jī)制,在上面可以運(yùn)行多套計(jì)算框架绽族,如map reduce姨涡、storm等根據(jù)driver在集群中的位置不同,分為yarn client和yarn cluster吧慢。而mesos是一個(gè)更強(qiáng)大的分布式資源管理框架涛漂,它允許多種不同的框架部署在其上,包括yarn检诗。
1.1 standalone框架
Standalone模式下匈仗,集群啟動時(shí)包括Master與Worker,其中Master負(fù)責(zé)接收客戶端提交的作業(yè)逢慌,管理Worker悠轩。根據(jù)作業(yè)提交的方式不同,分為driver on client 和drvier on worker涕癣。如下圖7所示哗蜈,上圖為driver on work模式,下圖為driver on client模式坠韩。兩種模式的主要不同點(diǎn)在于driver所在的位置距潘。
由于standalone模式較簡單,這里不再詳述只搁。
1.2 yarn集群模式
Apache yarn是apache Hadoop開源項(xiàng)目的一部分音比。設(shè)計(jì)之初是為了解決mapreduce計(jì)算框架資源管理的問題。到haodoop 2.0使用yarn將mapreduce的分布式計(jì)算和資源管理區(qū)分開來氢惋。它的引入使得Hadoop分布式計(jì)算系統(tǒng)進(jìn)入了平臺化時(shí)代洞翩,即各種計(jì)算框架可以運(yùn)行在一個(gè)集群中,由資源管理系統(tǒng)YRAN進(jìn)行統(tǒng)一的管理和調(diào)度焰望,從而共享整個(gè)集群資源骚亿、提高資源利用率。
YARN總體上也Master/slave架構(gòu)——ResourceManager/NodeManager熊赖。前者(RM)負(fù)責(zé)對各個(gè)NodeManager(NM)上的資源進(jìn)行統(tǒng)一管理和調(diào)度来屠。而container是資源分配和調(diào)度的基本單位,其中封裝了機(jī)器資源震鹉,如內(nèi)存俱笛、CPU、磁盤和網(wǎng)絡(luò)等传趾,每個(gè)任務(wù)會被分配一個(gè)Container迎膜,該任務(wù)只能在該Container中執(zhí)行,并使用該Container封裝的資源浆兰。NodeManager的作用則是負(fù)責(zé)接收并啟動應(yīng)用的container磕仅、而向RM回報(bào)本節(jié)點(diǎn)上的應(yīng)用Container運(yùn)行狀態(tài)和資源使用情況。ApplicationMaster與具體的Application相關(guān)镊讼,主要負(fù)責(zé)同ResourceManager協(xié)商以獲取合適的Container宽涌,并跟蹤這些Container的狀態(tài)和監(jiān)控其進(jìn)度。如下圖8所示為yarn集群的一般模型蝶棋。
Spark在yarn集群上的部署方式分為兩種卸亮,yarn client(driver運(yùn)行在客戶端)和yarn cluster(driver運(yùn)行在master上),driver on master如下圖9所示玩裙。
- (1) Spark Yarn Client向YARN中提交應(yīng)用程序兼贸,包括Application Master程序、啟動Application Master的命令吃溅、需要在Executor中運(yùn)行的程序等溶诞;
- (2) Resource manager收到請求后,在其中一個(gè)node manager中為應(yīng)用程序分配一個(gè)container决侈,要求它在container中啟動應(yīng)用程序的Application Master螺垢,Application master初始化sparkContext以及創(chuàng)建DAG Scheduler和Task Scheduler。
- (3) Application master根據(jù)sparkContext中的配置,向resource manager申請container枉圃,同時(shí)功茴,Application master向Resource manager注冊,這樣用戶可通過Resource manager查看應(yīng)用程序的運(yùn)行狀態(tài)
- (4) Resource manager 在集群中尋找符合條件的node manager孽亲,在node manager啟動container坎穿,要求container啟動executor,
- (5) Executor啟動后向Application master注冊返劲,并接收Application master分配的task
-
(6) 應(yīng)用程序運(yùn)行完成后玲昧,Application Master向Resource Manager申請注銷并關(guān)閉自己。
Driver on client如下圖10所示:
- (1) Spark Yarn Client向YARN的Resource Manager申請啟動Application Master篮绿。同時(shí)在SparkContent初始化中將創(chuàng)建DAG Scheduler和TASK Scheduler等
- (2) ResourceManager收到請求后孵延,在集群中選擇一個(gè)NodeManager,為該應(yīng)用程序分配第一個(gè)Container亲配,要求它在這個(gè)Container中啟動應(yīng)用程序的ApplicationMaster隙袁,與YARN-Cluster區(qū)別的是在該ApplicationMaster不運(yùn)行SparkContext,只與SparkContext進(jìn)行聯(lián)系進(jìn)行資源的分派
- (3) Client中的SparkContext初始化完畢后弃榨,與Application Master建立通訊菩收,向Resource Manager注冊,根據(jù)任務(wù)信息向Resource Manager申請資源(Container)
- (4) 當(dāng)application master申請到資源后鲸睛,便與node manager通信娜饵,要求它啟動container
- (5) Container啟動后向driver中的sparkContext注冊,并申請task
-
(6) 應(yīng)用程序運(yùn)行完成后官辈,Client的SparkContext向ResourceManager申請注銷并關(guān)閉自己箱舞。
從下圖11:Yarn-client和Yarn cluster模式對比可以看出,在Yarn-client(Driver on client)中拳亿,Application Master僅僅從Yarn中申請資源給Executor晴股,之后client會跟container通信進(jìn)行作業(yè)的調(diào)度。如果client離集群距離較遠(yuǎn)肺魁,建議不要采用此方式电湘,不過此方式有利于交互式的作業(yè)。
\
1.3 mesos集群模式
Mesos是apache下的開源分布式資源管理框架鹅经。起源于加州大學(xué)伯克利分校寂呛,后被twitter推廣使用。Mesos上可以部署多種分布式框架瘾晃,Mesos的架構(gòu)圖如下圖12所示贷痪,其中Framework是指外部的計(jì)算框架,如Hadoop蹦误,Mesos等劫拢,這些計(jì)算框架可通過注冊的方式接入mesos肉津,以便mesos進(jìn)行統(tǒng)一管理和資源分配。
在 Mesos 上運(yùn)行的 framework 由兩部分組成:一個(gè)是 scheduler 舱沧,通過注冊到master 來獲取集群資源阀圾。另一個(gè)是在 slave 節(jié)點(diǎn)上運(yùn)行的executor進(jìn)程,它可以執(zhí)行 framework 的 task 狗唉。 Master 決定為每個(gè)framework 提供多少資源,framework 的 scheduler來選擇其中提供的資源涡真。當(dāng) framework同意了提供的資源分俯,它通過master將 task發(fā)送到提供資源的slaves 上運(yùn)行。Mesos的資源分配圖如下圖13哆料。
- (1) Slave1 向 Master 報(bào)告缸剪,有4個(gè)CPU和4 GB內(nèi)存可用
- (2) Master 發(fā)送一個(gè) Resource Offer 給 Framework1 來描述 Slave1 有多少可用資源
- (3) FrameWork1 中的 FW Scheduler會答復(fù) Master,我有兩個(gè) Task 需要運(yùn)行在 Slave1东亦,一個(gè) Task 需要<2個(gè)CPU杏节,1 GB內(nèi)存="">,另外一個(gè)Task需要<1個(gè)CPU典阵,2 GB內(nèi)存="">
-
(4) 最后奋渔,Master 發(fā)送這些 Tasks 給 Slave1。然后壮啊,Slave1還有1個(gè)CPU和1 GB內(nèi)存沒有使用嫉鲸,所以分配模塊可以把這些資源提供給 Framework2
Spark可作為其中一個(gè)分布式框架部署在mesos上,部署圖與mesos的一般框架部署圖類似歹啼,如下圖14玄渗,這里不再重述。
1.4 spark 三種部署模式的區(qū)別
在這三種部署模式中狸眼,standalone作為spark自帶的分布式部署模式藤树,是最簡單也是最基本的spark應(yīng)用程序部署模式,這里就不再贅述拓萌。這里就講一下yarn和mesos的區(qū)別:
- (1) 就兩種框架本身而言岁钓,mesos上可部署yarn框架。而yarn是更通用的一種部署框架微王,而且技術(shù)較成熟甜紫。
- (2) mesos雙層調(diào)度機(jī)制,能支持多種調(diào)度模式骂远,而Yarn通過Resource Mananger管理集群資源囚霸,只能使用一種調(diào)度模式。Mesos 的雙層調(diào)度機(jī)制為:mesos可接入如yarn一般的分布式部署框架激才,但Mesos要求可接入的框架必須有一個(gè)調(diào)度器模塊拓型,該調(diào)度器負(fù)責(zé)框架內(nèi)部的任務(wù)調(diào)度额嘿。當(dāng)一個(gè)framework想要接入mesos時(shí),需要修改自己的調(diào)度器劣挫,以便向mesos注冊册养,并獲取mesos分配給自己的資源, 這樣再由自己的調(diào)度器將這些資源分配給框架中的任務(wù)压固,也就是說球拦,整個(gè)mesos系統(tǒng)采用了雙層調(diào)度框架:第一層,由mesos將資源分配給框架帐我;第二層坎炼,框架自己的調(diào)度器將資源分配給自己內(nèi)部的任務(wù)。
- (3) mesos可實(shí)現(xiàn)粗拦键、細(xì)粒度資源調(diào)度谣光,可動態(tài)分配資源,而Yarn只能實(shí)現(xiàn)靜態(tài)資源分配芬为。其中粗粒度和細(xì)粒度調(diào)度定義如下:
粗粒度模式(Coarse-grained Mode):程序運(yùn)行之前就要把所需要的各種資源(每個(gè)executor占用多少資源萄金,內(nèi)部可運(yùn)行多少個(gè)executor)申請好,運(yùn)行過程中不能改變媚朦。
細(xì)粒度模式(Fine-grained Mode):為了防止資源浪費(fèi)氧敢,對資源進(jìn)行按需分配。與粗粒度模式一樣询张,應(yīng)用程序啟動時(shí)福稳,先會啟動executor,但每個(gè)executor占用資源僅僅是自己運(yùn)行所需的資源瑞侮,不需要考慮將來要運(yùn)行的任務(wù)的圆,之后,mesos會為每個(gè)executor動態(tài)分配資源半火,每分配一些越妈,便可以運(yùn)行一個(gè)新任務(wù),單個(gè)Task運(yùn)行完之后可以馬上釋放對應(yīng)的資源钮糖。每個(gè)Task會匯報(bào)狀態(tài)給Mesos slave和Mesos Master梅掠,便于更加細(xì)粒度管理和容錯(cuò),這種調(diào)度模式類似于MapReduce調(diào)度模式店归,每個(gè)Task完全獨(dú)立阎抒,優(yōu)點(diǎn)是便于資源控制和隔離,但缺點(diǎn)也很明顯消痛,短作業(yè)運(yùn)行延遲大且叁。
從yarn和mesos的區(qū)別可看出,它們各自有優(yōu)缺點(diǎn)秩伞。因此實(shí)際使用中逞带,選擇哪種框架欺矫,要根據(jù)本公司的實(shí)際需要而定,可考慮現(xiàn)有的大數(shù)據(jù)生態(tài)環(huán)境展氓。如我司采用yarn部署spark穆趴,原因是,我司早已有較成熟的hadoop的框架遇汞,考慮到使用的方便性未妹,采用了yarn模式的部署。
2. spark在CDH上的部署過程
CDH的全稱Cloudera’s Distribution Including Apache Hadoop空入,是cloudera公司的發(fā)行版络它。下面我們簡要介紹下在CDH集群上部署spark的過程。
2.1 安裝對應(yīng)版本的scala
- 將下載好的scala.tar.gz解壓到/usr/local/scala执庐,可自己指定解壓路徑。
- 在/etc/profile中添加SCALA_HOME导梆,并添加到PATH路徑轨淌。
- 運(yùn)行scala -version查看已安裝的scala版本。
2.2 安裝Spark
- 將spark的壓縮包解壓到自己的指定目錄看尼,如/opt/spark递鹉。
- 在/etc/profile中添加SPARK_HOME,并添加到PATH路徑藏斩。
- 在/etc/profile中添加HDFS_HOME躏结,并添加到PATH路徑,利用cm自動安裝的CDH機(jī)器狰域,hadoop路徑一般在/opt/cloudera/parcels/CDH/lib/hadoop媳拴。
- 在/etc/profile中添加HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop(指明hadoop的配置文件地址)。
- 將$HADOOP_HOME/etc/hadoop下的hdfs配置文件hdfs-site.xml拷貝一份到spark的conf目錄下兆览。由于spark要與HDFS協(xié)作屈溉,所以要告知hadoop的配置信息。
- 配置spark/conf下的slaves文件抬探,將各節(jié)點(diǎn)的主機(jī)名添加進(jìn)去子巾,以告訴spark該集群有哪些節(jié)點(diǎn)。如:spark-master小压、spark-slave1线梗、spark-slave2.
- 配置spark/conf下的spark-env.sh,在底部添加:
export JAVA_HOME=/usr/local/java/jdk1.8.0_65
export SCALA_HOME=/usr/local/scala/scala-2.11.7
export HADOOP_HOME=/opt/cloudera/parcels/CDH/lib/hadoop
HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
SPARK_MASTER_HOST=10.202.8.114
SPARK_DRIVER_MEMORY=1G
- 運(yùn)行sbin/start-all.sh啟動怠益,如果能進(jìn)入master:8088則搭建成功仪搔。
- spark-submit提交Pi程序到集群測試,提交腳本如下:
sudo -u hdfs /opt/spark/spark-2.0.0/bin/spark-submit
--class org.apache.spark.examples.SparkPi
--master yarn
--deploy-mode cluster
--executor-memory 512m
--num-executors 3
--driver-java-options "-XX:PermSize=512M -XX:MaxPermSize=1024m"
/opt/spark/spark-2.0.0/examples/jars/spark-examples_2.11-2.0.0.jar &
提交成功后蜻牢,可以在CDH管理界面僻造。進(jìn)入yarn的“應(yīng)用程序”查看運(yùn)行信息憋他。