參考自:Spark部署三種方式介紹:YARN模式、Standalone模式、HA模式
http://www.aboutyun.com/forum.php?mod=viewthread&tid=7115
(出處: about雲開發)php
1.Yarn模式由誰來做爲客戶端提交做業給YARN?html
2.SPARK_HADOOP_VERSION=2.2.0 SPARK_YARN=true ./sbt/sbt assembly的做用是什麼?linux
3.Standalone 模式dist目錄的做用是什麼?git
4.recoveryDirectory最好是可以使用一個nfs的緣由是什麼?shell
Spark的部署讓人有點兒困惑,有些須要注意的事項,原本我已經裝成功了YARN模式的,可是發現了一些問題,出現錯誤看日誌信息,徹底看不懂那個錯誤信息,因此纔打算翻譯Standalone的部署的文章。第一部分,我先說一下YARN模式的部署方法。第二部分纔是Standalone的方式。
咱們首先看一下Spark的結構圖,和hadoop的差很少。apache
1.YARN模式工具
採用Yarn模式的話,其實就是把spark做爲一個客戶端提交做業給YARN,實際運行程序的是YARN,就不須要部署多個節點,部署一個節點就能夠了。oop
把從官網下載的壓縮包在linux下解壓以後,進入它的根目錄,沒有安裝git的,先執行yum install git安裝giturl
1)運行這個命令: SPARK_HADOOP_VERSION=2.2.0 SPARK_YARN=true ./sbt/sbt assembly
就等着吧,它會下載不少jar包啥的,這個過程可能會卡死,卡死的就退出以後,從新執行上面的命令。spa
2)編輯conf目錄下的spark-env.sh(原來的是.template結尾的,cp一份命名爲spark-env.sh),添加上HADOOP_CONF_DIR參數
HADOOP_CONF_DIR=/etc/hadoop/conf
3)運行一下demo看看,能出結果 Pi is roughly 3.13794
SPARK_JAR=./assembly/target/scala-2.9.3/spark-assembly_2.9.3-0.8.1-incubating-hadoop2.2.0.jar \
./spark-class org.apache.spark.deploy.yarn.Client \
--jar examples/target/scala-2.9.3/spark-examples-assembly-0.8.1-incubating.jar \
--class org.apache.spark.examples.SparkPi \
--args yarn-standalone \
--num-workers 3 \
--master-memory 1g \
--worker-memory 1g \
--worker-cores 1
2.Standalone模式
下面咱們就講一下怎麼部署Standalone,參考頁面是http://spark.incubator.apache.or ... ark-standalone.html。
這裏咱們要一個乾淨的環境,剛解壓出來的,運行以前的命令的時候不能再用了,會報錯的。
1)打開make-distribution.sh,修改SPARK_HADOOP_VERSION=2.2.0,而後執行./make-distribution.sh, 而後會生成一個dist目錄,這個目錄就是咱們要部署的內容。官方推薦是先把master跑起來,再部署別的節點,你們看看bin目錄下面的腳本,和hadoop的差很少的。行,那就先啓動master,執行
./bin/start-master.sh
2)部署dist的目錄到各個節點,而後經過這個命令來鏈接master節點
./spark-class org.apache.spark.deploy.worker.Worker spark://IP:PORT
3)而後在主節點查看一下http://localhost:8080 ,查看一會兒節點是否在這裏,若是在,就說明鏈接成功了。
4) 部署成功以後,想要在上面部署程序的話,在執行./spark-shell的時候,要加上MASTER這個參數。
MASTER=spark://IP:PORT ./spark-shell
3.High Alailability(高可用)
Spark採用Standalone模式的話,Spark自己是一個master/slaves的模式,這樣就會存在單點問題,Spark採用的是zookeeper做爲它的active-standby切換的工具,設置也很簡單。一個完整的切換須要1-2分鐘的時間,這個時候新提交的做業會受到影響,以前提交到做業不會受到影響。
在spark-env.sh添加如下設置:
//設置下面三項JVM參數,具體的設置方式在下面
//spark.deploy.recoveryMode=ZOOKEEPER
//spark.deploy.zookeeper.url=192.168.1.100:2181,192.168.1.101:2181
// /spark是默認的,能夠不寫
//spark.deploy.zookeeper.dir=/spark
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=hadoop.Master:2181,hadoop.SlaveT1:2181,hadoop.SlaveT2:2181"
這裏就有一個問題了,集羣裏面有多個master,咱們鏈接的時候,鏈接誰?用過hbase的都知道是先鏈接的zookeeper,可是Spark採用的是另外的一種方式,若是咱們有多個master的話,實例化SparkContext的話,使用spark://host1:port1,host2:port2這樣的地址,這樣它會同時註冊兩個,一個失效了,還有另一個。
若是不肯意配置高可用的話,只是想失敗的時候,再恢復一下,從新啓動的話,那就使用FILESYSTEM的使用,指定一個目錄,把當前的各個節點的狀態寫入到文件系統。
spark.deploy.recoveryMode=FILESYSTEM
spark.deploy.recoveryDirectory=/usr/lib/spark/dataDir
當 stop-master.sh來殺掉master以後,狀態沒有及時更新,再次啓動的時候,會增長一分鐘的啓動時間來等待原來的鏈接超時。recoveryDirectory最好是可以使用一個nfs,這樣一個master失敗以後,就能夠啓動另一個master了。