Apache Spark 是一个功能强大的开源处理引擎,最初由 Matei Zaharia 在加州大学伯克利分校攻读博士学位期间开发。Spark 的第一个版本于 2012 年发布。自那以后,在 2013 年,Zaharia 联合创立并成为了 Databricks 的首席技术官;他同时也在斯坦福大学担任教授职位,此前他在麻省理工学院工作。与此同时,Spark 的代码库捐赠给了 Apache 软件基金会,并成为其旗舰项目。
Apache Spark 是一个快速且易于使用的框架,它允许您解决各种复杂的数据问题,无论是半结构化、结构化、流式处理还是机器学习/数据科学问题。它还成为了大数据领域最大的开源社区之一,拥有来自 250 多家组织的 1000 多名贡献者,以及遍布全球 570 多个地点的 30 万名 Spark Meetup 社区成员。
我们将提供一个入门指南,帮助您理解 Apache Spark。我们将解释 Spark 作业和 API 背后的概念,介绍 Spark 2.0 架构,并探索 Spark 2.0 的特性。
涵盖的主题包括:
• 什么是 Apache Spark?
• Spark 作业和 API
• 弹性分布式数据集(RDDs)、DataFrames 和 Datasets 的回顾
• Catalyst 优化器和 Project Tungsten 的回顾
• Spark 2.0 架构的回顾
Apache Spark是什么?
Apache Spark 是一个开源的强大分布式查询和处理引擎。它提供了 MapReduce 的灵活性和可扩展性,但速度显著提高:当数据存储在内存中时,比 Apache Hadoop 快 100 倍,访问磁盘时快 10 倍。
Apache Spark 允许用户读取、转换和聚合数据,以及轻松地训练和部署复杂的统计模型。Spark API 可以在 Java、Scala、Python、R 和 SQL 中访问。Apache Spark 可用于构建应用程序或将其打包为库,以便在集群上部署或通过笔记本(例如 Jupyter、Spark-Notebook、Databricks 笔记本和 Apache Zeppelin)进行快速交互式分析。
Apache Spark 向数据分析师、数据科学家或研究人员暴露了大量熟悉的库,他们曾使用过 Python 的 pandas 或 R 的 data.frames 或 data.tables。需要注意的是,尽管 Spark DataFrames 对 pandas 或 data.frames / data.tables 用户来说会很熟悉,但存在一些差异,因此请调整您的期望。具有更多 SQL 背景的用户也可以使用该语言来塑造他们的数据。此外,Apache Spark 还提供了一些已经实现并调整过的算法、统计模型和框架:MLlib 和 ML 用于机器学习,GraphX 和 GraphFrames 用于图处理,以及 Spark Streaming(DStreams 和 Structured)。Spark 允许用户在同一应用程序中无缝组合这些库。
Apache Spark 可以轻松地在本地笔记本电脑上运行,也可以轻松地以独立模式部署,在 YARN 或 Apache Mesos 上 - 无论是在您的本地集群还是云端。它可以从多种数据源读取和写入数据,包括(但不限于)HDFS、Apache Cassandra、Apache HBase 和 S3。
Spark Jobs and APIs
在本节中,我们将提供 Apache Spark 作业和 API 的简短概述。这为随后关于 Spark 2.0 架构的部分提供了必要的基础。
执行过程
任何 Spark 应用程序都会在主节点上启动一个单一的驱动程序进程(其中可以包含多个作业),然后该驱动程序进程指导分布在多个工作节点上的执行程序进程(包含多个任务),如下图所示:
驱动程序进程根据给定作业生成的图确定指向执行节点的任务进程的数量和组成。请注意,任何工作节点都可以执行来自多个不同作业的任务。
一个 Spark 作业与一个对象依赖链相关联,这些依赖以有向无环图(DAG)的形式组织,例如以下从 Spark UI 生成的示例。鉴于此,Spark 可以优化调度(例如,确定所需的任务和工作节点数量)以及这些任务的执行:
弹性分布式数据集
Apache Spark 是围绕一个分布式的不可变 Java 虚拟机(JVM)对象集合构建的,这些对象被称为弹性分布式数据集(简称 RDD)。由于我们使用的是 Python,重要的是要注意 Python 数据存储在这些 JVM 对象中。关于这一点,我们将在后续关于 RDD 和 DataFrames 的章节中进行更详细的讨论。这些对象允许任何作业非常快速地执行计算。RDD 针对数据进行计算、缓存和存储在内存中:这种方案与像 Apache Hadoop 这样的其他传统分布式框架相比,计算速度快了几个数量级。
同时,RDD 公开了一些粗粒度的转换操作(例如 map(...), reduce(...), 和 filter(...),我们将在 "弹性分布式数据集" 中更详细地介绍),保持了 Hadoop 平台的灵活性和可扩展性,以执行各种计算。RDD 并行应用和记录数据转换,从而既提高了速度又增强了容错性。通过注册转换操作,RDD 提供了数据血统 - 一种每个中间步骤的祖先树形式,以图的形式存在。这实际上保护了 RDD 免受数据丢失 - 如果 RDD 的一个分区丢失了,它仍然有足够的信息来重新创建该分区,而不是仅仅依赖于复制。
RDD 有两组并行操作:转换(返回新 RDD 的指针)和动作(在运行计算后将值返回给驱动程序);我们将在后续更详细地介绍这些内容。
RDD 转换操作在某种意义上是懒的,它们不会立即计算结果。转换只在执行动作并且需要将结果返回给驱动程序时才计算。这种延迟执行可以进行更精细的查询优化:为性能优化的查询。这种优化从 Apache Spark 的 DAGScheduler 开始 - 一个面向阶段的调度器,使用阶段转换,如前一屏幕截图所示。通过拥有单独的 RDD 转换和动作,DAGScheduler 可以在查询中执行优化,包括能够避免数据洗牌(最资源密集的任务)。
有关 DAGScheduler 和优化(特别是关于窄依赖或宽依赖)的更多信息,一个很好的参考是《高性能 Spark》第 5 章 "有效转换" 中的 "窄与宽转换"
DataFrames
像 RDDs 一样,DataFrames 是分布在集群节点中的不可变数据集合。然而,与 RDDs 不同的是,在 DataFrames 中数据被组织成名为列的形式。
DataFrames 被设计为使大型数据集的处理更加容易。它们允许开发者正式定义数据的结构,允许更高层次的抽象;在这个意义上,DataFrames 类似于关系数据库世界中的表格。DataFrames 提供了一个特定领域的语言 API 来操作分布式数据,并使 Spark 更加易于更广泛的受众使用,不仅限于专业的数据工程师。
DataFrames 的一个主要好处是 Spark 引擎最初构建了一个逻辑执行计划,并根据成本优化器确定的物理计划执行生成的代码。与在 Python 中可能比 Java 或 Scala 显著慢的 RDDs 不同,DataFrames 的引入带来了所有语言的性能一致性。
版权归原作者 水木流年追梦 所有, 如有侵权,请联系我们删除。