返回介绍

3.1 简介

发布于 2024-09-23 22:27:22 字数 9852 浏览 0 评论 0 收藏 0

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 版本新增了一些开源特性。具体特性或相关概念如下:

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 架构

image-20191205205024732

图 Spark 架构

表 1 基本概念说明

模块说明
Cluster Manager集群管理器,管理集群中的资源。Spark 支持多种集群管理器,Spark 自带的 Standalone 集群管理器、Mesos 或 YARN。华为 Spark 集群默认采用 YARN 模式。
ApplicationSpark 应用,由一个 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 所示,运行流程如下所示:

  1. 应用程序(Application)是作为一个进程的集合运行在集群上的,由 Driver 进行协调。
  2. 在运行一个应用时,Driver 会去连接集群管理器(Standalone、Mesos、YARN)申请运行 Executor 资源,并启动 ExecutorBackend。然后由集群管理器在不同的应用之间调度资源。Driver 同时会启动应用程序 DAG 调度、Stage 划分、Task 生 成。
  3. 然后 Spark 会把应用的代码(传递给 SparkContext 的 JAR 或者 Python 定义的代码)发送到 Executor 上。
  4. 所有的 Task 执行完成后,用户的应用程序运行结束。

image-20191205205050853

图 Spark 应用运行架构

Spark 采用 Master 和 worker 的模式,如 图 3 所示。用户在 Spark 客户端提交应用程序,调度器将 Job 分解为多个 Task 发送到各个 Worker 中执行,各个 Worker 将计算的结果上报给 Driver(即 Master),Driver 聚合结果返回给客户端。

image-20191205205108273

图 Spark 的 Master 和 Worker

在此结构中,有几个说明点:

  • 应用之间是独立的。

每个应用有自己的 executor 进程,Executor 启动多个线程,并行地执行任务。无论是在调度方面,或者是 executor 方面。各个 Driver 独立调度自己的任务;不同的应用任务运行在不同的 JVM 上,即不同的 Executor。

  • 不同 Spark 应用之间是不共享数据的,除非把数据存储在外部的存储系统上(比如 HDFS)。
  • 因为 Driver 程序在集群上调度任务,所以 Driver 程序最好和 worker 节点比较近,比如在一个相同的局部网络内。

image-20191205205128251

图 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 所示。

image-20191205205151125

图 读取文件过程

读取文件步骤的详细描述如下所示:

  1. Driver 与 HDFS 交互获取 File A 的文件信息。
  2. HDFS 返回该文件具体的 Blocks 信息。
  3. Driver 根据具体的 Block 数据量,决定一个并行度,创建多个 Task 去读取这些文件 Block。
  4. 在 Executor 端执行 Task 并读取具体的 Block,作为 RDD(弹性分布数据集) 的一部分。

写入文件的过程如 图 2 所示。

image-20191205205214931

图 Spark 写入文件过程

HDFS 文件写入的详细步骤如下所示:

  1. Driver 创建要写入文件的目录。
  2. 根据 RDD 分区分块情况,计算出写数据的 Task 数,并下发这些任务到 Executor。
  3. Executor 执行这些 Task,将具体 RDD 的数据写入到步骤 1 创建的目录下。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文