在Databricks上使用缓存优化性能
Databricks使用磁盘缓存,通过在节点的本地存储中使用快速中间数据格式创建远程Parquet数据文件的副本来加速数据读取。每当需要从远程位置获取文件时,数据就会自动缓存。然后在本地执行相同数据的连续读取,这将显著提高读取速度。缓存适用于所有Parquet数据文件(包括Delta Lake表)。
增量缓存重命名为磁盘缓存
Databricks上的磁盘缓存以前被称为Delta缓存和DBIO缓存。磁盘缓存行为是Databricks的专有特性。这个名字的改变是为了解决它是三角洲湖协议的一部分的困惑。行为在此重命名后保持不变,如下所述。
自动和手动缓存
Databricks磁盘缓存与Apache Spark缓存不同。Databricks建议大多数操作使用自动磁盘缓存。
启用磁盘缓存后,需要从远端获取的数据会自动添加到缓存中。这个过程是完全透明的,不需要任何操作。但是,若要预先将数据预加载到缓存中,可以使用缓存选择
命令(见缓存数据的子集).使用Spark缓存时,必须手动指定要缓存的表和查询。
磁盘缓存包含远程数据的本地副本。它可以提高大量查询的性能,但不能用于存储任意子查询的结果。Spark缓存可以存储任何子查询数据的结果,也可以存储Parquet以外格式的数据(如CSV、JSON、ORC)。
磁盘缓存中的数据读取和操作速度比Spark缓存中的数据快。这是因为磁盘缓存使用高效的解压缩算法,并以最佳格式输出数据,以便使用全阶段代码生成进行进一步处理。
与Spark缓存不同,磁盘缓存不使用系统内存。由于现代ssd的高读取速度,磁盘缓存可以完全驻留在磁盘上,而不会对其性能产生负面影响。
总结
下表总结了磁盘缓存和Apache Spark缓存之间的主要区别,以便您可以为您的工作流程选择最佳工具:
功能 |
磁盘高速缓存 |
Apache Spark缓存 |
---|---|---|
存储为 |
工作节点上的本地文件。 |
内存中块,但它取决于存储级别。 |
应用于 |
存储在S3、ABFS和其他文件系统上的任何Parquet表。 |
任何数据帧或RDD。 |
触发 |
自动地,在第一次读取时(如果启用了缓存)。 |
手动,需要修改代码。 |
评估 |
懒洋洋地。 |
懒洋洋地。 |
力缓存 |
|
|
可用性 |
可以通过配置标志启用或禁用,在某些节点类型上默认启用。 |
总是可用的。 |
驱逐 |
自动在LRU方式或任何文件更改时,手动重新启动集群。 |
自动在LRU时尚,手动与 |
使用磁盘缓存
使用磁盘缓存的推荐(也是最简单的)方法是在配置集群时选择带有SSD卷的工作者类型。为磁盘缓存启用和配置了这些工作者。
磁盘缓存配置为最多使用工作节点提供的本地ssd上可用空间的一半。有关配置选项,请参见配置磁盘缓存.
缓存数据的子集
要显式地选择要缓存的数据子集,请使用以下语法:
缓存选择column_name(,column_name,…]从[db_name)table_name[在哪里boolean_expression]
您不需要使用此命令来使磁盘缓存正常工作(数据将在第一次访问时自动缓存)。但是当您需要一致的查询性能时,它会很有帮助。
有关示例和更多详细信息,请参见
Databricks RuntimeX及以上:缓存选择
配置磁盘缓存
Databricks建议您选择缓存加速的工作实例类型用于您的集群。这样的实例会自动为磁盘缓存进行优化配置。
请注意
当一个worker被退役时,存储在该worker上的Spark缓存将丢失。因此,如果启用了自动缩放,缓存就会有一些不稳定性。然后,Spark需要根据需要从源代码中重新读取丢失的分区。
配置磁盘使用情况
要配置磁盘缓存如何使用工作节点的本地存储,请指定以下内容火花配置创建集群时的设置:
spark.databricks.io.cache.maxDiskUsage
:每个节点为缓存数据预留的磁盘空间,单位为字节spark.databricks.io.cache.maxMetaDataCache
:每个节点用于缓存元数据的磁盘空间,单位为字节spark.databricks.io.cache.compression.enabled
:缓存数据是否以压缩格式存储
示例配置:
spark.databricks.io.cache.maxDiskUsage 50克spark.databricks.io.cache.maxMetaDataCache 1克spark.databricks.io.cache.compression.enabled假