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

1.Spark已打造出结构一体化、功能多样化的大数据生态系统,请用图文阐述Spark生态系统的组成及各组件的功能。
  • Spark Core: Spark Core 是整个Spark生态的核心,是一种大数据分布式处理框架.不仅提供map和reduce函数,还提供了计算模型,join, filter等.
  • HDFS: 分布式文件系统,能提供高吞吐量的数据访问.
  • Spark Streaming: 是构建在Spark上的实时计算框架,扩展了Spark处理大规模流式数据的能力.
  • Mlib: 是Spark常用的一种机器学习算法的实现库.
  • YARN: 是一种统一资源管理机制,在其上面可以运行多套计算框架.

2.请详细阐述Spark的几个主要概念及相互关系:
  1. Master, Worker;
  2. RDD, DAG;
  3. Application, job,stage, Task;
  4. Driver,Executor, Claster Manager, DAG Scheduler, Task Scheduler.

master和worker:

        spark集群有多个master节点和多个worker节点
	master节点常驻master守护进程,负责管理worker节点,我们从master节点提交应用
	worker节点常驻worker守护进程,与master节点通信,并且管理executor进程

下图是某网扒的,参考下:

RDD和DAG:

	Spark使用DAG来反映各RDD之间的依赖或血缘关系,RDD通过一系列的转换操作和行动操作就形成了一个DAG
	RDD(Resilient Distributed Datasets): 弹性分布式数据集,是分布式内存的抽象概念.RDD可以通过sc读取存储系统的数据集转换生成或其他已存在的RDD转换生成.
	DAG(Directed Acyclic Graph): 有向无环图及指的是一个无回路的有方向的图.

Application, job,stage,task:

	Application: 就是基于spark构建的用户程序,由集群上的驱动程序和执行程序组成
	job: 由多个任务组成的并行计算,为响应Spark Action操作(Spark操作可分为tramfrom和action操作)而产生的.一个action操作就生成一个job
	Stage: 每个job都被分成更小的tasksss称为阶段,一个Stage的划分根据一个job是否有进行shuffle发生(RDD中依赖关系分为宽依赖和窄依赖:
		窄依赖:父子关系是一对多或多对一不产生shuffle
		宽依赖:父子关系是多对一或多对多就产生Shuffle)
	简单来说,每次shuffle一下,就要划分一下stage哟

Driver,Executor,Cluster Manager,DAG Scheduler, Task Scheduler:

        Driver: 运行应用程序的main函数并创建SparkContext进程
	Executor: 在worker节点上Application启动的进程,执行运行任务并将数据保存在内存或disk中,每个Application都有自己的executorsss.
	Cluster Manager: 获取集群资源的外部服务(eg: standalone manager,Mesos,YARN)
	DAG Scheduler: 阶段调度器,通过RDD的转换操作转化成多个Stage,每个Stage生成一个Tasksss,并提交给TaskSchedule.
	Task Scheduler: 任务调度器核心任务是提交Tasksss到集群运算并汇报结果
3.在PySparkShell尝试以下代码,观察执行结果,理解sc,RDD,DAG。请画出相应的RDD转换关系图。
点击查看代码
sc
lines = sc.textFile("poem.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-09 20:03  叶文茂  阅读(52)  评论(0编辑  收藏  举报
TOP