1.Spark已打造出结构一体化、功能多样化的大数据生态系统,请用图文阐述Spark生态系统的组成及各组件的功能。
2.请详细阐述Spark的几个主要概念及相互关系:
Master:负责应用的资源管理,根据应用的需要,向ResourceManager申请资源
Worker :从节点,负责控制计算节点,启动Executor或者Driver。在YARN模式中为NodeManager,负责计算节点的控制。
RDD:弹性分布式数据集(RDD)是分布式处理的一个数据集的抽象, RDD是只读的,在RDD之上的操作都是并行的 .RDD只是一个逻辑实体,其中存储了分布式数据集的一些信息,并没有包含所谓的“物理数据”,“物理数据”只有在RDD被计算并持久化之后才存在于内存或磁盘中
DAG:有向无环图
Application:Spark用户程序,提交一次应用为一个Application。
Job:一个Application可能包含多个Job,每个action算子对应一个Job;action算子有collect,count等。
Stage:每个Job可能包含多层Stage,划分标记为shuffle过程;Stage按照依赖关系依次执行。
Task:具体执行任务的基本单位,被发到executor上执行。
Driver:负责应用的业务逻辑和运行规划(DAG—有向无环图)。
Executor:实际任务的执行者。一个应用会分拆给多个Executor来进行计算。
DAGScheduler,:面向stage的高层次的调度器,DAGScheduler把DAG拆分成很多的tasks,每组的tasks都是一个stage,每当遇到shuffle就会产生新的stage,DAGScheduler需要记录那些RDD被存入磁盘等物化动作,同时需寻找task的最优化调度,例如数据本地性等;DAGScheduler还要监视因为shuffle输出导致的失败;DAGScheduler划分stage后以TaskSet为单位把任务交给底层次的可插拔的调度器TaskScheduler来处理
TaskScheduler:一个TaskScheduler只为一个SparkContext实例服务,TaskScheduler接受来自DAGScheduler发送过来的分组的任务,DAGScheduler给TaskScheduler发送任务的时候是以Stage为单位来提交的,TaskScheduler收到任务后负责把任务分发到集群中Worker的Executor中去运行,如果某个task运行失败,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)
自己生成sc
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("My App")
sc=SparkContext(conf=conf)