spark是什么意思

题图来自Unsplash,基于CC0协议
导读
Spark是一个开源的大数据处理框架,它最初由加州伯克利大学 AMPLab 提出,后来成为 Apache 软基(Top-level Apache Project)。 它设计用于快速、高效的进行大规模数据处理,尤其在速度上相比磁盘为主的 Hadoop 生态体系有很大提升。 即使不了解细节的人,或许也隐约知道 Spark 可以帮助处理“海量数据处理”。
定义和特点
在字面上理解,Spark 让我们可以在单机或分布式集群上,通过简单的 Scala、Java、Python 或 SQL 代码,实现分布式大规模数据的批量处理、实时流处理、分析查询、机器学习等。
它的几个主要特点是:
- 速度快:这是 Spark 最突出的特点。因为它主要将中间过程的数据存储在内存中(称为 RDD,弹性分布式数据集),而不是像早期的大数据处理框架那样全依赖磁盘 IO,所以极大地减少了读写磁盘的开销,计算效率大大提高,特别是在迭代算法和交互式查询场景下效果显著。
- 易于使用:提供了多种高级抽象,如 RDD、DataFrame、Dataset 和 Spark SQL。开发人员可以用熟悉的编程语言(如 Java, Scala, Python, R)编写简洁的代码,相比基于 Map/Reduce 的方式,开发复杂的数据处理逻辑要简单得多。
- 通用性强:不仅支持批处理,还集成了流处理、复杂事件处理、机器学习(MLlib)、图计算(GraphX)等多种计算模式,能够满足各种大数据应用的需求。
- 运行灵活:可以运行在多种集群管理器上,如 Standalone、YARN、Mesos 或 Kubernetes。
- 商业界推动强:相较于从学术界起步的 Hadoop 生态,Spark 早期更多受到商业巨头(如 Databricks、Cloudera、 Hortonworks)的支持和投入,社区发展迅速,很多易用性的改进和商业特性的加入,使其在工业界尤其受到欢迎。
Apache Spark 是什么
更准确地说,Apache Spark 是 Hadoop 生态系统中一个构建在 YARN 或 Standalone 集群管理器上的开源大数据处理引擎。它包含一个核心计算引擎 Core(对所有计算都提供支持,转换代码为中间代码)。在其上方构建了多个组件:
- Spark Core:包含分布式任务调度、集群资源管理和 RDD (Resilient Distributed Dataset) 的基础功能。RDD 是 Spark 最核心的抽象,代表一个可以并行操作的不可变分布式数据集。
- Spark SQL:用于处理结构化和半结构化数据,可以通过 SQL、Dataset API 或 DataFrame API 查询。支持多种数据源,并能与其他数据库进行兼容。
- Spark Streaming:提供基于微批次(micro-batching)或甚至是精确一次处理(Exactly-Once Processing,需特定版本)的流处理能力,能够近实时地处理数据流。
- MLlib:Spark 内建的分布式机器学习库,包含常用算法(如分类、回归、聚类、协同过滤)和工具(如特征转换、特征选择、管道)。
- GraphX:用于图结构数据处理的框架,允许在分布式节点和边之上进行图计算和分析。
简单说,Apache Spark 就是一个功能强大、灵活且易于开发的大数据处理平台,它能帮助我们高效地存储和处理海量数据,并从中挖掘价值。
Spark 与 Hadoop 的区别
尽管 Spark 频繁和 Hadoop 并列,但它并非 Hadoop 生态的一部分(尽管它可以运行在 YARN 上),而且它们的核心理念和架构有很大不同。以下是它们的主要区别:
-
数据处理模式:
- Hadoop (MapReduce):传统的批量处理模式,每次计算基本都要从磁盘读取数据,写入中间结果,然后读取磁盘上的中间结果进行下一步计算。这种磁盘依赖模式限制了其速度,尤其不适合迭代算法和交互式查询。它的操作模式是 Map(映射)和 Reduce(规约)两种原始操作的组合。
- Spark:它以基于内存的计算(虽然在早期版本和某些情况下会溢出到磁盘,但内存访问远快于磁盘)为核心理念。将数据加载到内存中的分布式 RDD、DataFrame 或 Dataset 后,后续的处理步骤可以直接在内存上操作,大大减少了反复读写磁盘的开销,使得操作速度得到了显著的提升,对 Lambda 架构下的流处理和复杂批处理任务提供了更统一的处理方式。
-
抽象和 API:
- Hadoop MapReduce:引入了 Map 和 Reduce 两种转换操作。主要基于 Java 编写,函数式编程能力较弱,编写复杂逻辑相对繁琐。通常需要编写大量的序列化相关的代码。
- Spark:提供了更高层次的抽象,如 RDD、DataFrame、Dataset。
- RDD:分块的、可并行处理的数据集合,具有容错能力,通过血统(lineage)进行恢复。
- DataFrame:带有模式(schema)和结构化数据的对象,可以将 SQL 查询或 DataFrame API 代码编译成本地代码以实现高性能。同时提供多种语言的 API,并支持与 Hadoop 存储系统交互。
- Dataset:类型安全的、序列化的数据集合,Spark 提供了多种高级编程语言 API(Spark SQL, Spark Streaming, MLlib, GraphX 的一部分),其特征在于类型安全(编译时检查)和强序列化支持。
-
速度:
- Hadoop MapReduce:受限于磁盘 IO 和 JVM 垃圾回收,速度相对较慢。不适合需要多次迭代的数据处理(如机器学习训练)。
- Spark:在内存操作下,其速度远超 MapReduce,无需在每一步都序列化/反序列化(虽然基于 RDD 的长时间运行需要写回到磁盘,DataFrame/Dataset 有时会通过代码生成和 Tungsten 引擎进行优化来提升性能)。
-
MLlib 区别:
- Hadoop 生态:包含 Mahout 机器学习库。使用前需要熟悉 HDFS 和 YARN,并且 Mahout 集成到 MapReduce 模型中。
- Spark MLlib:更加全面和现代的分布式机器学习库。它统一了批量学习、流处理学习、特征工程、模型评估等功能。通常集成度更高,API 更友好,与 Spark 生态集成更紧密,对于某些算法的实现和优化也更为先进。
-
运行环境:
- Hadoop 和 Spark 都可以运行在 Standalone、YARN、Mesos 等集群管理器上。
Spark 用于哪些大数据处理场景
由于其强大的性能和灵活性,Spark 在大数据领域得到了广泛的应用。主要场景包括:
-
批量数据处理:
- 大规模离线数据分析报告生成。
- 数据仓库构建或数据湖的 ETL。
- 订单处理、用户行为日志分析。
- 数据清洗、转换和预处理。
- 数据拼接、整合。
- 即席查询(Ad-hoc Querying)。
-
实时流式处理:
- DStreams(Spark Streaming 的基本单位)允许处理来自 Kafka、Flume、Kinesis、TCP Socket 等来源的实时数据流。
- 实时监控、指标统计、预警系统。
- 实时推荐(如基于最近行为推荐)。
- 实时聊天机器人或搜索引擎。
- 实时业务度量(如用户活动跟踪)。
-
交互式查询和 Ad-hoc 查询:
- 提供 SQL 接口 Spark SQL 和 Hive 兼容的 HiveQL,可以通过 Impala 等方式与 Hive 进行整合。
- 类似于 Impala,但对大规模数据集更有效,能够快速响应用户提交的即席查询。更适合分析师在终端查看数据信息。
-
机器学习与 AI:
- 提供了 Spark MLlib 库,包含大量标准算法:
- 聚类:K-Means, DBSCAN
- 分类与回归:逻辑回归、决策树、随机森林、梯度提升树、线性回归、逻辑回归等
- 特征工程:特征转换、选择、降维、PCA 等
- Pipelines: 模型训练流程整合
- 提供了 Spark MLlib 库,包含大量标准算法:
-
图计算与图分析:
- Spark GraphX:用于在大量节点和边上建模,执行如 Pregel 模型计算的图计算框架,适用于社交网络分析、链接预测、社区发现等场景。
-
数据挖掘:
- 利用 Spark 处理海量和多维度的数据,进行模式识别、关联规则挖掘等。
-
实时欺诈检测:
- 结合数据流处理、机器学习模型和内存计算,实时检测临界的、高价值的欺诈行为。
Spark 的版本历史
Apache Spark 的发展史相对较短,但更新迅速,也在不断进化。主要版本迭代大致如下:
- 早期概念:由 Matei Zaharia 等人在伯克利大学 AMPLab 开发,最初作为加州大学伯克利分校的一个内部项目,内部名为 Spark,并以 Berkeley Spark 项目开源。
- Incubating 阶段:Spark 在 2013 年成为 Apache 软件基金会的孵化项目 (Incubator)。此阶段,核心的设计和功能得到了扎实的发展,社区也开始形成。
- 毕业:在广泛的应用和社区贡献后,Spark 于 2014 年 6 月正式毕业成为顶级项目 (Top-level Apache Project)。这是 Spark 生态快速发展的里程碑。
- 各种 Minor 版本迭代:从 1.x 到 2.x,再到 3.x,每个大版本周期(通常 3-5 个 Minor 版本)代表了 Spark 一个比较稳定的长期版本周期,同时进行优化和修复。例如,Spark 3.0 引入了 Catalyst Optimizer 重构、Auto Loader、Delta Lake 集成等重大特性。
- 3.x 系列:这是当前最广泛使用的稳定版系列。例如,3.5.0 是目前最新的 LTS(长期支持)版本,带来了如 Tableau JDBC 连接器集成、改进的 SQL 查询 Catalyst 优化器(Catalyst 4 层优化)、Delta Lake 对多集群写作的支持等等。
- 对不同平台的支持:各个版本也一直在支持更多更广泛的语言和平台,如 Python 很早就支持,Java, Scala 语言原生支持稳定,R 相对少用但存在,还支持诸如 Livy 这样的远程交互接口,以及更广泛的与其他数据处理框架(如 Presto,Trino)整合。
总的来说,Spark 从一个小项目迅速成长为大数据领域不可或缺的主流引擎,其发展速度和社区活力,还在持续地为分布式计算技术带来革新。