(一) Spark安装包下载
(1)官网下载
http://spark.apache.org/downloads.html
Spark standalone
(一) 安装过程
1、上传并解压缩
tar -zxvf spark-2.3.0-bin-hadoop2.7.tgz -C apps/
2、进入spark/conf修改配置文件
cp slaves.template slaves
cp spark-env.sh.template spark-env.sh
3、修改 slaves文件,在其中添加从节点
node02
node03
node04
4、修改 spark-env.sh文件
# export JAVA_HOME=/opt/software/jdk1.8.0_151 # centOS 7 需要引入JAVA_HOME
SPARK_MASTER_IP=node01 master所在节点
SPARK_MASTER_PORT=7077 master资源通信端口
SPARK_WORKER_CORES=2 worker管理的核数
SPARK_WORKER_MEMORY=800m worker管理的内存
SPARK_WORKER_INSTANCES=1 每个节点启动worker的个数
SPARK_WORKER_DIR=/var/zgl/spark worker的工作目录
# SPARK_MASTER_WEBUI_PORT=8888 WebUI的端口号,默认为8080,与tomcat冲突
5、进入 sbin 目录,做如下修改,防止这两个命令与 hadoop 命令冲突
mv start-all.sh start-spark.sh
mv stop-all.sh stop-spark.sh
6、将配置好的spark安装包发送到其他节点和客户端节点
# scp -r spark-2.3.0 node02:`pwd`
# scp -r spark-2.3.0 node03:`pwd`
# scp -r spark-2.3.0 node04:`pwd`
# scp -r spark-2.3.0 client:`pwd`
7、在 node01 和 client 节点上配置 spark 的环境变量,配置到 ~/.bashrc 中
vim ~/.bashrc
export SPARK_HOME=/opt/zgl/spark-1.6.3
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
(二)启动
1、先启动zookeeper集群
所有zookeeper节点启动
zkServer.sh start
2、在node01启动HDFS集群
start-dfs.sh
3、在 node01 上启动集群
start-spark.sh
4、jps 检查集群是否启动
(三)验证
1、在客户端提交 spark 提供的 SparkPi 程序(该程序通过概率计算 π 的值)
- 注意提交命令一行写完,不要换行
任务很可能会因为内存不足导致失败
spark-submit master的url 执行器所使用的内存 运行的程序的全类名 程序jar包所在的位置 提供一个参数(参数越大,计算的π值越精准)
spark-submit --master spark://node01:7077 --executor-memory 500m
--class org.apache.spark.examples.SparkPi
/opt/software/spark-2.3.0/lib/spark-examples-2.3.0-hadoop2.6.0.jar
50
2、可以在 node01:8080 WEBUI页面查看任务
Spark standalone HA
同 HDFS 的 NameNode,YARN 的 ResourceManager 一样,spark standalone 的 master 也存在单点故障问题,于是同样也就有了基于 zookeeper 监控的高可用模式(spark standalone 还有一种高可用模式是基于本地文件系统,主master挂掉后需要手动切换)
主备切换
- spark standalone HA 模式中,master(active) 会将元数据同步到 zookeeper 中,元数据中有 worker,driver 和 application 的信息
- 当 master(active) 挂掉时,zookeeper 会选举出一个 master(standby),被选中的 master(standby) 进入恢复状态 master(recovering)
- master(recovering) 从 zookeeper 读取元数据,得到元数据后,master(recovering) 会向 worker 节点发送消息,告知主master已经更换
- 正在正常运行的 worker 在收到通知后,会向 master(recovering) 节点发送响应信息
- master(recovering) 节点收到响应信息后,会调用自身的completeRecovery()方法,此时未向 master(recovering) 节点发送响应信息的 worker 节点会被认为已经挂掉,从 workers 中删除(workers
是存储 worker 信息的对象)- 短暂的 completeRecovery 状态一闪而过,master(completeRecovery) 成为 active 状态,开始对外提供服务
–主备切换的过程大概需要1~2分钟,此期间集群不接受提交任务的请求,但是已经跑在集群上的任务不会受到影响,会正常执行,这得益于 spark 粗粒度的资源调度
–workers 使用 HashSet 数据结构来存储 worker 信息,是为了防止同一台 worker 节点在 master 中注册两次(worker 节点挂掉但是迅速恢复可能会导致此问题)
集群配置
1、 在上面 standalone 集群配置的基础上,先关闭之前开启的集群
stop-spark.sh
2、在 node01 节点上对 spark 安装包中的 spark-env.sh文件添加如下配置,注意写在一行,不要手动换行,三个参数间使用空格隔开
SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=node02:2181,node03:2181,node04:2181
-Dspark.deploy.zookeeper.dir=/spark"
官网对三个参数的解释
3、将 spark-env.sh发送到其他节点,进入 spark 安装包的 conf 目录下执行
scp spark-env.sh node02:`pwd`
scp spark-env.sh node03:`pwd`
scp spark-env.sh node04:`pwd`
scp spark-env.sh client:`pwd`
4、选用 node02 节点作为备用的 master 节点,在 node02 节点的 spark 安装包中的 spark-env.sh文件中修改 SPARK_MASTER_IP,令 SPARK_MASTER_IP=node02
5、启动zookeeper,spark集群
zkServer.sh start
start-spark.sh
6、node02启动master(standby状态)
start-master.sh
7、node02:8888 WEBUI页面查看节点状态信息
将 nodeo1 上的 master 进程 kill 掉,然后观察 master(standby) 的状态变化
在客户端提交 spark 提供的 SparkPi 程序
spark-submit --master spark://node01:7077,node02:7077
--class org.apache.spark.examples.SparkPi
/opt/software/spark-1.6.3/lib/spark-examples-1.6.3-hadoop2.6.0.jar
100
在 WEBUI 页面查看任务
Spark on YARN
spark 应用程序跑在 yarn 集群上很简单,只需要在客户端有 spark 安装包就可以了(用来提交 spark 应用程序)
- 在客户端 spark 安装包中配置 spark-env.sh文件,添加如下配置信息
HADOOP_CONF_DIR=/opt/zgl/hadoop-2.6.5/etc/hadoop
- 开启 HDFS集群和 YARN集群,客户端提交的应用程序 jar 包会托管在 hdfs 上
- 在客户端提交 spark 提供的 SparkPi 程序
spark-submit --master yarn
--class org.apache.spark.examples.SparkPi
/opt/zgl/spark-1.6.3/lib/spark-examples-1.6.3-hadoop2.6.0.jar
10000
- 在 yarn 的 WebUI 页面查看任务
提交任务可能会报下面这个异常,主要是因为虚拟内存超限, contrainer 被 kill,从而导致任务结束
Yarn application has already ended! It might have been killed or unable to launch application master
可以通过在 hadoop 安装包的 yarn-site.xml 文件中配置如下信息来解决
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
<description>是否检查每个任务正使用的物理内存量,如果超过默认值则将其杀死,默认是true </description>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
<description>Whether virtual memory limits will be enforced for containers</description>
</property>