了解 Spark

已完成

若要更好地了解如何在 Azure Databricks 中使用 Apache Spark 处理和分析数据,请务必了解底层体系结构。

高层次概述

从较高层面来说,Azure Databricks 服务在 Azure 订阅中启动和管理 Apache Spark 群集。 Apache Spark 群集是一组计算机,它们被视为单台计算机并处理从笔记本发出的命令的执行。 通过群集可处理要跨多台计算机并行化的数据,以提高规模和性能。 它们由 Spark 驱动程序节点和工作器节点组成。 驱动程序节点将工作发送到工作器节点,并指示它们从指定数据源中拉取数据。

在 Databricks 中,笔记本接口通常是驱动程序。 此驱动程序包含程序的主循环,并在群集上创建分布式数据集,然后将操作应用于这些数据集。 驱动程序通过 SparkSession 对象访问 Apache Spark,而不考虑部署位置。

Diagram of an example Apache Spark cluster, consisting of a Driver node and four worker nodes.

Microsoft Azure 管理群集,并根据使用情况和配置群集时所用的设置,在需要时自动缩放群集。 还可以启用自动终止功能,使 Azure 可以在非活动状态达到指定分钟数后终止群集。

Spark 作业详细信息

提交到群集的工作会根据需要拆分为多个独立作业。 这是在群集节点间分布工作的方式。 作业会进一步细分为任务。 作业的输入划分为一个或多个分区。 这些分区是每个槽的工作单元。 在任务之间,可能需要重新组织分区并通过网络进行共享。

Spark 高性能的秘诀是并行性。 垂直缩放(通过向单一计算机添加资源)受限于有限数量的 RAM、线程和 CPU 速度;但群集水平缩放,根据需要向群集添加新节点。

Spark 在两个级别上并行化作业:

  • 第一级并行化是执行程序 - 在工作器节点上运行的 Java 虚拟机 (JVM),通常是每个节点一个实例。
  • 第二级并行化是槽 - 其数量由每个节点的核心与 CPU 数量确定。
  • 每个执行程序具有多个槽,并行化任务可以分配到这些槽。

Diagram of Spark cluster with tasks.

JVM 天然是多线程的,但是单个 JVM(如驱动程序上协调工作的 JVM)具有有限的上限。 通过将工作拆分为多个任务,驱动程序可以将工作单元分配给工作器节点上执行程序中的 *槽,以实现并行执行。 此外,驱动程序决定如何划分数据,以便可以分布数据来进行并行处理。 因此,驱动程序向每个任务分配一个数据分区,以便每个任务都知道要处理的数据片段。 启动后,每个任务都会提取分配给它的数据分区。

作业和阶段

根据正在执行的工作,可能需要多个并行作业。 每个作业分为多个阶段。 可将该作业类比为建造房子:

  • 第一阶段是打好地基。
  • 第二个阶段是砌墙。
  • 第三阶段是建造屋顶。

尝试不按顺序执行这些步骤是没有意义的,并且实际上也不可行。 同样,Spark 将每项工作分成多个阶段,确保一切都按正确顺序执行。