3.1 简介
Apache Spark 是一个开源的通用集群计算系统,它提供了 High-level 编程 API,支持 Scala、Java 和 Python 三种编程语言。Spark 内 核使用 Scala 语言编写,通过基于 Scala 的函数式编程特性,在不同的计算层面进行抽象,代码设计非常优秀。
Spark 提供了一个全面、统一的框架用于管理各种有着不同性质(文本数据、图表数据等)的数据集和数据源(批量数据或实时的流数据)的大数据处理的需求。
Spark 是 UC Berkeley AMP lab (加州大学伯克利分校的 AMP 实验室) 所开源的类 Hadoop MapReduce 的通用并行框架,2009 年开发,2010 年开源。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好 地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。
Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。
尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 Hadoop 文件系统中并行运行。通过名为 Mesos 的第三方集群框架可以支持此行为。Spark 由加州大学伯克利分校 AMP 实验室 (Algorithms, Machines, and People Lab) 开发,可用来构建大型的、低延迟的数据分析应用程序。
Spark 是基于内存的分布式计算框架。在迭代计算的场景下,数据处理过程中的数据可以存储在内存中,提供了比 MapReduce 高 10 到 100 倍 的计算能力。Spark 可以使用 HDFS 作为底层存储,使用户能够快速地从 MapReduce 切换到 Spark 计算平台上去。Spark 提供一站式数据分 析能力,包括小批量流式处理、离线批处理、SQL 查询、数据挖掘等,用户可以在同一个应用中无缝结合使用这些能力。
Spark 的特点如下:
通过分布式内存计算和 DAG(无回路有向图)执行引擎提升数据处理能力,比 MapReduce 性能高 10 倍到 100 倍。
提供多种语言开发接口(Scala/Java/Python),并且提供几十种高度抽象算子,可以很方便构建分布式的数据处理应用。
结合 SQL、Streaming、MLlib、GraphX 等形成数据处理栈,提供一站式数据处理能力。
完美契合 Hadoop 生态环境,Spark 应用可以运行在 Standalone、Mesos 或者 YARN 上,能够接入 HDFS、HBase、Hive 等多种数据源,支持 MapReduce 程序平滑转接。
Spark 生态系统
Shark :Shark 基本上就是在 Spark 的框架基础上提供和 Hive 一样的 HiveQL 命令接口,为了最大程度的保持和 Hive 的 兼容性 ,Shark 使用了 Hive 的 API 来实现 query Parsing 和 Logic Plan generation,最后的 PhysicalPlan execution 阶段用 Spark 代替 Hadoop MapReduce 。通过配置 Shark 参数,Shark 可以自动在内存中缓存特定的 RDD,实现数据重用,进而加快特定数据集的检索。同时,Shark 通过 UDF 用户自定义函数实现特定的数据分析学习算法,使得 SQL 数据查询和运算分析能结合在一起,最大化 RDD 的重复使用。
SparkR :SparkR 是一个为 R 提供了轻量级的 Spark 前端的 R 包。 SparkR 提供了一个分布式的 data frame 数据结构,解决了 R 中的 data frame 只能在单机中使用的瓶颈,它和 R 中的 data frame 一样支持许多操作,比如 select,filter,aggregate 等等。(类似 dplyr 包中的功能)这很好的解决了 R 的大数据级瓶颈问题。 SparkR 也支持分布式的机器学习算法,比如使用 MLib 机器学习库。SparkR 为 Spark 引入了 R 语言社区的活力,吸引了大量的数据科学家开始在 Spark 平台上直接开始数据分析之旅。
版本演变
Spark2x 版本相对于 Spark 1.5 版本新增了一些开源特性。具体特性或相关概念如下:
- DataSet,详见 SparkSQL 和 DataSet 原理 。
- Spark SQL Native DDL/DML,详见 SparkSQL 和 DataSet 原理 。
- SparkSession,详见 SparkSession 原理 。
- Structured Streaming,详见 Structured Streaming 原理 。
- 小文件优化。
- 聚合算法优化。
- Datasource 表优化。
- 合并 CBO 优化。
Spark 演进时间表
演进时间表:
- 2009 年由 Berkeley's AMPLab 开始编写最初的源代码
- 2010 年开放源代码
- 2013 年 6 月进入 Apache 孵化器项目
- 2014 年 2 月成为 Apache 的较高级项目(8 个月时间)
- 2014 年 5 月底 Spark1.0.0 发布
- 2014 年 9 月 Spark1.1.0 发布
- 2014 年 12 月 Spark1.2.0 发布
目前情况 :
目前已经有 30+公司 100+开发者在提交代码
Hadoop 较大的厂商 Cloudera 宣称加大 Spark 框架的投入来取代 Mapreduce
Hortonworks
Hadoop 厂商 MapR 投入 Spark 阵营
Apache Mahout 放弃 MapReduce,将使用 Spark 作为后续算子的计算平台
Spark 架构
图 Spark 架构
表 1 基本概念说明
模块 | 说明 |
---|---|
Cluster Manager | 集群管理器,管理集群中的资源。Spark 支持多种集群管理器,Spark 自带的 Standalone 集群管理器、Mesos 或 YARN。华为 Spark 集群默认采用 YARN 模式。 |
Application | Spark 应用,由一个 Driver Program 和多个 Executor 组成。 |
Deploy Mode | 部署模式,分为 cluster 和 client 模式。cluster 模式下,Driver 会在集群内的节点运行;而在 client 模式下,Driver 在客户端运行(集群外)。 |
Driver Program | 是 Spark 应用程序的主进程,运行 Application 的 main() 函数并创建 SparkContext。负责应用程序的解析、生成 Stage 并调度 Task 到 Executor 上。通常 SparkContext 代表 Driver Program。 |
Executor | 在 Work Node 上启动的进程,用来执行 Task,管理并处理应用中使用到的数据。一个 Spark 应用一般包含多个 Executor,每个 Executor 接收 Driver 的命令,并执行一到多个 Task。 在 Spark on Yarn 模式下,其进程名称为 CoarseGrainedExecutor Backend。 |
Worker Node | 集群中负责启动并管理 Executor 以及资源的节点。 在 Standalone 模式中指的是通过 slave 文件配置的 Worker 节点,在 Spark on Yarn 模式下就是 NoteManager 节点。 |
Job | 一个 Action 算子(比如 collect 算子)对应一个 Job,由并行计算的多个 Task 组成。 |
Stage | 每个 Job 由多个 Stage 组成,每个 Stage 是一个 Task 集合,由 DAG 分割而成。 |
Task | 承载业务逻辑的运算单元,是 Spark 平台中可执行的最小工作单元。一个应用根据执行计划以及计算量分为多个 Task。 |
Job、Task 和 Stage
- Task: 被送到某个 Executor 上的工作单元,但 hadoopMR 中的 MapTask 和 ReduceTask 概念一样,是运行 Application 的基本单位,多个 Task 组成一个 Stage,而 Task 的调度和管理等是由 TaskScheduler 负责
- Job: 包含多个 Task 组成的并行计算,往往由 Spark Action 触发生成, 一个 Application 中往往会产生多个 Job
- Stage: 每个 Job 会被拆分成多组 Task, 作为一个 TaskSet, 其名称为 Stage,Stage 的划分和调度是有 DAGScheduler 来负责的,Stage 有非最终的 Stage(Shuffle Map Stage)和最终的 Stage(Result Stage)两种,Stage 的边界就是发生 shuffle 的地方。
Spark 的应用运行架构如 图 2 所示,运行流程如下所示:
- 应用程序(Application)是作为一个进程的集合运行在集群上的,由 Driver 进行协调。
- 在运行一个应用时,Driver 会去连接集群管理器(Standalone、Mesos、YARN)申请运行 Executor 资源,并启动 ExecutorBackend。然后由集群管理器在不同的应用之间调度资源。Driver 同时会启动应用程序 DAG 调度、Stage 划分、Task 生 成。
- 然后 Spark 会把应用的代码(传递给 SparkContext 的 JAR 或者 Python 定义的代码)发送到 Executor 上。
- 所有的 Task 执行完成后,用户的应用程序运行结束。
图 Spark 应用运行架构
Spark 采用 Master 和 worker 的模式,如 图 3 所示。用户在 Spark 客户端提交应用程序,调度器将 Job 分解为多个 Task 发送到各个 Worker 中执行,各个 Worker 将计算的结果上报给 Driver(即 Master),Driver 聚合结果返回给客户端。
图 Spark 的 Master 和 Worker
在此结构中,有几个说明点:
- 应用之间是独立的。
每个应用有自己的 executor 进程,Executor 启动多个线程,并行地执行任务。无论是在调度方面,或者是 executor 方面。各个 Driver 独立调度自己的任务;不同的应用任务运行在不同的 JVM 上,即不同的 Executor。
- 不同 Spark 应用之间是不共享数据的,除非把数据存储在外部的存储系统上(比如 HDFS)。
- 因为 Driver 程序在集群上调度任务,所以 Driver 程序最好和 worker 节点比较近,比如在一个相同的局部网络内。
图 12 spark 应用架构分层示意图
说明:
- Spark Core:包含 Spark 的基本功能;尤其是定义 RDD 的 API、操作以及这两者上的动作。其他 Spark 的库都是构建在 RDD 和 Spark Core 之上的
- Spark SQL:提供通过 Apache Hive 的 SQL 变体 Hive 查询语言(HiveQL)与 Spark 进行交互的 API。每个数据库表被当做一个 RDD,Spark SQL 查询被转换为 Spark 操作。
- Spark Streaming:对实时数据流进行处理和控制。Spark Streaming 允许程序能够像普通 RDD 一样处理实时数据
- MLlib:一个常用机器学习算法库,算法被实现为对 RDD 的 Spark 操作。这个库包含可扩展的学习算法,比如分类、回归等需要对大量数据集进行迭代的操作。
- GraphX:控制图、并行图操作和计算的一组算法和工具的集合。GraphX 扩展了 RDD API,包含控制图、创建子图、访问路径上所有顶点的操作。
与组件的关系
Spark 和 HDFS 的配合关系
通常,Spark 中计算的数据可以来自多个数据源,如 Local File、HDFS 等。最常用的是 HDFS,用户可以一次读取大规模的数据进行并行计算。在计算完成后,也可以将数据存储到 HDFS。
分解来看,Spark 分成控制端(Driver) 和执行端(Executor)。控制端负责任务调度,执行端负责任务执行。
读取文件的过程如 图 1 所示。
图 读取文件过程
读取文件步骤的详细描述如下所示:
- Driver 与 HDFS 交互获取 File A 的文件信息。
- HDFS 返回该文件具体的 Blocks 信息。
- Driver 根据具体的 Block 数据量,决定一个并行度,创建多个 Task 去读取这些文件 Block。
- 在 Executor 端执行 Task 并读取具体的 Block,作为 RDD(弹性分布数据集) 的一部分。
写入文件的过程如 图 2 所示。
图 Spark 写入文件过程
HDFS 文件写入的详细步骤如下所示:
- Driver 创建要写入文件的目录。
- 根据 RDD 分区分块情况,计算出写数据的 Task 数,并下发这些任务到 Executor。
- Executor 执行这些 Task,将具体 RDD 的数据写入到步骤 1 创建的目录下。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论