參考自:Spark部署三種方式介紹:YARN模式、Standalone模式、HA模式
http://www.aboutyun.com/forum.php?mod=viewthread&tid=7115
(出處: about雲開發)
1.Yarn模式由誰來作為客戶端提交作業給YARN?
2.SPARK_HADOOP_VERSION=2.2.0 SPARK_YARN=true ./sbt/sbt assembly的作用是什么?
3.Standalone 模式dist目錄的作用是什么?
4.recoveryDirectory最好是能夠使用一個nfs的原因是什么?
Spark的部署讓人有點兒困惑,有些需要注意的事項,本來我已經裝成功了YARN模式的,但是發現了一些問題,出現錯誤看日志信息,完全看不懂那個錯誤信息,所以才打算翻譯Standalone的部署的文章。第一部分,我先說一下YARN模式的部署方法。第二部分才是Standalone的方式。
我們首先看一下Spark的結構圖,和hadoop的差不多。
1.YARN模式
采用Yarn模式的話,其實就是把spark作為一個客戶端提交作業給YARN,實際運行程序的是YARN,就不需要部署多個節點,部署一個節點就可以了。
把從官網下載的壓縮包在linux下解壓之后,進入它的根目錄,沒有安裝git的,先執行yum install git安裝git
1)運行這個命令: SPARK_HADOOP_VERSION=2.2.0 SPARK_YARN=true ./sbt/sbt assembly
就等着吧,它會下載很多jar包啥的,這個過程可能會卡死,卡死的就退出之后,重新執行上面的命令。
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了。