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

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

 

 

以下简要介绍BDAS的各个组成部分。

1. Spark Core
Spark Core是整个BDAS的核心组件,是一种大数据分布式处理框架,不仅实现了MapReduce的算子map函数和reduce函数及计算模型,还提供如filter、join、groupByKey等更丰富的算子。
Spark将分布式数据抽象为弹性分布式数据集(RDD),实现了应用任务调度、RPC、序列化和压缩,并为运行在其上的上层组件提供API。其底层采用Scala函数式语言书写而成,并且深度借鉴Scala函数式的编程思想,提供与Scala类似的编程接口。

2. Mesos
Mesos是Apache下的开源分布式资源管理框架,被称为分布式系统的内核,提供了类似YARN的功能,实现了高效的资源任务调度。

3. Spark Streaming
Spark Streaming是一种构建在Spark上的实时计算框架,它扩展了Spark处理大规模流式数据的能力。其吞吐量能够超越现有主流流处理框架Storm,并提供丰富的API用于流数据计算。

4. MLlib
MLlib是Spark对常用的机器学习算法的实现库,同时包括相关的测试和数据生成器。MLlib目前支持4种常见的机器学习问题:二元分类、回归、聚类以及协同过滤,还包括一个底层的梯度下降优化基础算法。

5. GraphX
GraphX是Spark中用于图和图并行计算的API,可以认为是GraphLab和Pregel在Spark (Scala)上的重写及优化,与其他分布式图计算框架相比,GraphX最大的贡献是,在Spark上提供一栈式数据解决方案,可以方便、高效地完成图计算的一整套流水作业。

6. Spark SQL
Shark是构建在Spark和Hive基础之上的数据仓库。它提供了能够查询Hive中所存储数据的一套SQL接口,兼容现有的Hive QL语法。熟悉Hive QL或者SQL的用户可以基于Shark进行快速的Ad-Hoc、Reporting等类型的SQL查询。由于其底层计算采用了Spark,性能比Mapreduce的Hive普遍快2倍以上,当数据全部存储在内存时,要快10倍以上。2014年7月1日,Spark社区推出了Spark SQL,重新实现了SQL解析等原来Hive完成的工作,Spark SQL在功能上全覆盖了原有的Shark,且具备更优秀的性能。

7. Alluxio
Alluxio(原名Tachyon)是一个分布式内存文件系统,可以理解为内存中的HDFS。为了提供更高的性能,将数据存储剥离Java Heap。用户可以基于Alluxio实现RDD或者文件的跨应用共享,并提供高容错机制,保证数据的
可靠性。

8. BlinkDB
BlinkDB是一个用于在海量数据上进行交互式SQL的近似查询引擎。它允许用户在查询准确性和查询响应时间之间做出权衡,执行相似查询。

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

  Master, Worker;  RDD,DAG;

----------------------------------------

  Application, job,stage,task; driver,executor,Claster Manager

  DAGScheduler, TaskScheduler.

一、Master
Spark 特有资源调度系统的 Leader,掌管着整个集群的资源信息(Standalone模式),类似于 Yarn 集群中的ResourceManager。

主要功能:

监听 Worker,看集群中的 Worker 是否正常工作;
管理 Worker、Application(接收 Worker 的注册并管理所有的 Worker;接收 Client 提交的 Application,调度等待的Application 并向Worker提交)。
二、Worker
Spark 特有资源调度系统的 Slaver,一个集群中有多个 Slaver(Standalone),每个 Slaver 掌管着所在节点的资源信息,类似于 Yarn 框架中的 NodeManager。

主要功能:

通过 RegisterWorker 注册到 Master;
定时发送心跳给 Master;
根据 Master 发送的 Application 配置进程环境,并启动 ExecutorBackend(执行 Task 所需的临时进程)。
三、Driver Program(驱动程序)
每个 Spark 应用程序都包含一个驱动程序,驱动程序负责把并行操作发布到集群上。驱动程序包含 Spark 应用程序中的main()函数。在 WordCount 案例中,spark-shell 就是我们的驱动程序,所以我们可以在其中键入我们任何想要的操作,然后由它负责发布。驱动程序通过 SparkContext 对象来访问 Spark,SparkContext 对象相当于一个到 Spark 集群的连接(用它来连接Spark集群)。

四、Executor(执行器)
SparkContext 对象一旦成功连接到集群管理器, 就可以获取到集群中每个节点上的执行器(Executor)。执行器是一个进程(进程名: ExecutorBackend, 运行在 Worker 节点上),用来执行计算和为应用程序存储中间数据。

Spark 会发送应用程序代码(比如:jar包)到每个执行器,最后,SparkContext 对象发送任务到执行器开始执行程序。

 

Master、Worker、Driver Program、Executor之间的关系:


 

 

五、RDD(Resilient Distributed Dataset) 弹性分布式数据集
RDD 是 Spark 对数据的核心抽象,其实就是分布式的元素集合。在 Spark 中,对数据的所有操作不外乎创建 RDD、转化已有RDD 以及调用 RDD 操作进行求值。而在这一切背后, Spark 会自动将 RDD 中的数据分发到集群上,并将操作并行化执行。

Spark 中 RDD 是一种不可变的分布式对象集合,所以,对 RDD 的每一个操作都会生成一个新的 RDD。

六、Application

基于 Spark 构建的用户程序,一般包括了集群上的一个 driver 程序与多个 executor。


七、Application jar

包含了用户的 Spark application 的一个 jar 包。


八、Driver program

运行 application 的 main() 函数和创建 SparkContext 的进程.


九、Cluster manager

获取集群资源的一个外部服务, 比如 standalone 管理器, Mesos 和 YARN.


十、Deploy mode

区分 driver 进程在何处运行. 在 “cluster” 模式下, 框架在集群内部运行 driver. 在 “client” 模式下, 提交者在集群外部运行 driver.


十一、Worker node

集群内任一能够运行 application 代码的节点


十二、Executor

在 worker node 上 application 启动的一个进程, 该进程运行 task 并在内存或磁盘上保存数据. 每个 application 都有其独有的 executor.


十三、Task

发送到一个 executor 的一系列工作


十四、Job

由多个 task 组成的一个并行计算, 这些 task 产生自一个 Spark action (比如, save, collect) 操作.


十五、Stage

每个 job 被分解为多个 stage, 每个 stage 其实就是一些 task 的集合, 这些 stage 之间相互依赖 (与 MapReduce 中的 map 与 reduce stage 类似),执行过程中,每碰到一个shuffle就是一个stage。

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)

 

 

 

 

 

 

 

 

 

 

posted @ 2022-03-15 12:10  Quinnci  阅读(67)  评论(0)    收藏  举报