SparkCore

SparkCore

1. 认识Spark

官网地址 http://spark.apache.org/添加链接描述

  Spark是一种快速、通用、可扩展的大数据分析引擎,2009年诞生于加州大学伯克利分校AMPLab,2010年开源,2013年6月成为Apache孵化项目,2014年2月成为Apache顶级项目。项目是用Scala进行编写。
  2014年5月,Spark 1.0.0发布。
  2016年1月,Spark 1.6.0发布。
  2016年7月,Spark 2.0.0发布。
  2020年6月,Spark 3.0.0发布。
  截止2020年1月,1.x最终版本为1.6.3,2.x最后一个维护版本为2.4.8,3.x最新版本为3.2.0。

  Spark 官网将Spark 定义为一个大型可扩展数据的快速和通用处理引擎。

  首先,Spark 采用了先进的DAG执行引擎,支持循环数据流和内存计算,使得 Spark 速度更快,在内存中的速度是Hadoop MR的百倍,在磁盘上的速度是Hadoop MR的十倍(官网数据) 。
  其次,Spark 是一个通用的处理引擎, 被设计用来做批处理、迭代运算、交互式查询、流处理、机器学习等。
  另外,Spark “易用”,可以用Scala、Java、Python、R等开发分布式应用,Spark 提供了大量高级API,方便开发。
  最后,Spark 集成了多种数据源,并且可以通过local、Yarn、Mesos、Standalone(Spark 提供的部署方式)等各种模式运行。
2. Hadoop与Spark的关系及区别
2.1框架比较
hadoop(MR)spark
起源20052009
起源地MapReduce (Google) Hadoop (Yahoo)University of California, Berkeley
数据处理引擎BatchBatch
处理Slower than Spark and Flink100x Faster than Hadoop
编程语言Java, C, C++, Ruby, Groovy, Perl, PythonJava, Scala, python and R
编程模型MapReduceResilient distributed Datasets (RDD)
Data TransferBatchBatch
内存管理Disk BasedJVM Managed
延迟HIghMedium
吞吐量MediumHigh
优化机制ManualManual
APILow-levelHigh-level
流处理支持NASpark Streaming/StructedStreaming
SQL支持Hive, ImpalaSparkSQL
Graph 支持NAGraphX
机器学习支持NASparkML
2.2 处理流程比较

MR中的迭代:

1613792109624

Spark中的迭代:

1613792122795

总结

1、Spark把运算的中间数据存放在内存,迭代计算效率更高;MapReduce的中间结果需要落地,需要保存到磁盘,这样必然会有磁盘io操做,影响性能。

2、Spark容错性高,它通过弹性分布式数据集RDD来实现高效容错,RDD是一组分布式的存储在节点内存中的只读性质的数据集,这些集合是弹性的,某一部分丢失或者出错,可以通过整个数据集的计算流程的血缘关系来实现重建;MapReduce的话容错可能只能重新计算了,成本较高。

3、Spark更加通用,spark提供了transformation和action这两大类的多个功能api,另外还有流式处理Spark Streaming模块、图计算GraphX等等;MapReduce只提供了map和reduce两种操作,流计算以及其他模块的支持比较缺乏。

4、Spark框架和生态更为复杂,首先有RDD、血缘lineage、执行时的有向无环图DAG、stage划分等等,很多时候spark作业都需要根据不同业务场景的需要进行调优已达到性能要求;MapReduce框架及其生态相对较为简单,对性能的要求也相对较弱,但是运行较为稳定,适合长期后台运行。

3. Spark 组件

Spark Core

实现了 Spark 的基本功能,包含任务调度、内存管理、错误恢复、与存储系统 交互等模块。Spark Core 中还包含了对弹性分布式数据集(resilient distributed dataset,简称RDD)的 API 定义。

Spark SQL

是 Spark 用来操作结构化数据的程序包。通过 Spark SQL,我们可以使用 SQL 或者 Apache Hive 版本的 SQL 方言(HQL)来查询数据。Spark SQL 支持多种数据源,比 如 Hive 表、Parquet 以及 JSON 等。

Spark Streaming

是 Spark 提供的对实时数据进行流式计算的组件。提供了用来操作数据流的 API,并且与 Spark Core 中的 RDD API 高度对应。

Spark MLlib

提供常见的机器学习(ML)功能的程序库。包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据 导入等额外的支持功能。

Spark GraphX

GraphX在Spark基础上提供了一站式的数据解决方案,可以高效地完成图计算的完整流水作业。GraphX是用于图计算和并行图计算的新的(alpha)Spark API。通过引入弹性分布式属性图(Resilient Distributed Property Graph),一种顶点和边都带有属性的有向多重图,扩展了Spark RDD。

Structured Streaming(2.X版本)

结构化流是构建在sparksql引擎上的可伸缩且容错的流处理引擎。在内部,默认情况下,结构化流式处理查询使用微批处理引擎进行处理,该引擎将数据流作为一系列小批处理作业进行处理,从而实现低至100毫秒的端到端延迟,并且只保证一次容错。

4. Spark特点

与Hadoop的MapReduce相比,Spark基于内存的运算要快100倍以上,基于硬盘的运算也要快10倍以上。Spark实现了高效的DAG执行引擎,可以通过基于内存来高效处理数据流。

易用

Spark支持Java、Python和Scala的API,还支持超过80种高级算法,使用户可以快速构建不同的应用。而且Spark支持交互式的Python和Scala的shell,可以非常方便地在这些shell中使用Spark集群来验证解决问题的方法。

通用

Spark提供了统一的解决方案。Spark可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX)。这些不同类型的处理都可以在同一个应用中无缝使用。Spark统一的解决方案非常具有吸引力,毕竟任何公司都想用统一的平台去处理遇到的问题,减少开发和维护的人力成本和部署平台的物力成本。

兼容性

Spark可以非常方便地与其他的开源产品进行融合。比如,Spark可以使用Hadoop的YARN和Apache Mesos作为它的资源管理和调度器,器,并且可以处理所有Hadoop支持的数据,包括HDFS、HBase和Cassandra等。这对于已经部署Hadoop集群的用户特别重要,因为不需要做任何数据迁移就可以使用Spark的强大处理能力。Spark也可以不依赖于第三方的资源管理和调度器,它实现了Standalone作为其内置的资源管理和调度框架,这样进一步降低了Spark的使用门槛,使得所有人都可以非常容易地部署和使用Spark。此外,Spark还提供了在EC2上部署Standalone的Spark集群的工具。

5. Spark 部署

5.1 Spark集群部署
5.1.1 Spark部署模式

Local 多用于本地测试,如在eclipse,idea中写程序测试等。

Standalone 是Spark自带的一个资源调度框架,它支持完全分布式。

**Yarn **生态圈里面的一个资源调度框架,Spark也是可以基于Yarn来计算的。

Mesos 资源调度框架,与Yarn类似。

5.1.2 环境准备

环境预准备,至少三台机器互通互联,免密登录,时间同步,安装好JDK1.8。

安装包下载:

image-20211227152135620

注意:Spark 3.1.2需要的Hadoop环境建议是3.2(含)版本以上

其他下载方式:

http://archive.apache.org/dist

https://github.com/apache/spark

4.1.3 Standalone模式

Spark自身节点运行的集群模式,也就是我们所谓的独立部署(Standalone)模式。Spark的Standalone模式体现了经典的master-slave模式。

集群规划:

基本条件:同步时间、免密登录、关闭防火墙、安装JDK1.8

qf01qf02qf03
sparkMaster WorkerWorkerWorker

1)解压缩文件

将spark-3.1.2-bin-hadoop3.2.tgz文件上传到qianfeng01并解压缩在指定位置

tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz -C /usr/local

2)修改配置文件

2.1) 进入解压缩后路径的conf目录,修改workers.template文件名为workers

mv workers.template workers

2.2) 修改workers文件,添加worker节点

qf01
qf02
qf03

2.3) 修改spark-env.sh.template文件名为spark-env.sh

mv spark-env.sh.template spark-env.sh

2.4) 修改spark-env.sh文件,添加JAVA_HOME环境变量和集群对应的master节点

export JAVA_HOME=/usr/local/jdk1.8.0_291
SPARK_MASTER_HOST=qf01
SPARK_MASTER_PORT=7077

注意:7077端口,相当于hadoop3内部通信的9820端口,此处的端口需要确认自己的Hadoop配置

3)分发配置好的内容到其他节点

scp -r /usr/local/spark-3.1.2-bin-hadoop3.2/ root@qf02:$PWD
scp -r /usr/local/spark-3.1.2-bin-hadoop3.2/ root@qf03:$PWD

spark启动集群:
进入到安装目录找sbin目录进入 /usr/local/spark-3.1.2-bin-hadoop3.2
启动 ./start-all.sh
spark提供webUI界面端口是一样8080或8081 内部通信7077

http://qf01:8080 或 http://qf01:8081

集群架构

5.1.4 配置Job History Server

由于spark-shell停止掉后,集群监控qf01:4040页面就看不到历史任务的运行情况,所以开发时都配置历史服务器记录任务运行情况。

  1. 修改spark-defaults.conf.template文件名为spark-defaults.conf
mv spark-defaults.conf.template spark-defaults.conf

  1. 修改spark-default.conf文件,配置日志存储路径

注意:需要启动hadoop集群,HDFS上的directory目录需要提前存在。

hdfs dfs -mkdir /directory

spark.eventLog.enabled      true
spark.eventLog.dir       hdfs://qf01:9820/directory

  1. 修改spark-env.sh文件, 添加日志配置
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080 
-Dspark.history.fs.logDirectory=hdfs://qf01:9820/directory 
-Dspark.history.retainedApplications=30"

参数1含义:WEB UI访问的端口号为18080

参数2含义:指定历史服务器日志存储路径

参数3含义:指定保存Application历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数。

注意:上述配置历史服务器是非HA模式的Hadoop提供配置操作如果是HA模式的hadoop需要将qianfeng01替换成supercluster(hadoop-3.3.1/etc/hadoop/hdfs-site.xml 中dfs.nameservices配置的值),不需要指定端口

spark.eventLog.dir     hdfs://supercluster/directory
---------------------------------------------------------
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080 
-Dspark.history.fs.logDirectory=hdfs://supercluster/directory 
-Dspark.history.retainedApplications=30"

  1. 分发配置文件
scp -r /usr/local/spark-3.1.2-bin-hadoop3.2/conf root@qf02:$PWD
scp -r /usr/local/spark-3.1.2-bin-hadoop3.2/conf root@qf03:$PWD

  1. 重新启动集群和历史服务
sbin/start-all.sh
sbin/start-history-server.sh

  1. 重新执行任务
spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://qf01:7077 \
/usr/local/spark-standalone/examples/jars/spark-examples_2.12-3.1.2.jar \
10

  1. 查看历史服务:http://qf:18080
5.1.5 配置高可用(HA)【选配】

所谓的高可用是因为当前集群中的Master节点只有一个,所以会存在单点故障问题。所以为了解决单点故障问题,需要在集群中配置多个Master节点,一旦处于活动状态的Master发生故障时,由备用Master提供服务,保证作业可以继续执行。这里的高可用一般采用

集群规划:

qf01qf02qf03
sparkMaster WorkerMaster WorkerWorker
  1. 停止集群
sbin/stop-all.sh 
如果启动历史服务器也要停止stop-history-server.sh

  1. 启动Zookeeper
zkServer.sh start

  1. 修改spark-env.sh文件添加如下配置
注释如下内容:
#SPARK_MASTER_HOST=qf01
#SPARK_MASTER_PORT=7077

添加如下内容:
#Master监控页面默认访问端口为8080,但是可能会和Zookeeper冲突,所以改成8676,也可以自定义,访问UI监控页面时请注意
SPARK_MASTER_WEBUI_PORT=8676
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER 
-Dspark.deploy.zookeeper.url=qf01,qf02,qf03 
-Dspark.deploy.zookeeper.dir=/spark"

  1. 分发配置文件
scp -r /usr/local/spark-3.1.2-bin-hadoop3.2/conf root@qf02:$PWD
scp -r /usr/local/spark-3.1.2-bin-hadoop3.2/conf root@qf03:$PWD

  1. 启动集群
sbin/start-all.sh 

  1. 启动qf02的单独Master节点,此时qf02节点Master状态处于备用状态
sbin/start-master.sh 

  1. 提交应用到高可用集群
spark-submit \
--class org.apache.spark.examples.SparkPi 
--master spark://qf01:7077,qf02:7077 \
/usr/local/spark-standalone/examples/jars/spark-examples_2.12-3.1.2.jar \
10

需要注意:提交的时候需要将master节点都写出

5.2 Yarn 模式

需要注意:配置yarn的文件中不要保留标签和队列,容易造成后续提交到Yarn中无法执行的效果,队列可以保留但是内存给的足够到时没有什么问题

独立部署(Standalone)模式由Spark自身提供计算资源,无需其他框架提供资源。这种方式降低了和其他第三方资源框架的耦合性,独立性非常强。Spark主要是计算框架,而不是资源调度框架,所以本身提供的资源调度并不是它的强项,所以可以使用Hadoop生态中Yarn进行资源调度操作

5.2.1 集群搭建

1)将spark-3.1.2-bin-hadoop3.2.tgz文件上传到qf01并解压缩在指定位置

tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz -C /usr/local

2)修改hadoop中的配置文件/usr/local/hadoop-3.3.1/etc/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>

分发到不同的节点

scp /usr/local/hadoop-3.3.1/etc/hadoop/yarn-site.xml root@qf02:$PWD
scp /usr/local/hadoop-3.3.1/etc/hadoop/yarn-site.xml root@qf03:$PWD

  1. 进入解压缩后路径的conf目录,修改workers.template文件名为workers

修改spark-env.sh.template文件名为spark-env.sh

修改spark-defaults.conf.template文件名为spark-defaults.conf

mv workers.template workers
mv spark-env.sh.template spark-env.sh
mv spark-defaults.conf.template spark-defaults.conf

workers文件中添加

qf01
qf02
qf03

spark-env.sh文件中添加

export JAVA_HOME=/usr/local/jdk1.8.0_291
HADOOP_CONF_DIR=/usr/local/hadoop-3.3.1/etc/hadoop
YARN_CONF_DIR=/usr/local/hadoop-3.3.1/etc/hadoop
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080 
-Dspark.history.fs.logDirectory=hdfs://qf01:9820/directory 
-Dspark.history.retainedApplications=30"

spark-defaults.conf文件中添加

spark.eventLog.enabled      true
spark.eventLog.dir       hdfs://qf01:9820/directory
spark.yarn.historyServer.address=qf01:18080
spark.history.ui.port=18080

注意:需要启动hadoop集群,HDFS上的目录需要提前存在。

start-dfs.sh
hdfs dfs -mkdir /directory

注意:上述配置历史服务器是非HA模式的Hadoop提供配置操作如果是HA模式的hadoop需要将qf01替换成supercluster(hadoop-3.3.1/etc/hadoop/hdfs-site.xml 中dfs.nameservices配置的值),不需要指定端口

spark.eventLog.dir     hdfs://supercluster/directory
---------------------------------------------------------
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080 
-Dspark.history.fs.logDirectory=hdfs://supercluster/directory 
-Dspark.history.retainedApplications=30"

分发到不同的节点

scp -r /usr/local/spark-3.1.2-bin-hadoop3.2/ root@qf02:$PWD
scp -r /usr/local/spark-3.1.2-bin-hadoop3.2/ root@qf03:$PWD

启动集群

先启动zkServer.sh start
再起启动 start-all.sh  
       --》等价于 start-dfs.sh 和 start-yarn.sh
注意:请确保resourcemanager的正确启动
再启动spark-->sbin目录下执行 
./start-all.sh
./start-history-server.sh 

5.3 Spark作业提交原理

Spark作业(任务)提交就是使用spark中spark-sumbit命令将已经封装好成jar包的程序提交到spark集群中执行运行从而得到计算结果的过程,在提交过程中我们对提交的作业(任务)进行参数设置操作

spark提交作业的语法

bin/spark-submit \
--class <main-class>
--master <master-url> \
... # other options
<application-jar> \
[application-arguments]

参数解释
–classSpark程序中包含主函数的类 【必要】
–masterSpark程序运行的模式(环境) 【必要】
–deploy-modemaster设为为Yarn模式之后,使用的模式client 和 cluster 【如果指定Yarn模式 必要】
–driver-coresmaster设为为Yarn模式之后,设置driver端的的cores个数
–driver-memorymaster设为为Yarn模式之后,用于设置driver进程的内存(单位G或单位M)
–num-executorsmaster设为为Yarn模式之后,用于设置Spark作业总共要用多少个Executor进程来执行
–executor-memory指定每个executor可用内存(单位G或单位M)
–total-executor-cores 2指定所有executor使用的cpu核数为2个
–executor-cores指定每个executor使用的cpu核数
application-jar打包好的应用jar,包含依赖。这个URL在集群中全局可见。 比如hdfs:// 共享存储系统,如果是file:// path,那么所有的节点的path都包含同样的jar 【必要】
application-arguments传给main()方法的参数 【必要】
5.3.1 spark提交作业方式(Standalone模式)

提交Spark提供的利用蒙特·卡罗算法求π的例子,其中100这个参数是计算因子

bin/spark-submit \
> --class org.apache.spark.examples.SparkPi \
> --master spark://qf01:7077 \
> --executor-memory 512m \
> --total-executor-cores 2 \
> /usr/local/spark-3.1.2-bin-hadoop3.2/examples/jars/spark-examples_2.12-3.1.2.jar 100

注意:在启动任务的时候并没有指定分配资源,而是有多少资源就使用了多少资源我们在跑任务的时候是可以指定资源的,可以在指定使用核数和内存资源

提交执行原理图

Standalone模式下存在的角色:

Client:客户端进程,负责提交作业到Master。

Master:Standalone模式中主控节点,负责接收Client提交的作业,管理Worker,并命令Worker启动Driver和Executor。

Worker:Standalone模式中slave节点上的守护进程,负责管理本节点的资源,定期向Master汇报心跳,接收Master的命令,启动Executor。

Driver: 一个Spark作业运行时包括一个Driver进程,也是作业的主进程,负责作业的解析、生成Stage并调度Task到Executor上。包括DAGScheduler,TaskScheduler。

Executor:即真正执行作业的地方,一个集群一般包含多个Executor,每个Executor接收Driver的命令Launch Task,一个Executor可以执行一到多个Task。

2.作业相关的名词解释

Stage:一个Spark作业一般包含一到多个Stage。

Task:一个Stage包含一到多个Task,通过多个Task实现并行运行的功能。

DAGScheduler: 实现将Spark作业分解成一到多个Stage,每个Stage根据RDD的Partition个数决定Task的个数,然后生成相应的Task set放到TaskScheduler中。

TaskScheduler:实现Task分配到Executor上执行

5.3.2 spark提交作业方式(YARN-client模式)

提交Spark提供的利用蒙特·卡罗算法求π的例子,其中100这个参数是计算因子

bin/spark-submit \
> --class org.apache.spark.examples.SparkPi \
> --master yarn \
> --deploy-mode client \ 
> --driver-cores 1 \
> --driver-memory 600M \ 
> --executor-memory 800M \ 
> --executor-cores 2  \
> /usr/local/spark-3.1.2-bin-hadoop3.2/examples/jars/spark-examples_2.12-3.1.2.jar 100

注意:在启动任务的时候并没有指定分配资源,而是有多少资源就使用了多少资源我们在跑任务的时候是可以指定资源的,可以在指定使用核数和内存资源

提交执行原理图

1613794095706
    1. Spark Yarn Client向YARN的ResourceManager申请启动Application Master。同时在SparkContent初始化中将创建DAGScheduler和TASKScheduler等,由于我们选择的是Yarn-Client模式,程序会选择YarnClientClusterScheduler和YarnClientSchedulerBackend
    1. ResourceManager收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster,与YARN-Cluster区别的是在该ApplicationMaster不运行SparkContext,只与SparkContext进行联系进行资源的分派
    1. Client中的SparkContext初始化完毕后,与ApplicationMaster建立通讯,向ResourceManager注册,根据任务信息向ResourceManager申请资源(Container)
    1. 一旦ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后会向Client中的SparkContext注册并申请Task
    1. client中的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运行Task并向Driver汇报运行的状态和进度,以让Client随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务
    1. 应用程序运行完成后,Client的SparkContext向ResourceManager申请注销并关闭自己

    客户端的Driver将应用提交给Yarn后,Yarn会先后启动ApplicationMaster和executor,另外ApplicationMaster和executor都 是装载在container里运行,container默认的内存是1G,ApplicationMaster分配的内存是driver- memory,executor分配的内存是executor-memory。同时,因为Driver在客户端,所以程序的运行结果可以在客户端显 示,Driver以进程名为SparkSubmit的形式存在。

    注意:因为是与Client端通信,所以Client不能关闭。

5.3.3 spark提交作业方式(YARN-Cluster模式)

提交Spark提供的利用蒙特·卡罗算法求π的例子,其中100这个参数是计算因子

bin/spark-submit \
> --class org.apache.spark.examples.SparkPi \
> --master yarn \
> --deploy-mode cluster \ 
> --driver-cores 1 \
> --driver-memory 600M \ 
> --executor-memory 800M \ 
> --executor-cores 2  \
> /usr/local/spark-3.1.2-bin-hadoop3.2/examples/jars/spark-examples_2.12-3.1.2.jar 100

注意:在启动任务的时候并没有指定分配资源,而是有多少资源就使用了多少资源我们在跑任务的时候是可以指定资源的,可以在指定使用核数和内存资源

提交执行原理图

    1. Spark Yarn Client向YARN中提交应用程序,包括ApplicationMaster程序、启动ApplicationMaster的命令、需要在Executor中运行的程序等
    1. ResourceManager收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster,其中ApplicationMaster进行SparkContext等的初始化
    1. ApplicationMaster向ResourceManager注册,这样用户可以直接通过ResourceManage查看应用程序的运行状态,然后它将采用轮询的方式通过RPC协议为各个任务申请资源,并监控它们的运行状态直到运行结束
    1. 一旦ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动CoarseGrainedExecutorBackend,而Executor对象的创建及维护是由CoarseGrainedExecutorBackend负责的,CoarseGrainedExecutorBackend启动后会向ApplicationMaster中的SparkContext注册并申请Task。这一点和Standalone模式一样,只不过SparkContext在Spark Application中初始化时,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler进行任务的调度,其中YarnClusterScheduler只是对TaskSchedulerImpl的一个简单包装,增加了对Executor的等待逻辑等
    1. ApplicationMaster中的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运行Task并向ApplicationMaster汇报运行的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务
    1. 应用程序运行完成后,ApplicationMaster向ResourceManager申请注销并关闭自己
5.3.4 YARN-Cluster和YARN-Client的区别
  • 理解YARN-Client和YARN-Cluster深层次的区别之前先清楚一个概念:Application Master。在YARN中,每个Application实例都有一个ApplicationMaster进程,它是Application启动的第一个容器。它负责和ResourceManager打交道并请求资源,获取资源之后告诉NodeManager为其启动Container。从深层次的含义讲YARN-Cluster和YARN-Client模式的区别其实就是ApplicationMaster进程的区别
  • YARN-Cluster模式下,Driver运行在AM(Application Master)中,它负责向YARN申请资源,并监督作业的运行状况。当用户提交了作业之后,就可以关掉Client,作业会继续在YARN上运行,因而YARN-Cluster模式不适合运行交互类型的作业
  • YARN-Client模式下,Application Master仅仅向YARN请求Executor,Client会和请求的Container通信来调度他们工作,也就是说Client不能离开

总结

(1)Yarn-Cluster的Driver是在集群的某一台NM上,但是Yarn-Client就是在RM的机器上;
(2)Driver会和Executors进行通信,所以Yarn_Cluster在提交App之后可以关闭Client,而Yarn-Client不可以;
(3)Yarn-Cluster适合生产环境,Yarn-Client适合交互和调试。

5.4 SparkShell

spark-shell是Spark自带的交互式Shell程序,方便用户进行交互式编程,用户可以在该命令行下用Scala编写Spark程序。

spark-shell程序一般用作Spark程序【测试练习】来用。spark-shell属于Spark的特殊应用程序,我们可以在这个特殊的应用程序中提交应用程序

spark-shell启动有两种模式,local模式和cluster模式。

5.4.1 Local模式
spark-shell 

local模式仅在本机启动一个SparkSubmit进程,没有与集群建立联系,虽然进程中有SparkSubmit但是不会被提交到集群

5.4.2 Cluster模式(集群模式)
spark-shell \
--master spark://qf01:7077

5.4.3 Yarn模式(YARN-client模式)
spark-shell \
--master yarn

注意,这里的–master必须使用yarn-client模式,不是yarn-cluster因为spark-shell作为一个与用户交互的命令行

总结:

1.spark-shell会创建两个对象:sc和spark,分别表示两个重要的上下文环境:SparkContext和SparkSession。
2.master=local[ * ]*表示运行在Local模式,[ * ]*表示CPU的核心数量
3.spark-shell模式会启用WebUI端口4040,如果同一时间启动多个spark-shell,该端口依次递增

5.4.4 退出spark-shell

正确退出 :quit 千万不要ctrl+c退出,这样是错误的。若使用了ctrl+c退出,使用命令查看监听端口:

netstat -apn | grep 4040

再使用kill -9 端口号 杀死进程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spark-Core文档是本人经三年总结笔记汇总而来,对于自我学习Spark核心基础知识非常方便,资料中例举完善,内容丰富。具体目录如下: 目录 第一章 Spark简介与计算模型 3 1 What is Spark 3 2 Spark简介 3 3 Spark历史 4 4 BDAS生态系统 4 5 Spark与Hadoop的差异 5 6 Spark的适用场景 6 7 Spark成功案例 6 第二章 Spark开发环境搭建 8 1 Spark运行模式 8 2 Spark环境搭建 8 2.1Scala的安装 8 2.2Spark的单节点配置 9 2.3Spark-Standalone集群配置 9 2.4Spark-on-Yarn模式配置 12 2.5Spark-on-Mesos模式配置 13 2.6Hive-on-Spark配置 13 第三章 Spark计算模型 15 1 RDD编程 15 1.1弹性分布式数据集RDD 15 1.2构建RDD对象 15 2RDD操作 15 2.1将函数传递给Spark 16 2.2了解闭包 16 2.3Pair RDD模型 17 2.4Spark常见转换操作 18 2.5Spark常见行动操作 20 2.6RDD持久化操作 21 2.7注意事项 23 2.7并行度调优 24 2.8分区方式 25 3Examle:PageRank 27 第四章 Spark编程进阶 29 1共享变量 29 1.1累加器 30 1.2广播变量 31 2基于分区进行操作 32 3与外部程序间的管道 33 4数值RDD的操作 34 5 Spark Shuffle机制 34 第五章 Spark调优与调试 39 1开发调优: 40 1.1调优概述 40 1.2原则一:避免创建重复的RDD 40 1.3原则二:尽可能复用同一个RDD 41 1.4原则三:对多次使用的RDD进行持久化 42 1.5原则四:尽量避免使用shuffle类算子 43 1.6原则五:使用map-side预聚合的shuffle操作 44 1.7原则六:使用高性能的算子 45 1.8原则七:广播大变量 46 1.9原则八:使用Kryo优化序列化性能 47 1.10原则九:优化数据结构 48 2资源调优 48 2.1调优概述 48 2.2 Spark作业基本运行原理 49 2.3资源参数调优 50 第六章 Spark架构和工作机制 52 1 Spark架构 52 1.1 Spark架构组件简介 52 1.2 Spark架构图 54 2 Spark工作机制 54 2.1 Spark作业基本概念 54 2.2 Spark程序与作业概念映射 55 2.3 Spark作业运行流程 55 3 Spark工作原理 55 3.1 作业调度简介 55 3.2 Application调度 56 3.3 Job调度 56 3.4 Tasks延时调度 56 第七章 Spark运行原理 57 1 Spark运行基本流程 57 2 Spark在不同集群中的运行架构 58 2.1 Spark on Standalone运行过程 59 2.2 Spark on YARN运行过程 60

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小大数据

你的打赏是我活下去的动力哟~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值