Apache Spark
Apache Spark 是一种快速、通用的大规模数据处理引擎,它支持在分布式计算集群上进行批处理、流处理和机器学习等多种工作负载。Spark 最初由加州大学伯克利分校的AMPLab 开发,现在是 Apache 软件基金会的一个顶级项目。
Spark 的主要特点包括:
- 速度快:Spark 在内存计算和基于 DAG 的引擎等方面的优化,使其比 Hadoop MapReduce 更快,可以处理更多的数据。
- 易用性好:Spark 提供了简单易用的 API,可以用 Java、Scala、Python 和 R 等多种编程语言编写 Spark 应用程序。
- 灵活性高:Spark 可以运行在各种环境中,包括独立的集群、Hadoop YARN、Apache Mesos 和 Kubernetes 等。
- 支持多种工作负载:除了批处理和流处理,Spark 还支持机器学习、图处理和 SQL 查询等多种工作负载。
- 支持多种数据源和格式:Spark 可以处理多种数据源和格式,包括 Hadoop Distributed File System (HDFS)、Apache Cassandra、Apache HBase、Amazon S3 和 Apache Parquet 等。
总之,Spark 是一个功能强大且易于使用的数据处理引擎,可以加速许多大规模数据处理任务。
Spark VS Hadoop
特征 | Spark | Hadoop |
---|---|---|
数据处理模型 | RDD(弹性分布式数据集) | MapReduce |
计算模型 | 内存计算和磁盘计算 | 磁盘计算 |
实时处理 | 支持实时流处理 | 不支持实时流处理 |
执行速度 | 较快 | 较慢 |
适用场景 | 迭代式计算、机器学习、图计算等需要频繁交互的场景 | 大批量离线数据处理场景 |
数据读写 | 支持多种数据源、数据格式和数据存储方式 | 支持多种数据源、数据格式和数据存储方式 |
集群管理 | 可以与多种集群管理工具(如YARN、Mesos、Kubernetes等)集成 | 使用Hadoop自带的YARN作为集群管理工具 |
需要注意的是,Spark 和 Hadoop 并不是完全的竞争关系,它们可以在不同的场景下互补使用。例如,在大规模离线数据处理场景下,可以使用 Hadoop 技术栈(包括 HDFS、MapReduce、Hive 等);在需要快速迭代计算、机器学习等场景下,可以使用 Spark 技术栈(包括 Spark Core、Spark SQL、Spark Streaming、MLlib 等)。
Spark集成Hadoop集成
Spark 可以与 Hadoop 集成,通过 Hadoop 的 HDFS 文件系统和 YARN 资源管理器来运行 Spark 应用程序。这种集成方式可以让用户利用 Hadoop 集群中的计算和存储资源来运行 Spark 应用程序,从而更加高效地进行数据处理。
Spark 和 Hadoop 的关系可以从以下几个方面来描述:
-
Hadoop 是一个生态系统,包括 HDFS、MapReduce、YARN 等组件,用于存储和处理大数据。而 Spark 则是一个数据处理引擎,可以在 Hadoop 的生态系统中使用,也可以独立部署。
-
Spark 可以利用 Hadoop 的 HDFS 文件系统来读取和写入数据,同时也可以利用 Hadoop 的 YARN 资源管理器来调度和管理 Spark 应用程序。
-
Spark 和 Hadoop 不同的编程模型和数据处理方式,使得 Spark 可以处理更加复杂的数据处理场景,并且速度更快。
from pyspark import SparkContext, SparkConf conf = SparkConf().setAppName("WordCount").setMaster("yarn") sc = SparkContext(conf=conf) # 读取 HDFS 文件系统中的文件 file = sc.textFile("hdfs://localhost:9000/input/text.txt") # 对文件中的单词进行计数 word_counts = file.flatMap(lambda line: line.split(" ")) \ .map(lambda word: (word, 1)) \ .reduceByKey(lambda a, b: a + b) # 将结果写入 HDFS 文件系统 word_counts.saveAsTextFile("hdfs://localhost:9000/output/word_count") # 关闭 SparkContext sc.stop()
在这个示例代码中,我们首先创建了一个 SparkConf 对象,设置了应用程序的名称和运行模式(yarn)。然后使用 SparkContext 对象读取 HDFS 文件系统中的文件,并对文件中的单词进行计数。最后,将结果写入 HDFS 文件系统,并关闭 SparkContext 对象。
需要注意的是,这个示例代码需要在安装了 Hadoop 集群和 Spark 集群的环境中运行。同时,需要将 Hadoop 集群的配置文件拷贝到 Spark 集群中,以便 Spark 可以正确地访问 HDFS 文件系统和 YARN 资源管理器。
Spark的运行架构
组件 | 描述 |
---|---|
Spark Application | 用户编写的Spark程序,包括Driver Program和运行在Executor上的Task。 |
Cluster Manager | 负责管理集群资源,为Executor分配资源并启动Executor进程。支持的Cluster Manager包括Standalone、YARN和Mesos。 |
Executor | 运行在集群节点上的进程,负责具体的任务执行。 |
Task Scheduler | 负责将TaskSet中的任务发送给已启动的Executor。 |
RDD | 弹性分布式数据集,是Spark的基本数据模型。RDD支持多种操作,例如transformation和action操作。 |
以上是Spark的运行架构中的主要组件及其描述。在Spark运行过程中,这些组件相互协作,实现了Spark的分布式计算功能。
Spark组件
组件 | 说明 |
---|---|
Spark Core | 提供基本的函数式编程 API 和 RDD 用于存储数据。负责任务调度、内存管理。 |
Spark SQL | 处理结构化数据的组件,支持 SQL queries、DataFrames 和 Datasets。可以与 Hive 交互。 |
Spark Streaming | 扩展 Spark 批处理能力,支持实时流数据处理。 |
MLlib | 用于机器学习算法的库,提供分类、聚类、推荐等算法。 |
其他组件:
- GraphX:处理图形与顶点数据
- SparkR:R 语言绑定
- Hive Context:与 Hive 交互
- PySpark:Python 绑定
总的来说:
- Spark Core 是核心组件,提供基础功能。
- Spark SQL、Streaming 和 MLlib 是主要的功能扩展,用于结构化数据、流数据和机器学习。
- 其他组件提供特定功能,方便与其他系统交互。
Spark部署方式
部署方式 | 概念 | 优点 | 缺点 | 应用场景 |
---|---|---|---|---|
Standalone 模式 | 使用 Spark 自己的Master 节点调度和Worker 节点执行任务 | - 部署简单- 性能高- 管理开销低 | - 不易扩展到大规模集群 | - 中小型集群 - 独立部署 |
YARN 模式 | 使用 Hadoop YARN 作为资源管理器 | - 可以扩展到大规模集群- 可以整合HDFS 等Hadoop组件 | - 管理开销相对较高 | - 大型集群 - 需要与Hadoop整合 |
Mesos 模式 | 使用 Apache Mesos 作为资源管理器 | - 与 Mesos Framework 无缝集成- 资源利用率高 | - 相对复杂一些 | - Mesos集群 |
Spark节点
Spark 应用程序由 driver 节点和多个 worker 节点组成。
driver 节点:
- 运行 Spark app 的主程序代码。
- 负责作业提交、上下文环境创建、资源分配、任务分发等。
driver资源分配与Yarn的关系
- 当 Spark 在 YARN 的管理下运行时(YARN mode),driver 节点不再负责资源分配。
- 这时资源分配由 YARN 管理,具体来说是:
- driver 节点向 YARN 申请 executors(执行节点)。
- YARN 根据资源可用性,在集群中分配 executor 实例。
- YARN 将这些 executors 的信息返回给 driver 节点。
- driver 节点仍负责环境配置、任务分发、结果汇总等工作。但不再分配资源。
- executor 相当于 worker 节点,执行分配给它们的 tasks 并返回结果。
所以总的来说:
- 当 Spark 在 Standalone 模式下运行时,driver 节点负责资源分配。
- 当 Spark 在 YARN 模式下运行时,由 YARN 负责资源分配。driver 只需申请 executors 即可。
- driver 节点的其他工作(环境配置、任务分发、结果汇总)不变。
- executor实例相当于worker节点,执行tasks并返回结果。
- 与用户交互,接受用户输入参数和执行任务。
worker 节点:
- 执行分配给它们的任务。
- 提供计算能力和内存存储。
工作流程:
-
用户在 driver 节点上提交 Spark 应用。
-
driver 创建执行环境上下文、配置参数。
-
driver 与 worker 节点建立连接,注册信息。
-
driver 将 RDD 和任务(函数、操作)分发给 worker 节点。
-
每个 worker 节点执行分配给它们的任务。
-
worker 节点执行结果返回给 driver 节点。
-
driver 节点将所有结果汇总,返回给用户应用程序。
st=>start: 用户提交应用
op1=>operation: Driver 创建执行环境
op2=>operation: Driver 与 Workers 连接注册
op3=>operation: Driver 分发 tasks 到 Workers
op4=>operation: Workers 执行分配到的 tasks
op5=>operation: Workers 返回结果给 Driver
op6=>operation: Driver 汇总结果,返回给应用
e=>end
st->op1->op2->op3->op4->op5->op6->e
总的来说:
- driver 节点跟用户交互,负责任务提交、分配和 orchestrate 。
- worker 节点提供计算与存储资源,执行分配给它们的任务。
- driver 将任务分发给 worker,worker 执行任务并返回结果。
- 通过这种机制,RDD任务得到高效的均衡分布执行。
Executor
Executor 是 Spark 中负责执行任务的工作进程。
它与 Worker 节点的概念类似,但 Executor 更准确一些。主要区别是:
- Worker 节点对应 Standalone 模式中的一台计算机,提供计算和存储资源。
- Executor 是 YARN 模式中分配给 Spark app 的一个任务Slot。它对应一个 JVM 进程。
具体来说,Executor 有以下特点和作用:
-
Executor 是一个 JVM 进程,负责执行分配给它的任务 (Tasks) 。
-
Executor 与 Driver 节点通过长连接或消息队列进行通信。
-
Executor 通过心跳保持与 Driver 节点的连接,重启后可以从之前的任务中恢复。
-
Driver 可以动态增加或者减少 Executor 的数量,来应对workload的变化。
-
Executor 负责在其本地的内存中执行和缓存 RDD 所对应的任务。
所以可以总结:
Executor 是 Spark cluster 中 真正执行任务的进程。
它对应一个 JVM 进程,可以执行分配给它的多个 tasks 。
通过让 Driver 可以动态增加或者减少 Executor 的数量,来实现 Spark 任务高效运行。
总结
组件 | 含义 | 关系 | 作用 |
---|---|---|---|
SparkApplication | 一个Spark应用 | 提交一个或多个Job | 完成用户业务任务 |
SparkContext | Spark应用的入口 | 管理一个或多个Job | 处理数据和运行任务 |
Job | Spark负责调度和执行的最高级工作单元 | 由一个SparkContext提交 | 完成一件工作 |
Stage | 多个任务的逻辑划分 | 多个Stage构成一个Job | 将任务进行分组 |
Task | 可以独立运行的工作单元 | 一个Stage由一个或多个Task组成 | 执行转换操作 |
TaskSet | Task的集合 | 执行相同transformation | 优化内存和网络使用 |
TaskScheduler | 任务调度器 | 管理Stage和Task | 确保Task高效运行 |
Executor | 执行一个或多个Task | 由Driver分配和管理 | 执行真正的任务 |
Driver | 一个程序 | 负责编排和协调整个应用 | 协调Executor和任务 |
Worker | 提供计算和存储资源 | 一个或多个Executor运行其上 | 执行Task |
总结:
-
Application 提交 Job -> SparkContext 管理 Job -> Job 分解为 Stage -> Stage 分为 Task -> Task 执行于 Executor 上。
-
TaskScheduler 负责调度 Stage 和 Task 以用于 Executor。
-
Driver 负责编排整个应用,调度 Executor 和任务。
-
Worker 提供资源运行 Executor,间接执行 Task。