Spark系列-3、Spark的部署方式之Standalone模式

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

大数据系列文章目录

官方网址:http://spark.apache.org/、https://databricks.com/spark/about
在这里插入图片描述

目录

  • 介绍
  • Spark Standalone集群
    • Standalone 架 构
    • 配置、部署及启动
      • 解压、环境变量
      • Workers主机名称
      • 配置Master、Workers、HistoryServer
      • 创建EventLogs存储目录
      • 配置Spark应用保存EventLogs
      • 设置日志级别
      • 分发到集群所有机器
      • 启动服务进程
      • 提交运行圆周率
    • Spark 应用架构
    • WEB UI 监 控
    • Standalone HA
      • 高可用HA
      • 基于Zookeeper实现HA
      • 测试运行
  • 结束

介绍

Spark的部署方式目前有,local本地模式、standalone模式、spark on yarn模式、spark on mesos模式。

  • 本地模式
    Spark单机运行,一般用于开发测试。
  • Standalone模式
    构建一个由Master+Slave构成的Spark集群,Spark运行在集群中。
  • Spark on Yarn模式
    Spark客户端直接连接Yarn。不需要额外构建Spark集群。
  • Spark on Mesos模式
    Spark客户端直接连接Mesos。不需要额外构建Spark集群。

Standalone适合小规模集群。
如果同时运行hadoop和Spark,从兼容性上考虑,Yarn是更好的选择。
如果你不仅运行了hadoop,spark,还运行了docker,Mesos是更好的选择。

本篇文章介绍Standalone模式

Spark Standalone集群

Standalone模式是Spark自带的一种集群模式,不同于前面本地模式启动多个进程来模拟集群的环境,Standalone模式是真实地在多个机器之间搭建Spark集群的环境,完全可以利用该模式搭建多机器集群,用于实际的大数据处理

Standalone 架 构

Standalone集群使用了分布式计算中的master-slave模型,master是集群中含有Master进程的节点,slave是集群中的Worker节点含有Executor进程。
Spark系列-3、Spark的部署方式之Standalone模式_第1张图片
Spark Standalone集群,类似Hadoop YARN,管理集群资源和调度资源:

  1. 主节点Master:类似ResourceManager

管理整个集群资源,接收提交应用,分配资源给每个应用,运行Task任务

  1. 从节点Workers:类似NodeManager

管理每个机器的资源,分配对应的资源来运行Task;
每个从节点分配资源信息给Worker管理,资源信息包含内存Memory和CPU Cores核数

  1. 历史服务器HistoryServer:类似MRJobHistoryServer

Spark Application运行完成以后,保存事件日志数据至HDFS,启动HistoryServer可以查看应用运行相关信息

Spark系列-3、Spark的部署方式之Standalone模式_第2张图片

配置、部署及启动

Standalone集群安装服务规划与资源配置:
Spark系列-3、Spark的部署方式之Standalone模式_第3张图片
官方文档:http://spark.apache.org/docs/2.4.5/spark-standalone.html
Workers主机名称 ~ 分发到集群所有机器 统一在node1上进行

解压、环境变量

解压Spark编译安装包至【/export/server/】目录下,进入【conf】目录,配置环境变量。

## 解压软件包
tar -zxf /export/software/spark-2.4.5-bin-cdh5.16.2-2.11.tgz -C /export/server/

## 创建软连接,方便后期升级
ln -s /export/server/spark-2.4.5-bin-cdh5.16.2-2.11 /export/server/spark

## 进入配置目录
cd /export/server/spark/conf

## 修改配置文件名称
mv spark-env.sh.template spark-env.sh vim spark-env.sh
## 添加内容如下:
JAVA_HOME=/export/server/jdk SCALA_HOME=/export/server/scala HADOOP_CONF_DIR=/export/server/hadoop/etc/hadoop

Workers主机名称

将【$SPARK_HOME/conf/slaves.template】名称命名为【slaves】,填写从节点名称。

## 进入配置目录
cd /export/server/spark/conf

## 修改配置文件名称
mv slaves.template slaves vim slaves
## 内容如下:
node1.cn 
node2.cn 
node3.cn

配置Master、Workers、HistoryServer

在配置文件【$SPARK_HOME/conf/spark-env.sh】添加如下内容:


SPARK_MASTER_HOST=node1.cn 
SPARK_MASTER_PORT=7077 
SPARK_MASTER_WEBUI_PORT=8080 
SPARK_WORKER_CORES=1 
SPARK_WORKER_MEMORY=1g 
SPARK_WORKER_PORT=7078 
SPARK_WORKER_WEBUI_PORT=8081
SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://node1.cn:8020/spark/eventLogs/
-Dspark.history.fs.cleaner.enabled=true"

创建EventLogs存储目录

启动HDFS服务,创建应用运行事件日志目录,命令如下:

hadoop-daemon.sh start namenode 
hadoop-daemons.sh start datanode 
hdfs dfs -mkdir -p /spark/eventLogs/

配置Spark应用保存EventLogs

将【$SPARK_HOME/conf/spark-defaults.conf.template】名称命名为【park-defaults.confs】, 填写如下内容:

## 进入配置目录
cd /export/server/spark/conf

## 修改配置文件名称
mv spark-defaults.conf.template spark-defaults.conf vim spark-defaults.conf
## 添加内容如下:
spark.eventLog.enabled true

spark.eventLog.dir hdfs://node1.cn:8020/spark/eventLogs/ spark.eventLog.compress true

设置日志级别

将【$SPARK_HOME/conf/log4j.properties.template】名称命名为【log4j.properties】,修改级别为警告WARN。

## 进入目录
cd /export/server/spark/conf

## 修改日志属性配置文件名称
mv log4j.properties.template log4j.properties

## 改变日志级别
vim log4j.properties

Spark系列-3、Spark的部署方式之Standalone模式_第4张图片

分发到集群所有机器

将配置好的将 Spark 安装包分发给集群中其它机器,命令如下:

cd /export/server/

scp -r spark-2.4.5-bin-cdh5.16.2-2.11 [email protected]:$PWD 
scp -r spark-2.4.5-bin-cdh5.16.2-2.11 root@ node3.cn:$PWD
## 远程连接到node2.itcast.cn和node3.itcast.cn机器,创建软连接
ln -s /export/server/spark-2.4.5-bin-cdh5.16.2-2.11 /export/server/spark

启动服务进程

在Master节点node1.cn上启动,进入$SPARK_HOME,必须配置主节点到所有从节点的SSH无密钥登录,集群各个机器时间同步

主节点Master启动命令

/export/server/spark/sbin/start-master.sh

WEB UI页面地址:http://node1.cn:8080
Spark系列-3、Spark的部署方式之Standalone模式_第5张图片
从节点Workers启动命令:

/export/server/spark/sbin/start-slaves.sh

查看Master主节点WEB UI界面:
Spark系列-3、Spark的部署方式之Standalone模式_第6张图片
可以看出,配置了3个Worker进程实例,每个Worker实例为1核1GB内存,总共是3核 3GB 内存。目前显示的Worker资源都是空闲的,当向Spark集群提交应用之后,Spark就会分配相应的资源给程序使用,可以在该页面看到资源的使用情况。

历史服务器HistoryServer:

/export/server/spark/sbin/start-history-server.sh

WEB UI页面地址:http://node1.cn:18080
Spark系列-3、Spark的部署方式之Standalone模式_第7张图片

提交运行圆周率

将上述运行在Local Mode的圆周率PI程序,运行在Standalone集群上,修改【–master】地址为Standalone集群地址:spark://node1.cn:7077,具体命令如下:


SPARK_HOME=/export/server/spark

${SPARK_HOME}/bin/spark-submit \

--master spark://node1.cn:7077 \

--class org.apache.spark.examples.SparkPi \

${SPARK_HOME}/examples/jars/spark-examples_2.11-2.4.5.jar \ 10

查看Master主节点WEB UI界面:
Spark系列-3、Spark的部署方式之Standalone模式_第8张图片

Spark 应用架构

登录到Spark HistoryServer历史服务器WEB UI界面,点击刚刚运行圆周率PI程序:
Spark系列-3、Spark的部署方式之Standalone模式_第9张图片
查看应用运行状况:
Spark系列-3、Spark的部署方式之Standalone模式_第10张图片
切换到【Executors】Tab页面:
Spark系列-3、Spark的部署方式之Standalone模式_第11张图片
从图中可以看到Spark Application运行到集群上时,由两部分组成:Driver Program和Executors。

第一、Driver Program

1、相当于AppMaster,整个应用管理者,负责应用中所有Job的调度执行;
2、运行JVM Process,运行程序的MAIN函数,必须创建SparkContext上下文对象;
3、一个SparkApplication仅有一个;

第二、Executors

1、相当于一个线程池,运行JVM Process,其中有很多线程,每个线程运行一个Task任务, 一个Task运行需要1 Core CPU,所有可以认为Executor中线程数就等于CPU Core核数;
2、一个Spark Application可以有多个,可以设置个数和资源信息;

Spark系列-3、Spark的部署方式之Standalone模式_第12张图片

  • Driver Program是用户编写的数据处理逻辑,这个逻辑中包含用户创建的SparkContext。SparkContext 是用户逻辑与Spark集群主要的交互接口,它会和Cluster Manager交互,包括向它申请计算资源等。

  • Cluster Manager负责集群的资源管理和调度,现在支持Standalone、Apache Mesos和Hadoop 的 YARN 。

  • Worker Node是集群中可以执行计算任务的节点。 Executor是在一个Worker Node上为某应用启动的一个进程,该进程负责运行任务,并且负责将数据存在内存或者磁盘上。

  • Task 是被送到某个Executor上的计算单元,每个应用都有各自独立的 Executor,计算最终在计算节点的 Executor中执行

WEB UI 监 控

Spark 提供了多个监控界面,当运行Spark任务后可以直接在网页对各种信息进行监控查看。运行spark-shell交互式命令在Standalone集群上,命令如下:

/export/server/spark/bin/spark-shell --master spark://node1.cn:7077

运行截图如下所示:
Spark系列-3、Spark的部署方式之Standalone模式_第13张图片

在node3.cn运行spark-shell,WEB UI监控页面地址:http://node3.cn:4040
Spark系列-3、Spark的部署方式之Standalone模式_第14张图片
在spark-shell中执行词频统计WordCount程序代码,运行如下:

val inputRDD = sc.textFile("/datas/wordcount.data")
val wordcountsRDD = inputRDD.flatMap(line => line.split("\\s+")).map(word => (word, 1)).reduceByKey((tmp, item) => tmp + item)
wordcountsRDD.take(5)

Spark系列-3、Spark的部署方式之Standalone模式_第15张图片
可以发现在一个Spark Application中,包含多个Job,每个Job有多个Stage组成,每个Job执行按照DAG图进行的。

Spark系列-3、Spark的部署方式之Standalone模式_第16张图片
其中每个Stage中包含多个Task任务,每个Task以线程Thread方式执行,需要1Core CPU。

Spark系列-3、Spark的部署方式之Standalone模式_第17张图片
可以看到Spark为应用程序提供了非常详尽的统计页面,每个应用的Job和Stage等信息都可以在这里查看到。通过观察应用详情页的各个信息,对进一步优化程序,调整瓶颈有着重要作用,后期综合项目案例详细讲解。

Spark Application程序运行时三个核心概念:Job、Stage、Task,说明如下:

  • Task:被分配到各个 Executor 的单位工作内容,它是 Spark 中的最小执行单位,一般来说有多少个 Paritition(物理层面的概念,即分支可以理解为将数据划分成不同部分并行处理),就会有多少个 Task,每个 Task 只会处理单一分支上的数据。
  • Job:由多个 Task 的并行计算部分,一般 Spark 中的 action 操作(如 save、collect,后面进一步说明),会生成一个 Job。
  • Stage:Job 的组成单位,一个 Job 会切分成多个 Stage,Stage 彼此之间相互依赖顺序执行, 而每个 Stage 是多个 Task 的集合,类似 map 和 reduce stage。

Spark系列-3、Spark的部署方式之Standalone模式_第18张图片

Standalone HA

Spark Standalone集群是Master-Slaves架构的集群模式,和大部分的Master-Slaves结构集群一样,存在着Master单点故障(SPOF)的问题。
Spark系列-3、Spark的部署方式之Standalone模式_第19张图片

高可用HA

如何解决这个单点故障的问题,Spark提供了两种方案

  • 基于文件系统的单点恢复(Single-Node Recovery with Local File System);
  • 基于Zookeeper的Standby Masters(Standby Masters with ZooKeeper);
    ZooKeeper提供了一个Leader Election机制,利用这个机制可以保证虽然集群存在多个Master,但是只有一个是Active的,其他的都是Standby。当Active的Master出现故障时,另外的一个Standby Master会被选举出来。由于集群的信息,包括Worker, Driver和Application的信息都已经持久化到文件系统,因此在切换的过程中只会影响新Job的提交,对于正在进行的Job没有任何的影响。加入ZooKeeper的集群整体架构如下图所示。

Spark系列-3、Spark的部署方式之Standalone模式_第20张图片

基于Zookeeper实现HA

官方文档:http://spark.apache.org/docs/2.4.5/spark-standalone.html#standby-masters-with-zookeeper
Spark系列-3、Spark的部署方式之Standalone模式_第21张图片
1)、停止Standalone集群

## 在node1.cn上执行命令
/export/server/spark/sbin/stop-master.sh

/export/server/spark/sbin/stop-slaves.sh

2)、增加Zookeeper配置

对Spark配置文件【$SPARK_HOME/conf/spark-env.sh】文件如下修改:

SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=node1.cn:2181,node2.cn:2181,node3.cn:2181
-Dspark.deploy.zookeeper.dir=/spark-ha"

参数含义说明:

spark.deploy.recoveryMode:恢复模式
spark.deploy.zookeeper.url:ZooKeeper的Server地址
spark.deploy.zookeeper.dir:保存集群元数据信息的文件、目录。包括Worker、Driver、Application信息。

注释或删除MASTER_HOST内容

# SPARK_MASTER_HOST=node1.cn

3)、将spark-env.sh分发集群

cd /export/server/spark/conf

scp -r spark-env.sh [email protected]:$PWD 
scp -r spark-env.sh [email protected]:$PWD

4)、启动集群服务
先启动Zookeeper集群,再分别启动2个Master服务,最后启动Worker服务

## 启动ZOOKEEPER服务
zookeeper-daemons.sh start

## 在node1和node2分别启动Master服务
/export/server/spark/sbin/start-master.sh

## 查看哪个Master为Active,就在哪个Master机器上启动Workers服务
/export/server/spark/sbin/start-slaves.sh

默认情况下,先启动Master就为Active Master,如下截图所示:
Spark系列-3、Spark的部署方式之Standalone模式_第22张图片

测试运行

Standalone HA集群运行应用时,指定ClusterManager参数属性为

--master spark://host1:port1,host2:port2

提交圆周率PI运行集群,命令如下:

SPARK_HOME=/export/server/spark

${SPARK_HOME}/bin/spark-submit \

--master spark://node1.cn:7077,node2.cn:7077 \

--class org.apache.spark.examples.SparkPi \

${SPARK_HOME}/examples/jars/spark-examples_2.11-2.4.5.jar \ 100

在执行过程中,使用jps查看Active Master进程ID,将其kill,观察Master是否自动切换与应用运行完成结束。
Spark系列-3、Spark的部署方式之Standalone模式_第23张图片

结束

本篇文章详细介绍了Standalone模式如何部署Spark应用程序,下篇文章介绍如何使用IDEA应用开发Spark应用程序。

你可能感兴趣的:(大数据专栏,spark,big,data,hadoop)