Spark(二)CentOS7.5搭建Spark2.3.1分佈式集羣

一 下載安裝包

1 官方下載

官方下載地址:http://spark.apache.org/downloads.htmlhtml

2  安裝前提

注意:從Spark2.0版開始,默認使用Scala 2.11構建。Scala 2.10用戶應該下載Spark源包並使用Scala 2.10支持構建 。java

3  集羣規劃

節點名稱  IP Zookeeper Master Worker
node21 192.168.100.21
Zookeeper
主Master  
node22 192.168.100.22
Zookeeper
備Master Worker
node23 192.168.100.23
Zookeeper
  Worker

 二 集羣安裝

1  解壓縮

[admin@node21 software]$ tar zxvf spark-2.3.1-bin-hadoop2.7.tgz -C /opt/module/
[admin@node21 module]$ mv spark-2.3.1-bin-hadoop2.7 spark-2.3.1

2  修改配置文件

(1)進入配置文件所在目錄node

[admin@node21 ~]$ cd /opt/module/spark-2.3.1/conf/
[admin@node21 conf]$ ll
total 36
-rw-rw-r-- 1 admin admin  996 Jun  2 04:49 docker.properties.template
-rw-rw-r-- 1 admin admin 1105 Jun  2 04:49 fairscheduler.xml.template
-rw-rw-r-- 1 admin admin 2025 Jun  2 04:49 log4j.properties.template
-rw-rw-r-- 1 admin admin 7801 Jun  2 04:49 metrics.properties.template
-rw-rw-r-- 1 admin admin  870 Jul  4 23:50 slaves.template 
-rw-rw-r-- 1 admin admin 1292 Jun  2 04:49 spark-defaults.conf.template
-rwxrwxr-x 1 admin admin 4861 Jul  5 00:25 spark-env.sh.template

(2)複製spark-env.sh.template並重命名爲spark-env.shweb

[admin@node21 conf]$ cp spark-env.sh.template spark-env.sh
[admin@node21 conf]$ vi spark-env.sh

編輯並在文件末尾添加以下配置內容docker

#指定默認master的ip或主機名
export SPARK_MASTER_HOST=node21  
#指定maaster提交任務的默認端口爲7077    
export SPARK_MASTER_PORT=7077 
#指定masster節點的webui端口       
export SPARK_MASTER_WEBUI_PORT=8080 
#每一個worker從節點可以支配的內存數 
export SPARK_WORKER_MEMORY=1g        
#容許Spark應用程序在計算機上使用的核心總數(默認值:全部可用核心)
export SPARK_WORKER_CORES=1    
#每一個worker從節點的實例(可選配置) 
export SPARK_WORKER_INSTANCES=1   
#指向包含Hadoop集羣的(客戶端)配置文件的目錄,運行在Yarn上配置此項   
export HADOOP_CONF_DIR=/opt/module/hadoop-2.7.6/etc/hadoop
#指定整個集羣狀態是經過zookeeper來維護的,包括集羣恢復
export SPARK_DAEMON_JAVA_OPTS="      
-Dspark.deploy.recoveryMode=ZOOKEEPER 
-Dspark.deploy.zookeeper.url=node21:2181,node22:2181,node23:2181
-Dspark.deploy.zookeeper.dir=/spark"

(3)複製slaves.template成slaves,並修改配置內容shell

[admin@node21 conf]$ cp slaves.template slaves
[admin@node21 conf]$ vi slaves

修改從節點apache

node22
node23

(4)將安裝包分發給其餘節點服務器

[admin@node21 module]$ scp -r spark-2.3.1 admin@node22:/opt/module/
[admin@node21 module]$ scp -r spark-2.3.1 admin@node23:/opt/module/

修改node22節點上conf/spark-env.sh配置的MasterIP爲SPARK_MASTER_IP=node22app

3  配置環境變量

全部節點均要配置oop

[admin@node21 spark-2.3.1]$ sudo vi /etc/profile
export  SPARK_HOME=/opt/module/spark-2.3.1
export  PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
[admin@node21 spark-2.3.1]$ source /etc/profile

三 啓動集羣

1 啓動zookeeper集羣

全部zookeeper節點均要執行

[admin@node21 ~]$ zkServer.sh start

2 啓動Hadoop集羣

[admin@node21 ~]$ start-dfs.sh
[admin@node22 ~]$ start-yarn.sh
[admin@node23 ~]$ yarn-daemon.sh start resourcemanager

3 啓動Spark集羣

啓動spark:啓動master節點:sbin/start-master.sh 啓動worker節點:sbin/start-slaves.sh

或者:sbin/start-all.sh

[admin@node21 spark-2.3.1]$ sbin/start-all.sh
starting org.apache.spark.deploy.master.Master, logging to /opt/module/spark-2.3.1/logs/spark-admin-org.apache.spark.deploy.master.Master-1-node21.out
node22: starting org.apache.spark.deploy.worker.Worker, logging to /opt/module/spark-2.3.1/logs/spark-admin-org.apache.spark.deploy.worker.Worker-1-node22.out
node23: starting org.apache.spark.deploy.worker.Worker, logging to /opt/module/spark-2.3.1/logs/spark-admin-org.apache.spark.deploy.worker.Worker-1-node23.out

注意:備用master節點須要手動啓動

[admin@node22 spark-2.3.1]$ sbin/start-master.sh 
starting org.apache.spark.deploy.master.Master, logging to /opt/module/spark-2.3.1/logs/spark-admin-org.apache.spark.deploy.master.Master-1-node22.out

4 查看進程

[admin@node21 spark-2.3.1]$ jps
1316 QuorumPeerMain
3205 Jps
3110 Master
1577 DataNode
1977 DFSZKFailoverController
1788 JournalNode
2124 NodeManager

[admin@node22 spark-2.3.1]$ jps
1089 QuorumPeerMain
1233 DataNode
1617 ResourceManager
1159 NameNode
1319 JournalNode
1735 NodeManager
3991 Master
4090 Jps
1435 DFSZKFailoverController
3918 Worker

[admin@node23 spark-2.3.1]$ jps
1584 ResourceManager
1089 QuorumPeerMain
1241 JournalNode
2411 Worker
1164 DataNode
1388 NodeManager
2478 Jps

四 驗證集羣HA

1 看Web頁面Master狀態

node21是ALIVE狀態,node22爲STANDBY狀態,WebUI查看:http://node21:8080/

從節點鏈接地址:http://node22:8081/

2 驗證HA的高可用

手動幹掉node21上面的Master進程,node21:8080沒法訪問,node22:8080狀態以下,Master狀態成功自動進行切換。

 

3 HA注意點 

  • 主備切換過程當中不能提交Application。
  • 主備切換過程當中不影響已經在集羣中運行的Application。由於Spark是粗粒度資源調度。

集羣提交命令方式

Standalone模式

1.1 Standalone-client

(1)提交命令

[admin@node21 spark-2.3.1]$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \
 --master spark://node21:7077 \
 --executor-memory 500m \
 --total-executor-cores 1 \
 examples/jars/spark-examples_2.11-2.3.1.jar 10

或者

[admin@node21 spark-2.3.1]$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \
 --master spark://node21:7077 \
 --deploy-mode client \
 --executor-memory 500m \
 --total-executor-cores 1 \
 examples/jars/spark-examples_2.11-2.3.1.jar 10

(2)提交原理圖解

 (3)執行流程

  1. client模式提交任務後,會在客戶端啓動Driver進程。
  2. Driver會向Master申請啓動Application啓動的資源。
  3. 資源申請成功,Driver端將task發送到worker端執行。
  4. worker將task執行結果返回到Driver端。

(4)總結

client模式適用於測試調試程序。Driver進程是在客戶端啓動的,這裏的客戶端就是指提交應用程序的當前節點。在Driver端能夠看到task執行的狀況。生產環境下不能使用client模式,是由於:假設要提交100個application到集羣運行,Driver每次都會在client端啓動,那麼就會致使客戶端100次網卡流量暴增的問題。

1.2 Standalone-cluster

(1)提交命令

[admin@node21 spark-2.3.1]$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \
 --master spark://node21:7077 \
 --deploy-mode cluster \
 examples/jars/spark-examples_2.11-2.3.1.jar 10

(2)提交原理圖解

(3)執行流程

  1. cluster模式提交應用程序後,會向Master請求啓動Driver.
  2. Master接受請求,隨機在集羣一臺節點啓動Driver進程。
  3. Driver啓動後爲當前的應用程序申請資源。
  4. Driver端發送task到worker節點上執行。
  5. worker將執行狀況和執行結果返回給Driver端。

(4)總結

Driver進程是在集羣某一臺Worker上啓動的,在客戶端是沒法查看task的執行狀況的。假設要提交100個application到集羣運行,每次Driver會隨機在集羣中某一臺Worker上啓動,那麼這100次網卡流量暴增的問題就散佈在集羣上。

2 Yarn模式

2.1 yarn-client

(1)提交命令

client模式啓動Spark應用程序:

$ ./bin/spark-submit --class path.to.your.Class --master yarn --deploy-mode client [options] <app jar> [app options]

例如

[admin@node21 spark-2.3.1]$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \
 --master yarn  \
 --deploy-mode client  \
 examples/jars/spark-examples_2.11-2.3.1.jar 10

(2)提交原理圖解

(3)執行流程

  1. 客戶端提交一個Application,在客戶端啓動一個Driver進程。
  2. 應用程序啓動後會向RS(ResourceManager)發送請求,啓動AM(ApplicationMaster)的資源。
  3. RS收到請求,隨機選擇一臺NM(NodeManager)啓動AM。這裏的NM至關於Standalone中的Worker節點。
  4. AM啓動後,會向RS請求一批container資源,用於啓動Executor.
  5. RS會找到一批NM返回給AM,用於啓動Executor。
  6. AM會向NM發送命令啓動Executor。
  7. Executor啓動後,會反向註冊給Driver,Driver發送task到Executor,執行狀況和結果返回給Driver端。

(4)總結

Yarn-client模式一樣是適用於測試,由於Driver運行在本地,Driver會與yarn集羣中的Executor進行大量的通訊,會形成客戶機網卡流量的大量增長.

 ApplicationMaster的做用:

  1. 爲當前的Application申請資源
  2. NodeManager發送消息啓動Executor。

注意:ApplicationMaster有launchExecutor和申請資源的功能,並無做業調度的功能。

2.2 yarn-cluster

(1)提交命令

cluster模式啓動Spark應用程序:

$ ./bin/spark-submit --class path.to.your.Class --master yarn --deploy-mode cluster [options] <app jar> [app options]

例如

[admin@node21 spark-2.3.1]$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \
 --master yarn  \
 --deploy-mode cluster  \
 examples/jars/spark-examples_2.11-2.3.1.jar 10

(2)提交原理圖解

 

(3)執行流程

  1. 客戶機提交Application應用程序,發送請求到RS(ResourceManager),請求啓動AM(ApplicationMaster)。
  2. RS收到請求後隨機在一臺NM(NodeManager)上啓動AM(至關於Driver端)。
  3. AM啓動,AM發送請求到RS,請求一批container用於啓動Executor。
  4. RS返回一批NM節點給AM。
  5. AM鏈接到NM,發送請求到NM啓動Executor。
  6. Executor反向註冊到AM所在的節點的Driver。Driver發送task到Executor。

(4)總結

Yarn-Cluster主要用於生產環境中,由於Driver運行在Yarn集羣中某一臺nodeManager中,每次提交任務的Driver所在的機器都是隨機的,不會產生某一臺機器網卡流量激增的現象,缺點是任務提交後不能看到日誌。只能經過yarn查看日誌。

ApplicationMaster的做用:

  1. 爲當前的Application申請資源
  2. NodeManager發送消息啓動Excutor。
  3. 任務調度。

中止集羣任務命令:yarn application -kill applicationID

六 配置歷史服務器

1 臨時配置

對本次提交的應用程序起做用

./spark-shell --master spark://node21:7077 
--name myapp1
--conf spark.eventLog.enabled=true
--conf spark.eventLog.dir=hdfs://node21:8020/spark/test

中止程序,在Web Ui中Completed Applications對應的ApplicationID中能查看history。

2  永久配置

spark-default.conf配置文件中配置HistoryServer,對全部提交的Application都起做用

在客戶端節點,進入../spark-2.3.1/conf/ spark-defaults.conf最後加入:

//開啓記錄事件日誌的功能
spark.eventLog.enabled          true
//設置事件日誌存儲的目錄
spark.eventLog.dir              hdfs://node21:8020/spark/test
//設置HistoryServer加載事件日誌的位置
spark.history.fs.logDirectory   hdfs://node21:8020/spark/test
//日誌優化選項,壓縮日誌
spark.eventLog.compress         true

啓動HistoryServer:

./start-history-server.sh

訪問HistoryServer:node21:18080,以後全部提交的應用程序運行情況都會被記錄。

七 故障問題

1 Worker節點沒法啓動

[admin@node21 spark-2.3.1]$ sbin/start-all.sh 
starting org.apache.spark.deploy.master.Master, logging to /opt/module/spark-2.3.1/logs/spark-admin-org.apache.spark.deploy.master.Master-1-node21.out
node23: starting org.apache.spark.deploy.worker.Worker, logging to /opt/module/spark-2.3.1/logs/spark-admin-org.apache.spark.deploy.worker.Worker-1-node23.out
node22: starting org.apache.spark.deploy.worker.Worker, logging to /opt/module/spark-2.3.1/logs/spark-admin-org.apache.spark.deploy.worker.Worker-1-node22.out
node23: failed to launch: nice -n 0 /opt/module/spark-2.3.1/bin/spark-class org.apache.spark.deploy.worker.Worker --webui-port 8081 --port 7078 spark://node21:7077
node23: full log in /opt/module/spark-2.3.1/logs/spark-admin-org.apache.spark.deploy.worker.Worker-1-node23.out
node22: failed to launch: nice -n 0 /opt/module/spark-2.3.1/bin/spark-class org.apache.spark.deploy.worker.Worker --webui-port 8081 --port 7078 spark://node21:7077
node22: full log in /opt/module/spark-2.3.1/logs/spark-admin-org.apache.spark.deploy.worker.Worker-1-node22.out

因爲以前在conf/spark-env.sh裏配置了以下信息

#每一個worker從節點的端口(可選配置)       
export SPARK_WORKER_PORT=7078       
#每一個worker從節點的wwebui端口(可選配置)  
export SPARK_WORKER_WEBUI_PORT=8081 

多是因爲端口問題去掉上述兩項配置,重啓成功。

2 啓動Spark on YARN報錯

2.1  Caused by: java.net.ConnectException: Connection refused

[admin@node21 spark-2.3.1]$ spark-shell --master yarn --deploy-mode client

報錯緣由:內存資源給的太小,yarn直接kill掉進程,則報rpc鏈接失敗、ClosedChannelException等錯誤。

解決方法:先中止YARN服務,而後修改yarn-site.xml,增長以下內容

<!--是否將對容器強制實施虛擬內存限制 -->
<property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
</property>
<!--設置容器的內存限制時虛擬內存與物理內存之間的比率 -->
<property>
     <name>yarn.nodemanager.vmem-pmem-ratio</name>
     <value>4</value>
</property>   

將新的yarn-site.xml文件分發到其餘Hadoop節點對應的目錄下,最後在從新啓動YARN。 

從新執行如下命令啓動spark on yarn,啓動成功

2.2  java.lang.ClassNotFoundException: org.apache.spark.examples.SparkPi

[admin@node21 spark-2.3.1]$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \
>  --master yarn  \
>  --deploy-mode client  \
>  examples/jars/spark-examples_2.11-2.3.1.jar 10

報錯信息以下:

2018-07-13 05:19:14 WARN  NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
java.lang.ClassNotFoundException: org.apache.spark.examples.SparkPi
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.apache.spark.util.Utils$.classForName(Utils.scala:238)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:851)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:198)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:228)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:137)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
2018-07-13 05:19:15 INFO  ShutdownHookManager:54 - Shutdown hook called
2018-07-13 05:19:15 INFO  ShutdownHookManager:54 - Deleting directory /tmp/spark-d0c9c44a-40bc-4220-958c-c2f976361d64

解決方法:

相關文章
相關標籤/搜索