3.Spark设计与运行原理,基本操作

1.Spark已打造出结构一体化、功能多样化的大数据生态系统,请用图文阐述Spark生态系统的组成及各组件的功能。

 

 

Spark Core
Spark Core 提供了Spark最基础和最核心的功能,主要包括:

  • SparkContext:通常而言,DriverApplication的执行与输出都是通过SparkContext完成的,在正式提交Application前,需要初始化SparkContext,SparkContext隐藏了网络通信、分布式部署、消息通信、存储能力、计算能力、缓存、文件服务、web服务等内容,应用开发者只需要使用SparkContext提供的API完成功能开发。SparkContext内置的DAGScheduler负责创建Job,将DAG中的RDD划分到不同的Stage,提交Stage等功能,内置的TaskScheduler负责资源的申请,任务的提交及请求集群对任务的调度等工作
  • 存储体系:Spark优先使用各节点的内存作为存储,当内存不足时才会考虑使用磁盘,极大地减少磁盘I/O,提升了任务执行的效率,使得Spark适用于实时计算、流式计算等场景。此外还提供了以内存为中心的高容错的分布式文件系统Tachyon供用户选择
  • 计算引擎:计算引擎由SparkContext中的DAGScheduler、RDD以及具体节点上的Executor负责执行的Map和Reduce任务组成。DAGScheduler和RDD虽然位于SparkContext内部,但是在任务正式提交与执行前将Job中的RDD组织成有向无环图(简称DAG)、并对Stage进行划分,决定了任务执行阶段任务的数量、迭代计算、shuffle等过程
  • 部署模式:由于单节点不足以提供足够的存储及计算能力,所以spark在SparkContext的TaskScheduler组件中提供了对Standalone部署模式的实现和Yarn、Mesos等分布式资源管理系统的支持。通过使用Standalone、Yarn、Mesos等部署模式为Task分配计算资源,提高任务的并发执行效率。

Spark SQL
Spark SQL允许开发人员直接处理RDD,同时也可查询Hive、HBase等外部数据源。Spark SQL的一个重要特点是其能够统一处理关系表和RDD,使得开发人员可以轻松地使用SQL命令进行查询,并进行更复杂的数据分析;

Spark Mlib
MLlib提供了常用机器学习算法的实现,包括聚类、分类、回归、协同过滤等,降低了机器学习的门槛,开发人员只要具备一定的理论知识就能进行机器学习的工作;

GraphX
GraphX是Spark中用于图计算的API,可认为是Pregel在Spark上的重写及优化,Graphx性能良好,拥有丰富的功能和运算符,能在海量数据上自如地运行复杂的图算法。

2.请详细阐述Spark的几个主要概念及相互关系:

 Master, Worker;  RDD,DAG; Application, job,stage,task; driver,executor,Claster Manager,DAGScheduler, TaskScheduler.

1、master和worker节点
master节点常驻master守护进程,负责管理worker节点,并且会从master节点提交应用。worker节点常驻worker守护进程,会与master节点进行通信,并且管理executor进程。在搭建spark集群时,就已经设置好了master节点和worker节点,一个集群中可以有多个master节点和多个worker节点。一台pc机器可以同时作为master和worker节点

2、

2、driver和executor进程
driver:
根据不同的部署模式,driver可以运行在master上,也可以运行在worker上。driver进程就是应用的main函数并且会构建sparkContext对象,当提交应用后,就会启动一个对应的driver进程,driver本身会根据设置的参数占用一定的资源,主要是 cpu core和memory。driver首先会向集群管理者申请spark应用所需的资源,也就是executor,然后集群管理者会根据spark应用所设置的参数在各个worker上分配一定数量的executor,每个executor都会占用一定数量的cpu和memory。在申请到应用所需的资源后,driver就能开始调度和执行编写的应用代码了。driver进程会将我们编写的spark应用代码拆分成多个stage,每个stage会执行一部分代码片段,并为每个stage创建一批tasks,然后再将这些tasks分配到各个executor中执行。

executor:
executor进程宿主在worker节点上,一个worker可以有多个executor。每个executor会持有一个线程池,每个线程可以执行一个task。executor执行完task后,可以将结果返回给driver,每个executor执行的task都是属于同一个应用的。此外executor还有一个功能就是为应用程序中要求缓存的RDD提供内存式存储,RDD是直接缓存在executor进程内的,也是因此,任务task可以在运行时充分利用缓存数据加速运算。

3、application

application(应用)其实就是用spark-submit提交的程序。比方说spark examples中的计算pi的SparkPi。一个application通常包含三部分:从数据源(比方说HDFS)取数据形成RDD,通过RDD的transformation和action进行计算,将结果输出到console或者外部存储(比方说collect收集输出到console)。

4、driver

5、job

Spark中的Job和MR中Job不一样不一样。MR中Job主要是Map或者Reduce Job。而Spark的Job其实很好区别,一个action算子就算一个Job,比方说count,first等。

6、Task

Task是Spark中最新的执行单元。RDD一般是带有partitions的,每个partition的在一个executor上的执行可以任务是一个Task。 

 7、Stage

Stage概念是spark中独有的。一般而言一个Job会切换成一定数量的stage。各个stage之间按照顺序执行。至于stage是怎么切分的,首选得知道spark论文中提到的narrow dependency(窄依赖)和wide dependency( 宽依赖)的概念。其实很好区分,看一下父RDD中的数据是否进入不同的子RDD,如果只进入到一个子RDD则是窄依赖,否则就是宽依赖。宽依赖和窄依赖的边界就是stage的划分点。从spark的论文中的两张截图,可以清楚的理解宽窄依赖以及stage的划分。

8、DAGScheduler, TaskScheduler:

spark调度器分为两个部分, 一个是 DagScheduler, 一个是 TaskScheduler,DagScheduler 主要是用来把一个 Job 根据宽依赖划分为多个Stage(阶段),对于划分出来的每个 stage 都抽象为一个 TaskSet任务集 交给TaskScheduler 来进行进一步的调度运行

 

三、在PySparkShell尝试以下代码,观察执行结果,理解sc,RDD,DAG。请画出相应的RDD转换关系图。

代码运行如下:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

RDD转换关系图如下:

posted @ 2022-03-13 21:39  温汉柯  阅读(46)  评论(0编辑  收藏  举报