spark集群搭建

Spark 运行模式

Spark 支持四种运行模式:

Local 使用本地线程模拟,多用于测试
Standalone spark默认支持的
YARN 最具前景
Mesos

Spark 集群提交模式

Spark 支持两种提交模式:

client 该提交模式 driver 进程在客户端启动
cluster 该提交模式 driver 进程在任意 worker 节点上启动

Spark 集群提交命令

参数作用
- -master指定 Job 提交的 Master 节点
- -class指定运行 main 方法所在的类
- - deploy-mode指定提交模式
- -executor-cores指定每个 Executor 使用的 CPU 核数
- -executor-memory指定每个 Executor 使用的内存
- -total-executor-cores指定所有 Executor 一共使用的 CPU 核数
- -driver-cores指定 driver 使用的 CPU 核数
- -driver-memory指定 driver 使用的内存
- -driver-class-path指定 driver 所依赖的 jar 包的位置

Spark standalone 集群

  1. 到官网下载 spark 的安装包,这里使用 spark-1.6.3,hadoop版本是 2.6.5
    在这里插入图片描述

  2. 解压,改名为 spark-1.6.3

  3. 进入 conf 目录下,使用如下命令

 cp slaves.template slaves
 cp spark-env.sh.template spark-env.sh
  1. 修改 slaves文件,在其中添加从节点
node02
node03
node04
  1. 修改 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冲突
  1. 进入 sbin 目录,做如下修改,因为这两个命令与 hadoop 命令冲突
mv start-all.sh start-spark.sh 
mv stop-all.sh  stop-spark.sh  
  1. 将配置好的spark安装包发送到其他节点和客户端节点
[root@node01 zgl]# scp -r spark-1.6.3 node02:`pwd`
[root@node01 zgl]# scp -r spark-1.6.3 node03:`pwd`
[root@node01 zgl]# scp -r spark-1.6.3 node04:`pwd`
[root@node01 zgl]# scp -r spark-1.6.3 client:`pwd`
  1. 在 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. 在 node01 上启动集群
start-spark.sh
  1. jps 检查集群是否启动
[root@node01 ~]# jps
1123 Master

[root@node02 ~]# jps
1124 Worker

[root@node03 ~]# jps
1125 Worker

[root@node04 ~]# jps
1129 Worker
  1. 在客户端提交 spark 提供的示例程序 SparkPi (该程序通过概率计算 π 的值)
    –注意提交命令一行写完,不要换行
    –任务很可能会因为内存不足导致失败
spark-submit  master的url  执行器所使用的内存  
运行的程序的全类名  
程序jar包所在的位置  
提供一个参数(参数越大,计算的π值越精准)

spark-submit --master spark://node01:7077 --executor-memory 500m
 --class org.apache.spark.examples.SparkPi 
 /opt/zgl/spark-1.6.3/lib/spark-examples-1.6.3-hadoop2.6.0.jar 
 50
  1. 可以在 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 节点挂掉但是迅速恢复可能会导致此问题)

集群配置

在上面 standalone 集群配置的基础上,先关闭之前开启的集群

 stop-spark.sh

在 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"

看官网对配置信息的解释
在这里插入图片描述

将 spark-env.sh发送到其他节点,进入 spark 安装包的 conf 目录下执行

[root@node01 conf]# scp spark-env.sh node02:`pwd`
[root@node01 conf]# scp spark-env.sh node03:`pwd`
[root@node01 conf]# scp spark-env.sh node04:`pwd`
[root@node01 conf]# scp spark-env.sh client:`pwd`

这里我们选用 node02 节点作为备用的 master 节点,在 node02 节点的 spark 安装包中的 spark-env.sh文件中修改 SPARK_MASTER_IP,令 SPARK_MASTER_IP=node02

开启 zookeeper,在 node02, node03, node04 节点上手动启动

 zkServer.sh start

在 node01 节点上启动集群

 start-spark.sh

在 node02 节点上手动启动 master(standby)

 start-master.sh

可以在 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 应用程序)

1> 在客户端 spark 安装包中配置 spark-env.sh文件,添加如下配置信息(hadoop安装包配置文件的位置)

HADOOP_CONF_DIR=/opt/zgl/hadoop-2.6.5/etc/hadoop

–spark会去这个位置寻找 hadoop 的配置文件,获取 yarn 集群的信息

2> 开启 HDFS集群和 YARN集群,客户端提交的应用程序 jar 包会托管在 hdfs 上

HDFS集群搭建可以参看这里 Hadoop HDFS HA高可用的完全分布式
YARN集群搭建可以参看这里 Hadoop YARN

3> 在客户端提交 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

4> 在 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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值