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

教程来源于Github,感谢旧时光大数据大佬的无私奉献,致敬!

技术教程推荐

深入浅出区块链 -〔陈浩〕

TypeScript开发实战 -〔梁宵〕

MongoDB高手课 -〔唐建法(TJ)〕

说透敏捷 -〔宋宁〕

数据中台实战课 -〔郭忆〕

基于人因的用户体验设计课 -〔刘石〕

如何读懂一首诗 -〔王天博〕

攻克视频技术 -〔李江〕

工程师个人发展指南 -〔李云〕