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

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

 

 

Spark Core:Spark的核心组件,其操作的数据对象是RDD(弹性分布式数据集),图中在Spark Core上面的四个组件都依赖于Spark Core,可以简单认为Spark Core就是Spark生态系统中的离线计算框架

Spark Sql:可以简单认为可以让用户使用写SQL的方式进行数据计算,SQL会被SQL解释器转化成Spark core任务,让懂SQL不懂spark的人都能通过写SQL的方式进行数据计算,类似于hive在Hadoop生态圈中的作用

Spark Mlib:一个可扩展的Spark机器学习库,里面封装了很多通用的算法,包括二元分类、线性回归、聚类、协同过滤等。用于机器学习和统计等场景

Spark Streaming:Spark生态系统中的流式计算框架,是Spark核心API的一个扩展,其操作的数据对象是DStream,可以实现高吞吐量的,具备容错机制的实时流数据处理。

Spark Graphx:Spark生态系统中的图计算和并行图计算,目前较新版本已支持PageRank、数三角形、最大连通图和最短路径等6种经典的图算法

Local,Standalone,Yarn,Mesos:Spark的四种部署模式,其中Local是本地模式,一般用来开发测试,Standalone是Spark 自带的资源管理框架,Yarn和Mesos是另外两种资源管理框架,Spark用哪种模式部署,也就是使用了哪种资源管理框架

Tachyon:Tachyon是一个分布式内存文件系统,可以理解为内存中的HDFS

 

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进程。

2.RDD,DAG
RDD是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型

DAG是有向无环图,反应RDD之间的依赖关系

3.Job,Stage,Task,Application
Job: 调用RDD的一个action,如count,即触发一个Job,spark中对应实现为ActiveJob,DAGScheduler中使用集合activeJobs和jobIdToActiveJob维护Job

Stage: 代表一个Job的DAG,会在发生shuffle处被切分,切分后每一个部分即为一个Stage,Stage实现分为ShuffleMapStage和ResultStage,一个Job切分的结果是0个或多个ShuffleMapStage加一个ResultStage

Task: 最终被发送到Executor执行的任务,和stage的ShuffleMapStage和ResultStage对应,其实现分为ShuffleMapTask和ResultTask

Application: 用户在spark上构建的程序,包含了driver程序以及集群上的executors

4.driver,executor,Claster Manager, DAGScheduler, TaskScheduler.
driver进程就是应用的main()函数并且构建sparkContext对象,当我们提交了应用之后,便会启动一个对应的driver进程,driver本身会根据我们设置的参数占有一定的资源(主要指cpu core和memory)

executor进程宿主在worker节点上,一个worker可以有多个executor。每个executor持有一个线程池,每个线程可以执行一个task,executor执行完task以后将结果返回给driver,每个executor执行的task都属于同一个应用。

TaskScheduler:维护task和executor对应关系,executor和物理资源对应关系,在排队的task和正在跑的task。内部维护一个任务队列,根据FIFO或Fair策略,调度任务。

Claster Manager:群资源管理器,自带的或Mesos或YARN,负责申请和管理在Worker Node上运行应用所需的资源。

DAGScheduler:面向调度阶段的任务调度器,负责接收spark应用提交的作业,根据RDD的依赖关系划分调度阶段,并提交调度阶段给TaskScheduler.

 

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

 

>>> sc
>>> lines = sc.textFile("file:///home/hadoop/my.txt")
>>> lines
>>> words=lines.flatMap(lambda line:line.split())
>>> words
>>> wordKV=words.map(lambda word:(word,1))
>>> wordKV
>>> wc=wordKV.reduceByKey(lambda a,b:a+b)
>>> wc
>>> cs=lines.flatMap(lambda line:list(line))
>>> cs
>>> cKV=cs.map(lambda c:(c,1))
>>> cKV
>>> cc=cKV.reduceByKey(lambda a,b:a+b)
>>> cc 
>>> lines.foreach(print)
>>> words.foreach(print)
>>> wordKV.foreach(print)
>>> cs.foreach(print)
>>> cKV.foreach(print)
>>> wc.foreach(print)
>>> cc.foreach(print)

 

 

 

 

 

 

 

 

 

 

 

 

 

RDD关系转换图:

 

 

posted @ 2022-03-14 21:21  巢志红  阅读(28)  评论(0编辑  收藏  举报