通过 Azure Databricks 上的缓存优化性能

Azure Databricks 使用磁盘缓存来加速数据读取,为此,它会使用快速中间数据格式在节点的本地存储中创建远程 Parquet 数据文件的副本。 必须从远程位置提取文件时,会自动缓存数据。 然后在本地连续读取上述数据,这会显著提高读取速度。 缓存适用于所有 Parquet 数据文件(包括 Delta Lake 表)。

注意

在 SQL 仓库和 Databricks Runtime 14.2 及更高版本中,CACHE SELECT 命令被忽略。 改用增强的磁盘缓存算法。

增量缓存已重命名为磁盘缓存

Azure Databricks 上的磁盘缓存以前称为增量缓存和 DBIO 缓存。 磁盘缓存行为是 Azure Databricks 的一项专有功能。 此名称更改旨在解决它是 Delta Lake 协议的一部分的混淆。

磁盘缓存与Spark 缓存

Azure Databricks 磁盘缓存不同于 Apache Spark 缓存。 Azure Databricks 建议使用自动磁盘缓存。

下表汇总了磁盘缓存与 Apache Spark 缓存之间的主要差别,以方便你选择最适合你的工作流的工具:

功能 磁盘缓存 Apache Spark 缓存
存储格式 工作器节点上的本地文件。 内存中块,但取决于存储级别。
适用对象 ABFS 和其他文件系统上存储的任何 Parquet 表。 任何数据帧或 RDD。
触发 自动执行,第一次读取时(如果启用了缓存)。 手动执行,需要更改代码。
已评估 惰性。 惰性。
可用性 可以使用配置标志启用或禁用,在某些节点类型上默认已启用。 始终可用。
逐出 以 LRU 方式或在更改任何文件时自动执行,重启群集时手动执行。 以 LRU 方式自动执行,使用 unpersist 手动执行。

磁盘缓存一致性

磁盘缓存自动检测何时创建、删除、修改或覆盖了数据文件,并相应地更新其内容。 可以写入、修改和删除表格数据,并且无需显式地使缓存数据无效。 所有过时项都将自动失效,并从缓存中逐出。

选择实例类型以使用磁盘缓存

建议的(也是最简单的)磁盘缓存使用方法是在配置群集时选择使用 SSD 卷的工作器类型。 为磁盘缓存启用并配置此类工作器。

将磁盘缓存配置为最多使用工作器节点随附的本地 SSD 的一半可用空间。 有关配置选项,请参阅配置磁盘缓存

配置磁盘缓存

Azure Databricks 建议为计算选择缓存加速的工作器实例类型。 以最佳方式自动为磁盘缓存配置了此类实例。

注意

当工作器被停用时,存储在该工作器上的 Spark 缓存将丢失。 因此,如果启用了自动缩放,则缓存存在一些不稳定。 然后,Spark 需要根据需要从源中重新读取丢失的分区。

配置磁盘使用率

若要配置磁盘缓存使用工作器节点本地存储的方式,请在创建群集时指定以下 Spark 配置设置:

  • spark.databricks.io.cache.maxDiskUsage:每个节点为缓存数据预留的磁盘空间(以字节为单位)
  • spark.databricks.io.cache.maxMetaDataCache:每个节点为缓存元数据预留的磁盘空间(以字节为单位)
  • spark.databricks.io.cache.compression.enabled:是否应以压缩格式存储缓存数据

示例配置:

spark.databricks.io.cache.maxDiskUsage 50g
spark.databricks.io.cache.maxMetaDataCache 1g
spark.databricks.io.cache.compression.enabled false

启用或禁用磁盘缓存

若要启用和禁用磁盘缓存,请运行:

spark.conf.set("spark.databricks.io.cache.enabled", "[true | false]")

禁用缓存不会删除本地存储中已有的数据。 相反,它会阻止查询向缓存添加新数据,以及从缓存读取数据。