Spark的部署讓人有點兒困惑,有些須要注意的事項,原本我已經裝成功了YARN模式的,可是發現了一些問題,出現錯誤看日誌信息,徹底看不懂那個錯誤信息,因此纔打算翻譯Standalone的部署的文章。第一部分,我先說一下YARN模式的部署方法。第二部分纔是Standalone的方式。html
咱們首先看一下Spark的結構圖,和hadoop的差很少。linux
採用yarn模式的話,其實就是把spark做爲一個客戶端提交做業給YARN,實際運行程序的是YARN,就不須要部署多個節點,部署一個節點就能夠了。git
把從官網下載的壓縮包在linux下解壓以後,進入它的根目錄,沒有安裝git的,先執行yum install git安裝gitshell
1)運行這個命令: SPARK_HADOOP_VERSION=2.2.0 SPARK_YARN=true ./sbt/sbt assembly
apache
就等着吧,它會下載不少jar包啥的,這個過程可能會卡死,卡死的就退出以後,從新執行上面的命令。工具
2)編輯conf目錄下的spark-env.sh(原來的是.template結尾的,刪掉.template),添加上HADOOP_CONF_DIR參數oop
HADOOP_CONF_DIR=/etc/hadoop/conf
3)運行一下demo看看,能出結果 Pi is roughly 3.13794
url
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
下面咱們就講一下怎麼部署Standalone,參考頁面是http://spark.incubator.apache.org/docs/latest/spark-standalone.html。spa
這裏咱們要一個乾淨的環境,剛解壓出來的,運行以前的命令的時候不能再用了,會報錯的。scala
1)打開make-distribution.sh,修改SPARK_HADOOP_VERSION=2.2.0,而後執行./make-distribution.sh, 而後會生成一個dist目錄,這個目錄就是咱們要部署的內容。官方推薦是先把master跑起來,再部署別的節點,你們看看bin目錄下面的腳本,和hadoop的差很少的,按照官方文檔的推薦的安裝方式有點兒麻煩。下面咱們先說簡單的方法,再說官方的方式。
咱們打開dist目錄下conf目錄的,若是沒有slaves文件,添加一個,按照hadoop的那種配置方式,把slave的主機名寫進去,而後把dist目錄部署到各臺機器上,回到master上面,進入第三題、目錄的sbin目錄下,有個start-all.sh,執行它就能夠了。
下面是官方文檔推薦的方式,先啓動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
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了。