Spark的Standalone模式部署
1:Spark Standalone Mode安裝
A:部署包生成
首先,下載并解壓縮Spark的源碼,切換到解壓縮所生成的目錄,運行部署包生成程序make-distribution.sh:
- ./make-distribution.sh --hadoop 2.2.0 --with-yarn --tgz
spark源碼根目錄下的make-distribution.sh可以帶以下參數(shù):
--tgz:在根目錄下生成 spark-$VERSION-bin.tar.gz,不加參數(shù)是不生成tgz文件,只生成/dist目錄。
--hadoop VERSION:打包時所用的Hadoop版本號,不加參數(shù)時為1.0.4。
--with-yarn:是否支持Hadoop YARN,不加參數(shù)時為不支持yarn。
--with-tachyon:是否支持內(nèi)存文件系統(tǒng)Tachyon,不加參數(shù)時為不支持,此參數(shù)spark1.0之后提供。
運行成功后,在根目錄下生成類似spark-0.9.0-incubating-hadoop_2.2.0-bin.tar.gz的部署包,不過該部署包只帶有最基本的Spark運行文件,不包含例程和源代碼。如果需要例程和源代碼,請使用官方提供的二進制部署包。
筆者在百度云盤上提供了spark0.90、spark0.91和spark1.0-SNAPHOT的部署包,其中spark1.0-SNAPHOT還提供了支持Tachyon的部署包。
B:規(guī)劃
虛擬機hadoop1(IP地址為192.168.100.171)作為Master
虛擬機hadoop2(IP地址為192.168.100.172)、hadoop3(IP地址為192.168.100.173)、hadoop4(IP地址為192.168.100.174)、hadoop5(IP地址為192.168.100.175)作為slave
由于hadoop1、hadoop2、hadoop3、hadoop4、hadoop5之前已經(jīng)安裝了hadoop2.2.0集群,所以省卻了安裝JAVA、建立SSH無密碼登錄過程。當然,spark集群可以獨立于hadoop集群外安裝,不過需要安裝JAVA、建立SSH無密碼登錄,具體過程可以參照hadoop2.2.0測試環(huán)境搭建。
C:在Master上生成安裝目錄
將生成的spark-0.9.0-incubating-hadoop_2.2.0-bin.tar.gz文件復制到Master(即hadoop1)上并解壓
[root@hadoop1 hadoop]# tar zxf spark-0.9.0-incubating-hadoop_2.2.0-bin.tar.gz
[root@hadoop1 hadoop]# mv spark-0.9.0-incubating spark090
[root@hadoop1 hadoop]# cd spark090
[root@hadoop1 spark090]# ls -lsa
D:配置集群文件
[root@hadoop1 spark090]# vi conf/slaves
[root@hadoop1 spark090]# cat conf/slaves
hadoop2
hadoop3
hadoop4
hadoop5
[root@hadoop1 spark090]# vi conf/spark-env.sh
[root@hadoop1 spark090]# cat conf/spark-env.sh
export SPARK_MASTER_IP=hadoop1
export SPARK_WORKER_CORES=1
export SPARK_WORKER_INSTANCES=1
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_MEMORY=1g
export MASTER=spark://${SPARK_MASTER_IP}:${SPARK_MASTER_PORT}
E:派發(fā)安裝文件到slaves
[root@hadoop1 spark090]# cd ..
[root@hadoop1 hadoop]# chown -R hadoop:hadoop spark090
[root@hadoop1 hadoop]# su - hadoop
[hadoop@hadoop1 ~]$ cd /app/hadoop/
[hadoop@hadoop1 hadoop]$ scp -r spark090 hadoop2:/app/hadoop/
[hadoop@hadoop1 hadoop]$ scp -r spark090 hadoop3:/app/hadoop/
[hadoop@hadoop1 hadoop]$ scp -r spark090 hadoop4:/app/hadoop/
[hadoop@hadoop1 hadoop]$ scp -r spark090 hadoop5:/app/hadoop/
F:啟動集群
[hadoop@hadoop1 hadoop]$ cd spark090
[hadoop@hadoop1 spark090]$ sbin/start-all.sh
通過瀏覽器訪問http://hadoop1:8080可以監(jiān)控spark Standalone集群
2:關(guān)于spark-shell連接到spark Standalone集群
如果要啟動spark-shell連接到spark Standalone集群,有兩種方法:
a:使用MASTER=spark://hadoop1:7077 bin/spark-shell啟動
b:配置在conf/spark-env.sh增加以下幾行:
export SPARK_MASTER_IP=192.168.1.171
export SPARK_MASTER_PORT=7077
export MASTER=spark://${SPARK_MASTER_IP}:${SPARK_MASTER_PORT}
然后使用使用./spark-shell啟動
如果是遠程客戶端來連接到spark Standalone集群的話,部署目錄要和集群的部署目錄一致。
3:關(guān)于Spark Standalone Mode的運行
A:資源調(diào)度
Spark Standalone Cluster目前只支持FIFO方式調(diào)度,不過,允許多個并發(fā)用戶,通過控制每個應(yīng)用程序可獲得的***資源數(shù)。默認情況下,一次只運行一個應(yīng)用程序,應(yīng)用程序使用集群中的所有內(nèi)核,不過可以通過System.setProperty(“spark.cores.max”,“10”)設(shè)置使用的內(nèi)核數(shù),這個值必須在初始化SparkContext之前設(shè)置。
B:監(jiān)控和日志
Spark Standalone Cluster可以通過Web UI來監(jiān)控集群,Master和每個Worker都有各自的Web UI顯示統(tǒng)計數(shù)據(jù)。
Spark運行的job明細在$SPARK_HOME/work(由參數(shù)SPARK_WORKER_DIR設(shè)定)。當一個job提交后,spark會分發(fā)給worker,在每個節(jié)點的$SPARK_HOME/work/jodID/executorID建立stdout和stderr目錄作為job日志輸出。
C:和Hadoop并用
Spark可以作為獨立的服務(wù),在已有的Hadoop集群設(shè)備上并行,并通過hdfs://URL存取Hadoop數(shù)據(jù)。當然,Spark也可以建成一個獨立的集群,通過網(wǎng)絡(luò)存取Hadoop數(shù)據(jù),只不過會比本地硬盤存取速度要慢,對于處于本地網(wǎng)絡(luò)的兩個集群,這不是問題。
D:高可用
Spark存在單點故障的問題,要解決這個問題,有兩個方案:通過 Zookeeper待機Master和本地文件系統(tǒng)的單點恢復,具體參考http://spark.incubator.apache.org/docs/latest/spark-standalone.html
4:測試
由于缺少例子,所以使用官方提供的二進制安裝包重新部署了一下,并啟動。
./run-example org.apache.spark.examples.SparkKMeans spark://hadoop1:7077 ./kmeans_data.txt 2 1
也可以直接在spark shell里調(diào)試程序。