最佳做法:群集配置

创建和配置群集时,可以使用 Azure Databricks 提供的许多选项,以最低的成本获得最佳性能。 但这种灵活性在你尝试确定工作负载的最佳配置时可能会带来挑战。 创建新群集或配置现有群集时,请仔细考虑用户如何使用群集会有助于指导配置选项。 确定配置选项时要考虑的一些事项包括:

  • 什么类型的用户将使用群集? 与数据工程师或数据分析师相比,数据科学家可能运行具有不同要求的不同作业类型。
  • 用户会在群集上运行哪些类型的工作负载? 例如,批量提取、转换和加载 (ETL) 作业的要求可能与分析工作负载不同。
  • 你需要满足哪一级别的服务级别协议 (SLA)?
  • 你有哪些预算限制?

本文根据这些注意事项针对不同方案提供群集配置建议。 本文还将讨论 Azure Databricks 群集的特定功能以及关于这些功能的注意事项。

配置决策需要在成本和性能之间进行权衡。 群集的主要成本包括群集使用的 Databricks 单位 (DBU),以及运行群集所需的基础资源成本。 次要成本可能不太明显,例如未满足 SLA 所造成的业务成本、员工效率的下降或由于控制不当而可能造成的资源浪费。

群集功能

在讨论更详细的群集配置方案之前,请务必了解 Azure Databricks 群集的某些功能,以及如何最好地使用这些功能。

通用群集和作业群集

创建群集时,请选择群集类型:通用群集或作业群集。 通用群集可以由多个用户共享,并且最适合用于执行即席分析、数据浏览或开发。 实现处理并准备好操作代码后,请转为在作业群集上运行它。 作业结束时,作业群集将终止,从而减少资源使用和成本。

群集模式

在“创建群集”UI 的顶部,你可以选择你希望群集是“多节点”还是“单节点”。

单节点群集适用于使用少量数据或非分布式工作负载(例如单节点机器学习库)的作业。 多节点群集适用于具有分布式工作负荷的较大作业。

按需实例

为了节省成本,Azure Databricks 支持使用按需实例创建群集。

自动缩放

注意

计算自动缩放在缩减结构化流式处理工作负载的群集大小方面存在限制。 Databricks 建议将增量实时表与增强式自动缩放用于流式处理工作负载。 请参阅什么是增强型自动缩放?

自动缩放允许群集根据工作负载自动调整大小。 从成本和性能的角度来看,自动缩放可使许多用例和方案受益,但就何时以及如何使用自动缩放可能具有挑战性。 以下是确定是否使用自动缩放以及如何充分利用此功能的一些注意事项:

  • 与固定大小的群集相比,自动缩放通常可降低成本。
  • 与预配过低的固定大小的群集相比,自动缩放工作负载的运行速度更快。
  • 某些工作负载与自动缩放群集不兼容,包括 spark-submit 作业和某些 Python 包。
  • 对于单一用户通用群集,当最小工作器数量设置得过低时,用户可能会发现自动缩放会减慢他们的开发或分析速度。 这是因为它们运行的​​命令或查询通常相隔几分钟,在此期间群集处于空闲状态并且可能会纵向缩减以节省成本。 执行下一个命令时,群集管理器将尝试纵向扩展,需要花费几分钟时间从云提供程序检索实例。 在此期间,作业可能会在资源不足的情况下运行,从而缩短检索结果的时间。 虽然增加工作器的最小数量有所帮助,但同时也会增加成本。 这是需要平衡成本和性能的另一个示例。
  • 如果使用了增量缓存,请务必记住,一旦节点终止,节点上的所有缓存数据都将丢失。 如果保留缓存数据对工作负载很重要,请考虑使用固定大小的群集。
  • 如果有运行 ETL 工作负载的作业群集,并且知道作业不太可能发生变化,则优化时有时可以适当调整群集的大小。 但如果数据大小增加,可利用自动缩放灵活进行处理。 另外,值得注意的是,如果群集未充分利用或正在等待来自其他进程的结果,则优化后的自动缩放可减少长时间运行作业的支出。 不过,当群集尝试适当地进行扩展时,作业可能会出现轻微延迟。 如果作业有严格的 SLA,固定大小的群集可能是更好的选择,或者考虑使用 Azure Databricks 来减少群集启动时间。

Azure Databricks 还支持自动缩放本地存储。 自动缩放本地存储时,Azure Databricks 会监视群集的 Spark 工作器上提供的可用磁盘空间量。 如果工作器开始出现磁盘空间不足的情况,则 Azure Databricks 会在该工作器的磁盘空间耗尽之前自动将新的托管卷附加到该工作器。

创建池通过维护一组随时可用的实例来缩短群集启动和纵向扩展的时间。 Databricks 建议利用池来改善处理时间,同时最大限度地降低成本。

Databricks Runtime 版本

Databricks 建议使用适用于通用群集的最新 Databricks Runtime 版本。 使用最新版本可确保代码和预加载包之间的最新优化和兼容性。

对于运行操作工作负载的作业群集,请考虑使用长期支持 (LTS) Databricks Runtime 版本。 使用 LTS 版本可确保不会遇到兼容性问题,并且可以在升级之前全面测试工作负载。 如果你有围绕机器学习的高级用例,可以考虑使用专用 Databricks Runtime 版本。

群集策略

Azure Databricks 群集策略允许管理员强制控制群集的创建和配置。 Databricks 建议使用群集策略来帮助应用本指南中讨论的建议。

自动终止

许多用户在使用完群集后,不会想到终止群集。 幸运的是,集群会在设定的时间段(默认为 120 分钟)后自动终止。

创建群集策略时,管理员可以更改此默认设置。 减少默认时间设置可以减少群集处于空闲状态的时间,从而降低成本。 请务必记住,终止群集时,所有状态都将丢失,包括所有变量、临时表、缓存、函数、对象等。 群集重新启动时,所有这些状态都需要还原。 如果开发人员出去休息 30 分钟,那么花同样多的时间让笔记本恢复到之前的状态会很浪费时间。

重要

空闲群集在终止之前的不活动期间会继续累积 DBU 和云实例费用。

垃圾回收

尽管可能没有本文讨论的其他注意事项那么明显,但请注意,垃圾回收可以帮助优化群集上的作业性能。 提供大量 RAM 有助于提高作业效率,但也可能导致在垃圾回收过程中出现延迟。

若要最大程度地减少长时间的垃圾回收清理的影响,请避免在部署群集时为每个实例配置大量的 RAM。 为执行器分配更多的 RAM 将导致更长的垃圾回收时间。 相反,如果作业需要更多内存,则可配置 RAM 大小更小的实例,并部署更多实例。 但是,在某些情况下,建议使用更少的节点和更多的 RAM,例如,需要大量随机操作的工作负载,如调整群集大小的注意事项中所述。

群集访问控制

你可以配置两种类型的群集权限:

  • “允许创建群集”权限控制用户创建群集的能力。
  • 群集级别的权限可控制使用和修改特定群集的能力。

若要了解有关配置群集权限的详细信息,请参阅群集访问控制

只要具有群集创建权限或有权访问群集策略,就可创建群集,这使你可以在策略规范内创建任何群集。 群集创建者即是所有者并且拥有“可管理”权限,他们能够在群集的数据访问权限的约束下与任何其他用户共享。

在针对常见方案决定群集配置时,了解群集权限和群集策略非常重要。

群集标记

可使用群集标记轻松地监视组织中不同组所使用的云资源的成本。 你可以在创建群集时将标记指定为键值字符串,Azure Databricks 会将这些标记应用于云资源。 请参阅通过策略进行标记实施,了解有关标记实施的详细信息。

群集大小调整时的注意事项

Azure Databricks 每个工作器节点运行一个执行程序。 因此,“执行程序”和“工作器”这两个术语可在 Azure Databricks 体系结构的上下文中互换使用。 人们通常将群集大小与工作器数量相关联,但需要考虑其他一些重要因素:

  • 执行程序的内核总数(计算):所有执行程序的内核总数。 这决定了群集的最大并行度。
  • 执行程序的总内存量:所有执行程序的 RAM 总量。 这决定了在将数据溢写到磁盘之前,内存中可以存储的数据量。
  • 执行程序本地存储:本地磁盘存储的类型和数量。 本地磁盘主要用于在随机操作和缓存期间发生溢写的情况。

其他注意事项包括工作器实例类型和大小,这也会影响上述因素。 调整群集大小时,请考虑以下事项:

  • 工作负载将消耗多少数据?
  • 工作负载的计算复杂性如何?
  • 从何处读取数据?
  • 数据在外部存储中是如何分区的?
  • 需要多少并行度?

回答这些问题有助于根据工作负载确定最佳群集配置。 对于仅使用窄依赖(每个输入分区仅贡献一个输出分区的转换)的简单 ETL 样式工作负载,请专注于计算优化配置。 如果预计会进行大量随机操作,则内存量以及考虑到数据溢写的存储量很重要。 在大量随机操作工作负载期间,在计算机之间传输数据时,减少大型实例数可以减少网络 I/O。

工作器数量与工作器实例类型的大小之间存在平衡。 具有两个工作器(每个工作器具有 40 个内核和 100 GB RAM)的群集的计算和内存与具有 10 个内核和 25 GB RAM 的 8 个工作器群集相同。

如果想要多次重新读取相同的数据,则工作负载可能会受益于缓存。 请考虑使用增量缓存的存储优化配置。

调整群集大小的示例

以下示例显示特定类型的工作负载的群集建议。 这些示例还包括要避免的配置,以及这些配置不适用于工作负载类型的原因。

数据分析

数据分析师通常执行需要来自多个分区的数据的处理,从而导致许多随机操作。 节点数较少的群集可以减少执行这些随机操作所需的网络和磁盘 I/O。 下图中的群集 A 可能是最佳选择,尤其是对于支持单个分析师的群集。

群集 D 提供的性能可能最差,因为内存和存储较少的大量节点将需要更多随机数据才能完成处理。

Data analysis cluster sizing

分析工作负载可能需要重复读取相同的数据,因此建议的工作器类型在启用了增量缓存后进行了存储优化。

建议用于分析工作负载的其他功能包括:

  • 启用自动终止,确保群集在处于非活动状态一段时间后终止。
  • 请考虑根据分析师的典型工作负载启用自动缩放。
  • 请考虑使用池,这样可以将群集限制为预先批准的实例类型,并确保一致的群集配置。

可能没有用的功能:

  • 存储自动缩放,因为此用户可能不会生成大量数据。
  • “非隔离共享”群集和“共享”群集,因为此群集适用于单个用户。

基本批处理 ETL

不需要进行太多转换(例如联接或聚合)的简单批处理 ETL 作业通常会受益于经过计算优化的群集。 对于这些类型的工作负载,下图中的任一群集都可能是可接受的。

Basic batch ETL cluster sizing

建议使用计算优化工作器类型;它们成本会更便宜,并且这些工作负载可能不需要大量内存或存储。

对于支持简单 ETL 作业的群集,可能适合使用池,因为它可以减少群集启动时间以及运行作业管道时的总运行时。 但是,由于这些类型的工作负载通常作为计划作业运行,而群集只有运行足够长的时间才能完成作业,因此使用池可能不是你的最佳选项。

以下功能可能没有用:

  • 增量缓存,因为不需要重新读取数据。
  • 可能不需要自动终止,因为这些可能是计划的作业。
  • 不建议使用自动缩放,因为应为用例预配置计算和存储。
  • “非隔离共享”群集和“共享”群集适用于多用户,对运行单个作业的群集没有好处。

复杂批处理 ETL

更复杂的 ETL 作业(例如,需要跨多个表进行联合和联接的处理)可能在可以最小化随机数据量时性能最佳。 由于减少群集中的工作器数量有助于最小化随机操作,因此,应考虑下图中较小的群集(如群集 A)而不是较大的群集(如群集 D)。

Complex ETL cluster sizing

复杂的转换可能是计算密集型的,因此对于一些达到最佳内核数的工作负载,可能需要向群集添加额外的节点。

与简单的 ETL 作业一样,推荐使用计算优化的工作器类型;它们更便宜,并且这些工作负载可能不需要大量内存或存储。 此外,与简单的 ETL 作业一样,要考虑的主要群集功能是池,以减少群集启动时间和运行作业管道时的总运行时。

以下功能可能没有用:

  • 增量缓存,因为不需要重新读取数据。
  • 可能不需要自动终止,因为这些可能是计划的作业。
  • 不建议使用自动缩放,因为应为用例预配置计算和存储。
  • “非隔离共享”群集和“共享”群集适用于多用户,对运行单个作业的群集没有好处。

训练机器学习模型

由于训练机器学习模型的初始迭代通常是实验性的,因此较小的群集(如群集 A)是一个不错的选择。 较小的群集还可降低随机操作的影响。

如果担心稳定性,或者针对更高级的阶段,较大的群集(如群集 B 或 C)可能是一个不错的选择。

不建议使用群集 D 等大型群集,因为节点之间的数据混用开销很大。

Machine learning cluster sizing

推荐的工作器类型是启用了增量缓存的存储优化,以说明对相同数据的重复读取并启用训练数据的缓存。 如果存储优化节点提供的计算和存储选项不足,请考虑使用 GPU 优化节点。 一个缺点可能在于这些节点缺乏增量缓存支持。

建议用于机器学习工作负载的其他功能包括:

  • 启用自动终止,确保群集在处于非活动状态一段时间后终止。
  • 使用池,这样可以将群集限制为预先批准的实例类型,并确保一致的群集配置。

可能没有用的功能:

  • 自动缩放,因为在群集纵向缩减时删除节点,缓存的数据可能会丢失。 此外,典型的机器学习作业通常会消耗所有可用的节点,在这种情况下,自动缩放不会带来任何好处。
  • 存储自动缩放,因为此用户可能不会生成大量数据。
  • “非隔离共享”群集和“共享”群集,因为此群集适用于单个用户。

常见方案

以下部分提供有关为常见群集使用模式配置群集的其他建议:

  • 运行数据分析和即席处理的多个用户。
  • 机器学习等专用用例。
  • 支持计划的批处理作业。

多用户群集

场景

你需要为多个用户提供数据访问权限,以运行数据分析和即席查询。 群集使用情况可能会随着时间的推移而波动,并且大多数作业不会消耗大量资源。 用户主要要求对数据进行只读访问,并想要通过简单的用户界面执行分析或创建仪表板。

为群集配置推荐一种混合方法,用于群集中的节点预配和自动缩放。 此方法包括定义群集的按需实例数,并在最小和最大实例数量之间启用自动缩放。

Multi-user scenario

默认情况下,此群集始终可用,并且由组内用户共享。 启用自动缩放可以让群集根据负载进行纵向扩展和纵向缩减。

用户没有启动/停止群集的访问权限,但初始按需实例可立即响应用户查询。

Azure Databricks 具有其他功能,可进一步改进多租户用例:

此方法通过以下方式降低总体成本:

  • 使用共享群集模型。

  • 使用自动缩放来避免为未充分利用的群集付费。

专用工作负载

场景

你需要为组织内的专用用例或团队(例如,运行复杂数据探索和机器学习算法的数据科学家)提供群集。 一个典型的模式是,用户在短时间内需要一个群集来运行分析。

对于此类工作负载,最佳方法是为默认、固定和设置范围创建具有预定义配置的群集策略。 这些设置可能包括实例数、实例类型、现成与按需实例、角色、要安装的库等。 使用群集策略,让具有更高需求的用户快速启动群集,他们可以根据用例的需要进行配置,并强制执行成本和策略合规性。

Specialized workloads

这种方法为用户提供了更多控制权,同时通过预定义群集配置来保持控制成本的能力。 这也让你可以为具有访问不同数据集权限的不同用户组配置群集。

此方法的一个缺点是,用户必须与管理员合作才能对群集(例如配置、已安装的库等)进行任何更改。

批处理工作负载

场景

你需要为计划的批处理作业(例如执行数据准备的生产 ETL 作业)提供群集。 建议的最佳做法是针对每个作业运行启动一个新群集。 在新群集上运行每个作业有助于避免由运行在共享群集上的其他工作负载导致的故障和错过的 SLA。 根据作业的关键级别,可以使用所有按需实例来满足 SLA,或在现成实例和按需实例之间保持平衡,以节省成本。

Scheduled batch workloads