主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

Apache Spark 基础知识

Apache® Spark™ 是一种用于大规模数据处理的快速通用引擎。

每个 Spark 应用程序都包含一个驱动程序,用于管理应用程序在集群上的执行。启用 Spark 集群上的工作进程被称为执行器。驱动进程在这些执行器上运行用户代码。

在典型的 Spark 应用程序中,您的代码将建立一个 SparkContext,从外部数据创建一个弹性分布式数据集 (RDD),然后在该 RDD 上执行称为转换操作的方法以得出分析结果。

RDD 是 Spark 中的主要编程抽象,表示分布在集群节点上的不可变元素集合,可以并行操作。Spark 应用程序可以在单台计算机或集群上本地运行。

Spark 主要用 Scala® 编写,并具有其他编程语言的 API,包括 MATLAB®。Spark 的 MATLAB API 向 MATLAB 公开了 Spark 编程模型,并支持 MATLAB 实现众多 Spark 函数。许多 Spark 函数的 MATLAB 实现都接受函数句柄或匿名函数作为输入来执行各种类型的分析。

针对 Spark 运行

针对 Spark 运行意味着使用受支持的集群管理器针对启用 Spark 的集群执行应用程序。集群可以是本地的,也可以是在网络上的。您可以通过两种方式针对 Spark 运行:

  • 在连接到 Spark 交互式 shell 中执行命令。

  • 针对 Spark 集群创建并执行独立应用程序

使用交互式 shell 时,Spark 允许您与分布在多台计算机上的磁盘或内存中 Spark 数据进行交互并执行临时分析。Spark 负责在各种计算机之间进行底层工作分配。交互式 shell 仅适用于 Python® 和 Scala。

MATLAB Compiler™ 中的 Spark MATLAB API 提供了类似于 Spark shell 的交互式 shell,允许您在部署应用程序之前对其进行调试。交互式 shell 仅针对本地集群运行。

针对 Spark 创建和执行独立应用程序时,应用程序首先被打包或编译为独立应用程序,然后才能针对启用 Spark 集群执行。您可以使用 Scala、Java®、Python 和 MATLAB 编写独立应用程序。

MATLAB Compiler 中用于 Spark 的 MATLAB API 允许您创建可针对 Spark 运行的独立应用程序。

Spark 支持的集群管理器

本地

本地集群管理器代表一个伪集群,在单台计算机上以非分布式模式工作。您可以将其配置为使用一个工作进程线程,或者在多核计算机上使用多个工作进程线程。在应用中,它用单词 local 表示。

注意

MATLAB API for Spark 允许您以交互方式调试应用程序,仅适用于本地集群管理器。

独立

Spark 附带一个独立集群管理器。它由一个 master 和多个工作进程组成。要使用独立集群管理器,请在每个集群节点上放置一个 Spark 的编译版本。可以使用 Spark 提供的脚本启动独立集群管理器。在应用程序中,它表示为:spark://host:port。默认端口号是 7077

注意

Spark 附带的独立集群管理器不应与可针对 Spark 运行的独立应用程序混淆。MATLABMATLABCompiler 不支持独立集群管理器。

YARN

Hadoop® 2.0 中引入了 YARN 集群管理器。它通常安装在与 HDFS™ 相同的节点上。因此,在 YARN 上运行 Spark 可以让 Spark 轻松访问 HDFS 数据。在应用程序中,它使用术语 yarn 来表示。在 YARN 上启动应用程序时有两种可用的模式:

  • yarn-client 模式下,driver 运行在 client 进程中,application master 仅用于向 YARN 请求资源。

  • yarn-cluster 模式下,Spark 驱动在集群上由 YARN 管理的应用程序主进程内运行,客户端可以在启动应用程序后退出。

注意

MATLAB Compiler 仅在 yarn-client 模式下支持 YARN 集群管理器。

Mesos

Mesos 集群管理器是由 Apache 开发的开源集群管理器。在应用中,通常表示为:mesos://host:port。默认端口号是 5050

注意

MATLAB Compiler 不支持 Mesos 集群管理器。

您可以使用下表查看每个集群管理器支持哪个 MATLAB Compiler 部署选项。

针对 Spark 选项进行部署本地集群 (local)Hadoop 集群 (yarn-client)

部署包含高大数组的独立应用程序

不支持。

支持。

部署使用 MATLAB API for Spark 创建的独立应用程序。

支持。

支持。

使用 Spark 的 MATLAB API 以交互方式调试您的应用程序。

支持。

不支持。

SparkHadoop 之间的关系

只有当您想在安装了 Hadoop 集群上运行 Spark 时,Spark 和 Hadoop 之间的关系才会发挥作用。否则,您不需要 Hadoop 来运行 Spark。

要在集群上运行 Spark,您需要一个共享文件系统。Hadoop 集群通过 HDFS 和 YARN 形式的集群管理器提供对分布式文件系统的访问。Spark 可以使用 Spark 作为集群管理器来分配工作,并使用 HDFS 来访问数据。另外,一些 Spark 应用程序可以使用 Hadoop 的 MapReduce 编程模型,但是 MapReduce 并不构成 Spark 中的核心编程模型。

无需 Hadoop 即可在集群上运行 Spark。您还可以使用其他选项,例如 Mesos。

注意

MATLAB Compiler 中的部署选项目前仅支持针对启用 Spark 的 Hadoop 集群进行部署。

驱动

每个 Spark 应用程序都包含一个驱动程序,用于启动集群上的各种操作。驱动是程序的 main() 方法运行的进程。驱动进程运行用户代码,创建 SparkContext、创建 RDD 并执行转换和操作。当 Spark 驱动执行时,它会执行两项任务:

  • 将用户程序转换为任务。

    Spark 驱动应用程序负责将用户程序转换为称为任务的物理执行单元。任务是 Spark 中最小的工作单元。

  • 对执行器安排任务。

    Spark 驱动尝试根据数据放置位置将每个任务安排在适当的位置。它还跟踪缓存数据的位置,并使用它来安排访问该数据的未来任务。

一旦驱动终止,应用程序就完成。

注意

MATLAB Compiler 中使用 MATLAB API for Spark 时,MATLAB 应用程序代码将成为 Spark 驱动。

执行器

Spark 执行器是一个工作进程进程,负责运行给定 Spark 作业中的各个任务。执行器在 Spark 应用程序开始时启动,并在应用程序的整个生命周期内持续存在。执行器扮演两个角色:

  • 运行组成应用程序的任务,并将结果返回给驱动。

  • 为用户程序缓存的 RDD 提供内存存储。

RDD

弹性分布式数据集RDD 是 Spark 中的编程抽象。它表示分布在许多节点上并可并行操作的元素集合。RDD 往往具有容错性。您可以通过下面两种方式创建 RDD:

  • 通过加载外部数据集。

  • 通过并行化驱动程序中的对象集合。

创建后,您可以使用 RDD 执行两种类型的操作:转换 (transformations)操作 (actions)

变换

转换是对现有 RDD 的操作,返回新的 RDD。许多(但不是全部)转换都是逐元素操作。

操作

操作根据 RDD 计算最终结果,并将该结果返回给驱动或将其保存到外部存储系统,如 HDFS。

区分变换和动作

检查返回数据类型。转换返回 RDD,而操作返回其他数据类型。

SparkConf

SparkConf 存储部署到 Spark 的应用程序的配置参数。每个应用程序在部署到 Spark 集群之前都必须进行配置。一些配置参数定义了应用程序的属性,一些被 Spark 用于在集群上分配资源。配置参数通过 SparkContext 传递到 Spark 集群。

SparkContext

SparkContext 表示与 Spark 集群的连接。它是 Spark 的入口点,并设置与 Spark 执行环境建立连接所需的内部服务。