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

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

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

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

概念:

1.Task(任务):RDD中的一个分区对应一个task,task是单个分区上最小的处理流程单元
2.TaskSet(任务集):一组关联的,但相互之间没有Shuffle依赖关系的Task集合。
3.Stage(调度阶段):一个taskSet对应的调度阶段,每个job会根据RDD的宽依赖关系被切分很多Stage,每个stage都包含 一个TaskSet。
4.job(作业):由Action算子触发生成的由一个或者多个stage组成的计算作业。
5.application:用户编写的spark应用程序,由一个或者多个job组成,提交到spark之后,spark为application分派资源,将程序转换并执行。
6.DAGScheduler:根据job构建基于stage的DAG,并提交stage给TaskScheduler。
7.TaskScheduler:将Taskset提交给Worker Node集群运行并返回结果。

关系:

1,Application
一个SparkContext就是一个application,通过spark-submit脚本提交给集群。
2,DAG
RDD依赖组成的有向无环图,来表明一个Application中RDD的依赖关系。
3,Job
(1)没有检查点的正常情况下一个行动算子触发一个Job。
(2)如果行动算子的依赖链中有检查点(checkpoint),则至少有一个额外的Job来专门执行检查点功能。如果有多个checkpoint,需要根据下面参数来确定checkpoint Job的数量:spark.checkpoint.checkpointAllMarkedAncestors
如果值为true,则所有检查点都会执行,父RDD的checkpoint Job先执行。
否则只执行最靠后的RDD的checkpoint Job任务。
(3)主线程是串行阻塞式提交Job的,一个行动操作Job执行完毕后执行其依赖链中的checkpoint Job;然后执行下一个行动操作Job及其checkpoint Job。
4 Stage
(1)stage分为两类:ShuffleMapStage和ResultStage
(2)Spark根据ShuffleDependency来划分Stage,一个ShuffleDependency依赖关系的父RDD为前一个Stage的结束,子RDD(都是ShuffledRDD)下一个stage的开始。一个ShuffleDependency一个ShuffleMapStage,另外还会有一个ResultStage。
(3)一个Job stage的总数=零个或者多个ShuffleMapStage+一个ResultStage。
(4)stage之间有依赖关系,按照依赖关系的顺序串行执行。
5 Task
(1)Task分为两类:ShfflueMapTask和ResultTask。
(2)每个ShuffleMapStage都有一个或者多个ShfflueMapTask,数量为ShuffleMapStage中最后一个RDD的分区数量;
(3)每个ResultStage都有一个或者多个ResultStage,数量为ShuffleMapStage中最后一个RDD的分区数量。
(4)同一个stage的task之间并行执行,不同stage的task遵循stage的顺序。
(5)只有Task才会发送到spark Excutor中执行,涉及到数据计算。其它的概念都只存在于ApplicationMaster中。

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

my.txt

代码
点击查看代码
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("My App")
sc=SparkContext(conf=conf)

lines = sc.textFile("/home/hadoop/my.txt")

words=lines.flatMap(lambda line:line.split())
wordKV=words.map(lambda word:(word,1))
wc=wordKV.reduceByKey(lambda a,b:a+b)
cs=lines.flatMap(lambda line:list(line))
cKV=cs.map(lambda c:(c,1))
cc=cKV.reduceByKey(lambda a,b:a+b)
lines.foreach(print)
for line in lines.collect():
    print(line)
for word in words.collect():
    print(word)
for item in wordKV.collect():
    print(item)
for item in cs.collect():
    print(item)
for item in cKV.collect():
    print(item)
for item in wc.collect():
    print(item)
for item in cc.collect():
    print(item)

输出
点击查看代码
hello hadoop
hello spark
hello pyspark
hello
hadoop
hello
spark
hello
pyspark
('hello', 1)
('hadoop', 1)
('hello', 1)
('spark', 1)
('hello', 1)
('pyspark', 1)
h
e
l
l
o
 
h
a
d
o
o
p
h
e
l
l
o
 
s
p
a
r
k
h
e
l
l
o
 
p
y
s
p
a
r
k
('h', 1)
('e', 1)
('l', 1)
('l', 1)
('o', 1)
(' ', 1)
('h', 1)
('a', 1)
('d', 1)
('o', 1)
('o', 1)
('p', 1)
('h', 1)
('e', 1)
('l', 1)
('l', 1)
('o', 1)
(' ', 1)
('s', 1)
('p', 1)
('a', 1)
('r', 1)
('k', 1)
('h', 1)
('e', 1)
('l', 1)
('l', 1)
('o', 1)
(' ', 1)
('p', 1)
('y', 1)
('s', 1)
('p', 1)
('a', 1)
('r', 1)
('k', 1)
('hello', 3)
('hadoop', 1)
('spark', 1)
('pyspark', 1)
('h', 4)
('e', 3)
('l', 6)
('o', 5)
(' ', 3)
('a', 3)
('d', 1)
('p', 4)
('s', 2)
('r', 2)
('k', 2)
('y', 1)

RDD转化图

posted @ 2022-03-09 21:08  coder-one  阅读(42)  评论(0编辑  收藏  举报