Logo
Section 1 / 2

Spark 入门

了解 Apache Spark。

检查点

Spark 入门

了解 Apache Spark。

Apache Spark

Apache Spark 是一个用于大数据的计算引擎及工具栈。它具备流处理、数据查询、机器学习(Spark MLlib)以及图计算(GraphX)等功能。

Spark 以 Scala 开发,同时也提供了 Python、Java、SQL 和 R 的编程接口。

Spark 完全依赖内存中的数据处理,这使其性能相比 Hadoop 的相应功能提升了数十倍甚至上百倍。

MapReduce 与 Spark 对比

随着 Spark 的出现,MapReduce 框架逐渐退居次要地位,主要原因如下:

  • 迭代任务:某些机器学习算法需要对数据集进行多次遍历才能得出结果。每次遍历都可以表示为一个独立的 MapReduce 任务。然而,每个任务都需要从磁盘读取输入数据,并将输出写入磁盘供下一个任务读取。当涉及磁盘 I/O 时,执行时间会显著增加,而如果数据直接来自主内存,则效率高得多。

  • 交互式分析:用户可以使用 Hive 或 Pig 等工具对大规模数据集运行临时 SQL 查询。如果用户针对同一数据集发出多个查询,每个查询都可能对应一个 MapReduce 任务,重复从磁盘读取相同的数据并进行处理。多个 MapReduce 任务重复读取同一数据集,不仅效率低下,还会大幅增加查询延迟。

  • 丰富的 API:Spark 提供了多种功能强大的 API,能够用更少的代码简洁表达原本在 MapReduce 中需要大量代码才能实现的操作。相比 MapReduce,使用 Spark 的开发体验更加直观和高效。

...
MapReduce vs. Spark Processing

弹性分布式数据集(RDD)

RDD 是 Spark 的核心抽象概念。它是一个容错的数据集合(例如输入中的元素),支持并行处理。

初始化 RDD 的最基本方式如下:

1from pyspark import SparkContext 2sc = SparkContext("local", "MyApp") 3 4data = [1, 2, 3, 4, 5] 5distributed_data = sc.parallelize(data)

打印该对象时,显示如下:

1print(distributed_data) 2ParallelCollectionRDD[0] at readRDDFromFile at PythonRDD.scala:274 3 4print(type(distributed_data)) 5<class 'pyspark.rdd.RDD'>

RDD 的特性

  • 弹性(Resilient):这意味着 RDD 具备容错能力,能够在节点故障导致部分数据丢失或损坏时自动恢复。这种自我修复机制依赖于 RDD 的血统图(lineage graph),我们将在后续内容中详细讲解。RDD 会记录自身生成过程的历史路径,从而能够回溯并重新计算任何丢失的分区。

  • 分布式(Distributed):RDD 中的数据被分布存储在集群中的多台机器上。

  • 数据集(Datasets):指我们所处理的数据记录的表示形式。外部数据可通过多种方式加载,如 JSON 文件、CSV 文件、文本文件,或通过 JDBC 连接数据库。

为何从 Hadoop 转向 Spark

如果你正在使用 Hadoop 并希望提升数据处理能力,迁移到 Spark 可能是一个明智的选择。

当然,迁移本身需要投入时间和精力。以下是几个值得迁移的重要理由:

  • Spark 在内存中完成数据处理,速度远超 Hadoop MapReduce,通常可快达数十倍甚至百倍以上。Spark 声称其性能最高可达 Hadoop MapReduce 的 100 倍。

  • 项目生态成熟,拥有高质量的文档、课程和书籍资源,有助于你正确高效地使用 Spark。

  • 相比于 MapReduce 仅限于处理文本流,Spark 提供了多种高级抽象,其中最常用的是 RDD。

  • 几乎所有与数据相关的操作都可以在 Spark 中完成。如前所述,Spark 支持流处理、机器学习、数据查询和图计算。同时,也可以通过底层 RDD 实现任意复杂的数据转换。

  • 提供交互式数据处理环境——Spark Shell。就像你在 Python shell 中快速测试代码一样,你也可以在 spark-shell 中交互式地编写和调试 Spark 作业。

Quiz

单选题

False: Spark 不使用 MapReduce 进行数据处理。

1 / 2

流式处理

Spark 的流行程度