1.Spark生态系统图、组成及各组件的功能
Spark 生态圈是加州大学伯克利分校的 AMP 实验室打造的,是一个力图在算法(Algorithms)、机器(Machines)、人(People)之间通过大规模集成来展现大数据应用的平台。
AMP 实验室运用大数据、云计算、通信等各种资源及各种灵活的技术方案,对海量不透明的数据进行甄别并转化为有用的信息,以供人们更好地理解世界。该生态圈已经涉及机器学习、数据挖掘、数据库、信息检索、自然语言处理和语音识别等多个领域。
如下图所示,Spark 生态圈以 Spark Core 为核心,从 HDFS、Amazon S3 和 HBase 等持久层读取数据,以 Mesos、YARN 和自身携带的 Standalone 为 Cluster Manager 调度 Job 完成 Spark 应用程序的计算,这些应用程序可以来自于不同的组件。
1. Spark Core
Spark Core 是整个Spark生态系统的核心组件,是一个分布式大数据处理框架。Spark Core提供了多种资源调度管理,通过内存计算、有向无环图(DAG)等机制保证分布式计算的快速,并引入了RDD 的抽象保证数据的高容错性。Spark内核架构:
1)提供了有向无环图(DAG)的分布式并行计算框架,并提供 cache 机制来支持多次迭代计算或者数据共享,大大减少了迭代计算之间读取数据的开销,这对于需要进行多次迭代的数据挖掘和分析的性能有很大提升。
2)在 Spark 中引入了 RDD 的抽象,它是分布在一组结点中的只读对象集合,这些集合是弹性的,如果数据集的一部分丢失,则可以根据血缘关系对它们进行重建,保证了数据的高容错性。
3)移动计算而非移动数据,RDD 分区可以就近读取 HDFS 中的数据块到各个结点内存中进行计算。
4)使用多线程池模型来减少 Task 启动开销。
5)采用容错的、高可伸缩性的 Akka 作为通信框架。
2. Spark Streaming
Spark Streaming 是一个对实时数据流进行高通量、容错处理的流式处理系统,可以对多种数据源(如 Kafka、Flume、Twitter、Zero 和 TCP 套接字)进行类似 map、reduce 和 join 的复杂操作,并将结果保存到外部文件系统、数据库中,或应用到实时仪表盘上。
Spark Streaming 的核心思想是将流式计算分解成一系列短小的批处理作业,这里的批处理引擎是 Spark Core。也就是把 Spark Streaming 的输入数据按照设定的时间片(如 1 秒)分成一段一段的数据,每一段数据都转换成 Spark 中的 RDD,然后将 Spark Streaming 中对 DStream 的转换操作变为对 Spark 中的 RDD 的转换操作,将 RDD 经过操作变成的中间结果保存在内存中。
3. Spark SQL
Spark SQL 允许开发人员直接处理 RDD,以及查询存储在 Hive、HBase 上的外部数据。Spark SQL 的一个重要特点是其能够统一处理关系表和 RDD,使得开发人员可以轻松地使用 SQL 命令进行外部查询,同时进行更复杂的数据分析。
4. Spark MLlib
Spark MLlib 实现了一些常见的机器学习算法和实用程序,包括分类、回归、聚类、协同过滤、降维及底层优化,并且该算法可以进行扩充。Spark MLlib 降低了机器学习的门槛,开发人员只要具备一定的理论知识就能进行机器学习的工作。本教程将在后面对 Spark MLlib 做进一步介绍。
5. Spark GraphX
Spark GraphX 是 Spark 中用于图并行计算的 API,可以认为是 GraphLab 和 Pregel 在 Spark 上的重写及优化。与其他分布式图计算框架相比,Spark GraphX 最大的贡献是在 Spark 之上提供了一站式数据解决方案,可以方便且高效地完成图计算的一整套流水作业。
Spark GraphX 的核心抽象是 Resilient Distributed Property Graph,即一种点和边都带属性的有向多重图。它扩展了 Spark RDD 的抽象,有 Table 和 Graph 两种视图,而只需要一份物理存储。两种视图都有自己独有的操作符,从而使得操作灵活,并提高了执行效率。
2.阐述Spark的几个主要概念及相互关系
1,master和worker节点
搭建spark集群的时候我们就已经设置好了master节点和worker节点,一个集群有多个master节点和多个worker节点。
- master节点常驻master守护进程,负责管理worker节点,我们从master节点提交应用。
- worker节点常驻worker守护进程,与master节点通信,并且管理executor进程。
就像一台机器可以同时作为master和worker节点(举个例子:你有四台机器,你可以选择一台设置为master节点,然后剩下三台设为worker节点,也可以把四台都设为worker节点,这种情况下,有一个机器既是master节点又是worker节点)。
2,RDD和DAG
- RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是spark中最基本也是最重要的概念之一。它是spark中一种基本的数据抽象,有容错机制并可以被并行操作的元素集合,具有只读、分区、容错、高效、无需物化、可以缓存、RDD依赖等特征。
- DAG,有向无环图,Directed Acyclic Graph的缩写,常用于建模。Spark中使用DAG对RDD的关系进行建模,描述了RDD的依赖关系,这种关系也被称之为lineage,RDD的依赖关系使用Dependency维护,参考Spark RDD之Dependency,DAG在Spark中的对应的实现为DAGScheduler。
创建 RDD 对象;SparkContext 负责计算 RDD 之间的依赖关系,构建 DAG;DAGSchedule 负责把 DAG 图反向解析成多个阶段,每个阶段中包含多个任务,每个任务会被任务调度器分发给工作节点上的 Executor 上执行。
3,Application,、job、stage与task
- Application:通俗讲,用户每次提交的所有的代码为一个application。
- Job:一个application可以分为多个job。如何划分job?通俗讲,出发一个final RDD的实际计算为一个job
- Stage:一个job可以分为多个stage。根据一个job中的RDD的依赖关系进行划分
- Task:task是最小的基本的计算单位。一般是一个块为一个task,大约是128M
图片来源:
4,driver与executor
driver进程就是应用的main()函数并且构建sparkContext对象,当我们提交了应用之后,便会启动一个对应的driver进程,driver本身会根据我们设置的参数占有一定的资源(主要指cpu core和memory)
driver可以运行在master上,也可以运行worker上(根据部署模式的不同)。driver首先会向集群管理者(standalone、yarn,mesos)申请spark应用所需的资源,也就是executor,然后集群管理者会根据spark应用所设置的参数在各个worker上分配一定数量的executor,每个executor都占用一定数量的cpu和memory。在申请到应用所需的资源以后,driver就开始调度和执行我们编写的应用代码了。driver进程会将我们编写的spark应用代码拆分成多个stage,每个stage执行一部分代码片段,并为每个stage创建一批tasks,然后将这些tasks分配到各个executor中执行。
executor进程宿主在worker节点上,一个worker可以有多个executor。每个executor持有一个线程池,每个线程可以执行一个task,executor执行完task以后将结果返回给driver,每个executor执行的task都属于同一个应用。此外executor还有一个功能就是为应用程序中要求缓存的 RDD 提供内存式存储,RDD 是直接缓存在executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算。
5,Cluster Manager
Spark支持在各种集群管理器(cluster manager)上运行,包括Hadoop的YARN、Apache的Mesos以及Spark自带的一个简易调度器,叫独立调度器。
6,DAGScheduler, TaskScheduler
在创建SparkContext对象的时候,一个核心的是模块就是调度器(Scheduler),在spark中Scheduler有两种:
- TaskScheduler(是低级的调度器接口)。TaskScheduler负责实际每个具体Task的物理调度。
- DagScheduler(是高级的调度)。DAGScheduler负责将Task拆分成不同Stage的具有依赖关系(包含RDD的依赖关系)的多批任务,然后提交给TaskScheduler进行具体处理。DAG全称 Directed Acyclic Graph,有向无环图。简单的来说,就是一个由顶点和有方向性的边构成的图,从任意一个顶点出发,没有任何一条路径会将其带回到出发的顶点。
在作业调度系统中,调度的基础就在于判断多个作业任务的依赖关系,这些任务之间可能存在多重的依赖关系,也就是说有些任务必须先获得执行,然后另外的相关依赖任务才能执行,但是任务之间显然不应该出现任何直接或间接的循环依赖关系,所以本质上这种关系适合用DAG有向无环图来表示。
3.在PySparkShell尝试以下代码,观察执行结果,理解sc,RDD,DAG。请画出相应的RDD转换关系图
启动pyspark
写入命令行
输出结果