大数据Spark系列——Spark运行模式


Spark运行模式

一、集群角色





物理部署层面上来看,Spark主要分为两种类型的节点:Master节点和Worker节点。Master节点主要运行集群管理器的中心化部分,所承载的作用是分配Application到Worker节点,维护Worker节点,Driver,Application的状态。Worker节点负责具体的业务运行。
Spark程序运行层面来看,Spark主要分为驱动器节点和执行器节点

1、Driver(驱动器节点)
Spark的驱动器是执行开发程序中的main方法的进程。它负责开发人员编写的用来创建SparkContext、创建RDD,以及进行RDD的转化操作和行动操作代码的执行。如果你是用spark shell,那么当你启动Spark shell的时候,系统后台自启了一个Spark驱动器程序,就是在Spark shell中预加载的一个叫作 sc的SparkContext对象。如果驱动器程序终止,那么Spark应用也就结束了。主要负责:
1)把用户程序转为作业(JOB)
2)跟踪Executor的运行状况
3)为执行器节点调度任务
4)UI展示应用运行状况
2、Executor(执行器节点)
Spark Executor是一个工作进程,负责在 Spark 作业中运行任务,任务间相互独立。Spark应用启动时,Executor节点被同时启动,并且始终伴随着整个Spark应用的生命周期而存在。如果有Executor节点发生了故障或崩溃,Spark应用也可以继续执行,会将出错节点上的任务调度到其他Executor节点上继续运行。主要负责:
1)负责运行组成Spark应用的任务,并将结果返回给驱动器进程
2)通过自身的块管理器(Block Manager)为用户程序中要求缓存的RDD提供内存式存储。RDD是直接缓存在Executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算。

二、运行模式

1、Local模式

1)概述
Local模式:Local模式就是运行在一台计算机上的模式,通常就是用于在本机上练手和测试。它可以通过以下集中方式设置master。
local:所有计算都运行在一个线程当中,没有任何并行计算,通常我们在本机执行一些测试代码,或者练手,就用这种模式;
local[K]:指定使用几个线程来运行计算,比如local[4]就是运行4个worker线程。通常我们的cpu有几个core,就指定几个线程,最大化利用cpu的计算能力;
local[*]:这种模式直接帮你按照cpu最多cores来设置线程数了。

2)安装使用
(1)上传并解压安装包

[drift@hadoop102 sorfware]$ tar -zxvf spark-2.1.1-bin-hadoop2.7.tgz -C /opt/module/
[drift@hadoop102 module]$ mv spark-2.1.1-bin-hadoop2.7 spark

(2)测试官方用例

[drift@hadoop102 spark]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--executor-memory 1G \
--total-executor-cores 2 \
./examples/jars/spark-examples_2.11-2.1.1.jar \
100    ==> 该数字代表迭代次数

计算圆周率:





计算结果:





(3)WordCount案例(直接在Spark-Shell模式运行)
1.WordCount思路





2.代码实现
新建input文件夹,创建相应的txt文档,并在文档中写入适量单词

scala> sc.textFile("input").flatMap(_.split(" ")).map
((_,1)).reduceByKey(_+_).collect





3.数据流分析:
textFile(“input”):读取本地文件input文件夹数据;
flatMap(.split(“ “)):压平操作,按照空格分割符将一行数据映射成一个个单词;
map((
,1)):对每一个元素操作,将单词映射为元组;
reduceByKey(_+_):按照key将值进行聚合,相加;
collect:将数据收集到Driver端展示。

2、Standalone模式

构建一个由Master+Slave构成的Spark集群,Spark运行在集群中。





1)安装使用
进入spark的conf目录下,修改三个文件名
将slaves.template复制为slaves
将spark-env.sh.template复制为spark-env.sh
将spark-defaults.conf.template复制为spark-defaults.conf.sh

修改slaves,添加work节点

hadoop102
hadoop103
hadoop104

修改spark-env.sh

SPARK_MASTER_HOST=hadoop102
SPARK_MASTER_PORT=7077





修改sbin下面的spark-config.sh

export JAVA_HOME=/opt/module/jdk1.8.0_144





分发spark到集群各个节点,之后启动Spark

2)官方案例:求π

bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://hadoop102:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
./examples/jars/spark-examples_2.11-2.1.1.jar \
100

结果:





3)Spark-Shell模式测试

scala> sc.textFile("input").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect

注意:
提交应用程序概述





3、Yarn模式

Spark客户端直接连接Yarn,不需要额外构建Spark集群。有yarn-client和yarn-cluster两种模式,主要区别在于:Driver程序的运行节点。
yarn-client:Driver程序运行在客户端,适用于交互、调试,希望立即看到app的输出。
yarn-cluster:Driver程序运行在由RM(ResourceManager)启动的AP(APPMaster)适用于生产环境。





1)安装使用
注意:在提交任务之前需启动HDFS以及YARN集群。
(1)修改hadoop配置文件yarn-site.xml,添加如下内容:

<!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<property>
    <name>yarn.nodemanager.pmem-check-enabled</name>
    <value>false</value>
</property>
<!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
</property>

(2)修改spark-env.sh,添加如下配置:

HADOOP_CONF_DIR=/opt/module/hadoop-2.7.2/etc/hadoop
YARN_CONF_DIR=/opt/module/hadoop-2.7.2/etc/hadoop

配置完之后分发yarn-site.xml、spark-env.sh(其实不分发也可以)

2)官方案例

bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
./examples/jars/spark-examples_2.11-2.1.1.jar \
100

执行结果:





4、Mesos模式(了解即可)

Spark客户端直接连接Mesos,不需要额外构建Spark集群。国内应用比较少,更多的是运用yarn调度。

5、几种模式比较





6、总结









如果想Driver运行在客户端,则采用Yarn-Client模式(客户端模式)
如果想Driver运行按照集群资源分配,则用Yarn-Cluster模式(集群模式)

坚持原创技术分享,您的支持将鼓励我继续创作!