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

1.Spark生态系统

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

 Spark生态圈以Spark Core为核心,从HDFS、Hive、HBase和Hadoop等s数据源读取数据,以MESOS、YARN和自身携带的Standalone为资源管理器调度Job完成Spark应用程序的计算。 这些应用程序可以来自于不同的组件,如Spark Streaming的实时处理应用、Spark SQL的即席查询、Mlib的机器学习、GraphX的图处理等等。

 

 

 

Spark Core整个BDAS的核心组件,它实现了Spark的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。

Spark SQL:用来操作结构化数据的核心组件,通过Spark SQL可以直接查询Hive、 HBase等多种外部数据源中的数据。

Spark Streaming:Spark提供的流式计算框架,支持高吞吐量、可容错处理的实时流式数据处理,其核心原理是将流数据分解成一系列短小的批处理作业,每个短小的批处理作业都可以使用 Spark Core进行快速处理。

MLlib:Spark提供的关于机器学习功能的算法程序库,包括分类、回归、聚类、协同过滤算法等,还提供了模型评估、数据导入等额外的功能。

GraphX: Spark提供的分布式图处理框架,拥有图计算和图挖掘算法的API接口以及丰富的功能和运算符,极大地方便了对分布式图的处理需求,能在海量数据上运行复杂的图算法。

独立调度器、Yarn、 Mesos: Spark框架可以高效地在一个到数千个节点之间伸缩计算,集群管理器则主要负责各个节点的资源管理工作,为了实现这样的要求,同时获得最大的灵活性, Spark支持在各种集群管理器( Cluster Manager)上运行, Hadoop Yarn、Apache Mesos以及 Spark自带的独立调度器都被称为集群管理器。

 

2.Spark主要概念

请详细阐述Spark的几个主要概念及相互关系:
Master, Worker; RDD, DAG; Application, job, stage, task; driver, executor, Cluster Manager, DAGScheduler, TaskScheduler.

 

Master:常驻master守护进程,负责管理worker节点,从master节点提交应用。

 

Worker:常驻worker守护进程,与master节点通信,并且管理executor进程。运行一个或多个Executor进程,相当于计算节点。

 

RDD:Resillient Distributed Dataset(弹性分布式数据集),是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型。

 

DAG:Directed Acyclic Graph(有向无环图),反映RDD之间的依赖关系。

 

Application:用户编写的Spark的应用程序。

 

job:action的触发会生成一个job,Job会提交给DAGScheduler,分解成Stage。

 

stage:是作业的基本调度单位,每个作业会因为RDD之间的依赖关系拆分成多组任务集合TaskSet,成为调度阶段。调度阶段的划分是由DAGScheduler来划分的,有Shuffle Map Stage和Result Stage两种。

 

task:被送到executor上的工作单元,task简单的说就是在一个数据partition上的单个数据处理流程。

 

driver:负责控制一个应用的执行,运行Application的main函数和初始化SparkContext,Driver将Task和Task所依赖的file和jar(序列化后)传递给对应的Worker机器运行

 

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

 

Cluster Manager:在集群上获取资源的外部服务 (例如:Standalone、Mesos、Yarn)

 

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

 

TaskScheduler:面向任务的调度器,它接受DAGScheduler提交过来的调度阶段,然后把任务分发到work节点运行,由worker节点的Executor来运行该任务。

 

 

 

 

3. RDD转换关系图

在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 15:03  Nizlu  阅读(76)  评论(0)    收藏  举报