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模式(集群模式)