官方下载地址:http://spark.apache.org/downloads.html
注意:从Spark2.0版开始,默认使用Scala 2.11构建。Scala 2.10用户应该下载Spark源包并使用Scala 2.10支持构建 。
节点名称 | 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)进入配置文件所在目录
[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.sh
[admin@node21 conf]$ cp spark-env.sh.template spark-env.sh [admin@node21 conf]$ vi spark-env.sh
编辑并在文件末尾添加如下配置内容
#指定默认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,并修改配置内容
[admin@node21 conf]$ cp slaves.template slaves [admin@node21 conf]$ vi slaves
修改从节点
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=node22
所有节点均要配置
[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 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 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,增加如下内容
yarn.nodemanager.vmem-check-enabled false yarn.nodemanager.vmem-pmem-ratio 4
将新的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
解决方法: