Azure Synapse Analytics 中的智能缓存
智能缓存在后台无缝工作并缓存数据,有助于加快 Spark 从 ADLS Gen2 数据湖读取数据时的执行速度。 它还会自动检测对基础文件的更改,并会自动刷新缓存中的文件,为你提供最新的数据。当缓存大小达到限制时,缓存会自动释放被读取次数最少的数据,为更新的数据腾出空间。 此功能可以提高存储在可用缓存中的文件的后续读取的性能,对 Parquet 文件的提高幅度高达 65%,对 CSV 文件的提高幅度高达 50%,因而可以降低总拥有成本。
从数据湖查询文件或表时,Synapse 中的 Apache Spark 引擎会调用远程 ADLS Gen2 存储来读取基础文件。 每次查询请求读取相同的数据时,Spark 引擎必须调用远程 ADLS Gen2 存储。 此冗余进程会增加延迟,延长总处理时间。 Spark 提供了一项缓存功能。使用此功能时,你必须手动设置缓存和释放缓存,以最大程度地降低延迟并提高整体性能。 但是,如果基础数据发生更改,则可能会导致结果包含过时数据。
Synapse 智能缓存通过在每个 Spark 节点上的已分配缓存存储空间中自动缓存每个读取来简化此过程。 每次请求某个文件时,都会查看缓存中是否存在该文件,并与远程存储中的标记进行比较,以确定文件是否过时。 如果该文件不存在或已过时,Spark 会读取该文件并将其存储在缓存中。 当缓存已满时,将从缓存中逐出上次访问时间最早的文件,为更新的文件腾出空间。
Synapse 缓存是每个节点的单个缓存。 如果你使用中等大小的节点,在单个中型节点上运行时使用两个小型执行程序,则这两个执行程序将共享同一缓存。
启用或禁用缓存
可以根据每个 Apache Spark 池的可用磁盘总大小的百分比来调整缓存大小。 默认情况下,缓存设置为禁用,但若要启用它,只需将滚动条从 0(禁用)移到缓存大小的所需百分比即可。 考虑到数据随机缓存的情况,需至少保留 20% 的可用磁盘空间。 对于随机缓存密集型工作负荷,可以最大程度地缩小缓存大小或禁用缓存。 建议从 50% 缓存大小开始,根据需要进行调整。 请务必注意,如果工作负荷需要本地 SSD 上的大量磁盘空间进行随机缓存或 RDD 缓存,请考虑减小缓存大小,以降低因存储不足而失败的可能性。 可用存储的实际大小和每个节点上的缓存大小将取决于节点系列和节点大小。
为新的 Spark 池启用缓存
创建新的 Spark 池时,请在“其他设置”选项卡下浏览,找到可移动到首选大小处的智能缓存滑块来启用该功能。
为现有 Spark 池启用/禁用缓存
对于现有 Spark 池,请浏览到所选 Apache Spark 池的“缩放设置”,通过将滑块移动到大于 0 的值的位置来启用缓存,或者通过将将滑块移动到 0 的位置来禁用缓存。
更改现有 Spark 池的缓存大小
如果池有活动会话,则必须强制重启才能更改池的智能缓存大小。 如果 Spark 池有活动会话,则会显示“强制使用新设置”。 单击相应的复选框,然后选择“应用”以自动重启会话。
在会话中启用和禁用缓存
通过在笔记本中运行以下代码,在会话中轻松禁用智能缓存:
%spark
spark.conf.set("spark.synapse.vegas.useCache", "false")
%pyspark
spark.conf.set('spark.synapse.vegas.useCache', 'false')
通过运行以下代码来启用它:
%spark
spark.conf.set("spark.synapse.vegas.useCache", "true")
%pyspark
spark.conf.set('spark.synapse.vegas.useCache', 'true')
何时使用智能缓存?何时不使用智能缓存?
以下情况适合使用此功能:
工作负荷需要多次读取同一个文件,并且文件大小不超出缓存大小。
工作负荷使用 Delta 表、Parquet 文件格式和 CSV 文件。
你在 Azure Synapse 上使用 Apache Spark 3 或更高版本。
以下情况不适合使用此功能:
你在读取超过缓存大小的文件,由于文件开头可能会被逐出,后续查询必须从远程存储中重新提取数据。 在这种情况下,智能缓存没有任何优势,你可能需要增加缓存大小和/或节点大小。
工作负荷需要大量的随机缓存,禁用智能缓存可以释放可用空间,防止作业因存储空间不足而失败。
使用的是 Spark 3.1 池,需要将池升级到最新版本的 Spark。
了解详细信息
若要详细了解 Apache Spark,请参阅以下文章:
了解如何配置 Spark 会话设置
后续步骤
Apache Spark 池提供开源大数据计算功能,可以在其中加载、处理和分布数据以及为数据建模,更快地获取分析见解。 若要详细了解如何创建一个 Apache Spark 池来运行 Spark 工作负荷,请访问以下教程: