通过缓存优化性能

Delta缓存通过使用快速中间数据格式在节点的本地存储中创建远程文件的副本来加速数据读取。每当需要从远程位置获取文件时,数据都会自动缓存。然后在本地的连续读取上述数据,从而显著提高读取速度。

说明

详细内容可参考Databricks官网文章:通过缓存优化性能

Delta缓存支持读取DBFS、HDFS、azureblob存储、azuredatalake存储Gen1和azuredatalake存储Gen2中的Parquet文件。它不支持其他存储格式,如CSV、JSON和ORC。

注意

Delta缓存适用于所有Parquet文件,并且不仅限于Delta Lake格式的文件。

Delta和Apache Spark缓存

Databricks提供两种类型的缓存:增量缓存和Apache Spark缓存。这是每种类型的特征:

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

  • 性能:Delta缓存中存储的数据比Spark缓存中的数据读取和操作速度更快。这是因为Delta缓存使用高效的解压算法,并以最佳格式输出数据,以便使用整个阶段的代码生成进行进一步处理。

  • 自动与手动控制:启用Delta缓存时,必须从远程源获取的数据将自动添加到缓存中。这个过程是完全透明的,不需要任何操作。但是,要预先将数据预加载到缓存中,可以使用cache命令(请参见缓存数据的子集)。使用Spark缓存时,必须手动指定要缓存的表和查询。

  • 磁盘与基于内存:Delta缓存完全存储在本地磁盘上,这样就不会从Spark中的其他操作中占用内存。由于现代固态硬盘的高读取速度,Delta缓存可以完全驻留在磁盘上,而不会对其性能产生负面影响。相反,Spark缓存使用内存。

注意

您可以同时使用Delta缓存和Apache Spark缓存。

概要

下表总结了Delta和Apache Spark缓存之间的主要区别,以便您选择最合适工作流的工具:

功能

Delta 缓存

Apache Spark 缓存

储存格式

工作节点上的本地文件。

In-memory blocks,但它取决于存储级别。

适用对象

WASB和其他文件系统上存储任何Parquet表。

任何RDD或DataFrame。

触发

自动执行,第一次读取时(如果启用了缓存)。

手动执行,需要更改代码。

已评估

Lazily.

Lazily.

强制缓存

CACHE 和 SELECT

.cache + 任何实现缓存的操作和.persist.

可用性

可以通过配置标志启用或禁用,在某些节​​点类型上禁用。

始终可用

驱逐

在任何文件更改时自动执行,重新启动集群时手动执行。

以LRU方式自动执行,使用unpersist手动执行。

Delta 缓存一致性

Delta缓存会自动检测何时创建或删除数据文件,并相应地更新其内容。您可以写入,修改和删除表数据,而无需显示的使缓存数据无效。

Delta缓存会自动检测缓存后已被修改或覆盖的文件。所有陈旧的条目都会自动失效并从缓存中逐出。

使用Delta缓存

要使用Delta缓存,请在配置集群时选择Delta缓存加速工作器类型。

Worker Type默认启用Delta缓存,并配置为最多使用工作节点随附的本地SSD上一半可用空间。

有关配置选项,请参阅“配置Delta缓存”。

缓存数据的子集

要明确选择需要缓存的数据子集,请使用以下语法:

SQL

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

您无需使用此命令即可正常使用Delta缓存(数据在首次访问时将自动缓存)。但是,当您需要一致的查询性能时,它可能会有所帮助。

有关示例和更多详细信息,请参见

监控Delta缓存

您可以在Spark UI的“存储”选项卡中的每个执行器上检查Delta缓存的当前状态。

Storage当节点的磁盘使用率达到100%时,缓存管理器将丢弃最近最少使用的缓存条目,以便为新数据腾出空间。

配置Delta缓存

注意

Databricks建议您为集群选择缓存加速的工作程序实例类型。此类实例已针对Delta缓存自动执行了最佳配置。

配置磁盘使用率

要配置Delta缓存如何使用工作节点的本地存储,请在集群创建期间指定以下Spark配置设置:

  • spark.databricks.io.cache.maxDiskUsage -每个节点为缓存的数据保留的磁盘空间(以字节为单位)

  • spark.databricks.io.cache.maxMetaDataCache -每个节点为缓存的元数据保留的磁盘空间(以字节为单位)

  • spark.databricks.io.cache.compression.enabled -缓存的数据是否应以压缩格式存储

INI

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

启用Delta缓存

要启用和禁用Delta缓存,请运行:

Scala

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