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

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

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

Azure Databricks 上的磁盘缓存以前称为增量缓存和 DBIO 缓存。 磁盘缓存行为是 Azure Databricks 的一项专有功能。 此名称更改旨在解决它是 Delta Lake 协议的一部分的混淆。 此重命名后行为保持不变,如下所述。

自动和手动缓存

Azure Databricks 磁盘缓存不同于 Apache Spark 缓存。 Azure Databricks 建议对大多数操作使用自动磁盘缓存。

启用磁盘缓存后,必须从远程源提取的数据会自动添加到该缓存。 此过程完全透明,无需任何操作。 但若要预先将数据预加载到缓存,可以使用 CACHE SELECT 命令(请参阅CACHE SELECT)。 使用 Spark 缓存时,必须手动指定要缓存的表和查询。

磁盘缓存包含远程数据的本地副本。 它可以提高各种查询的性能,但不能用于存储任意子查询的结果。 Spark 缓存可以存储任何子查询数据的结果,以及以非 Parquet 格式(例如 CSV、JSON 和 ORC)存储的数据。

与 Spark 缓存中的数据相比,读取和操作磁盘缓存中的数据速度更快。 原因在于,磁盘缓存使用的是高效的解压缩算法,并以最佳格式输出数据,从而使用全阶段代码生成进行进一步处理。

与 Spark 缓存不同,磁盘缓存不使用系统内存。 由于新式 SSD 读取速度较快,因此磁盘缓存可以完全驻留于磁盘,并且不会对其性能产生负面影响。

总结

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

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

磁盘缓存一致性

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

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

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

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

缓存一部分数据

若要显式选择要缓存的数据子集,请使用以下语法:

CACHE SELECT column_name[, column_name, ...] FROM [db_name.]table_name [ WHERE boolean_expression ]

无需使用此命令即可正常使用磁盘缓存(首次访问时会自动缓存数据)。 但如果需要查询性能保持一致,它可能会有所帮助。

有关示例和详细信息,请参阅

配置磁盘缓存

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]")

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