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 的开发体验更加直观和高效。
弹性分布式数据集(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 进行数据处理。