官方下載地址:http://spark.apache.org/downloads.htmlhtml
注意:從Spark2.0版開始,默認使用Scala 2.11構建。Scala 2.10用戶應該下載Spark源包並使用Scala 2.10支持構建 。java
節點名稱 | 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 |
[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
(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
全部節點均要配置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
全部zookeeper節點均要執行
[admin@node21 ~]$ zkServer.sh start
[admin@node21 ~]$ start-dfs.sh [admin@node22 ~]$ start-yarn.sh
[admin@node23 ~]$ yarn-daemon.sh start resourcemanager
啓動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
[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
node21是ALIVE狀態,node22爲STANDBY狀態,WebUI查看:http://node21:8080/
從節點鏈接地址:http://node22:8081/
手動幹掉node21上面的Master進程,node21:8080沒法訪問,node22:8080狀態以下,Master狀態成功自動進行切換。
(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)執行流程
(4)總結
client模式適用於測試調試程序。Driver進程是在客戶端啓動的,這裏的客戶端就是指提交應用程序的當前節點。在Driver端能夠看到task執行的狀況。生產環境下不能使用client模式,是由於:假設要提交100個application到集羣運行,Driver每次都會在client端啓動,那麼就會致使客戶端100次網卡流量暴增的問題。
(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)執行流程
(4)總結
Driver進程是在集羣某一臺Worker上啓動的,在客戶端是沒法查看task的執行狀況的。假設要提交100個application到集羣運行,每次Driver會隨機在集羣中某一臺Worker上啓動,那麼這100次網卡流量暴增的問題就散佈在集羣上。
(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)執行流程
(4)總結
Yarn-client模式一樣是適用於測試,由於Driver運行在本地,Driver會與yarn集羣中的Executor進行大量的通訊,會形成客戶機網卡流量的大量增長.
ApplicationMaster的做用:
注意:ApplicationMaster有launchExecutor和申請資源的功能,並無做業調度的功能。
(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)執行流程
(4)總結
Yarn-Cluster主要用於生產環境中,由於Driver運行在Yarn集羣中某一臺nodeManager中,每次提交任務的Driver所在的機器都是隨機的,不會產生某一臺機器網卡流量激增的現象,缺點是任務提交後不能看到日誌。只能經過yarn查看日誌。
ApplicationMaster的做用:
中止集羣任務命令:yarn application -kill applicationID
對本次提交的應用程序起做用
./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。
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,以後全部提交的應用程序運行情況都會被記錄。
[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.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
解決方法: