了解 Auto Loader 的 cloudFiles.useManagedFileEvents 选项,该选项提供高效的文件识别。
文件事件的自动加载程序如何工作?
具有文件事件的自动加载程序使用云供应商提供的文件事件通知功能。 可以将云存储容器配置为在文件事件(例如新建文件和修改)上发布通知。 例如,使用 Amazon S3 事件通知,新的文件到达可以触发 Amazon SNS 主题的通知。 然后,可以订阅 Amazon SQS 队列来订阅 SNS 主题,以便异步处理事件。
下图描述了此模式:
Databricks 文件事件服务是一项用于设置云资源以监听文件事件的服务。 或者,可以自行设置云资源并提供自己的存储队列。
配置云资源后,服务将侦听文件事件并缓存文件元数据信息。 自动装载器在cloudFiles.useManagedFileEvents 设置为 true时使用此缓存来发现文件。
下图描述了这些交互:
当流首次运行并将cloudFiles.useManagedFileEvents设置为true时,自动加载程序会对加载路径执行完整的目录列表,以便发现所有文件并同步更新文件事件缓存的当前状态(确保缓存中有一个有效的读取位置,并将其存储在流的检查点中)。 后续的自动加载过程通过利用已经存储的读取位置,直接从文件事件缓存中读取新文件,而无需进行目录列表操作。
建议每隔 7 天至少运行一次自动加载程序流,以利用缓存中的增量文件发现。 如果不经常运行自动加载程序,则存储的读取位置将变为无效,自动加载程序必须执行完整目录列表才能获取文件事件缓存的当前状态。
文件事件的自动加载程序何时使用目录列表?
自动加载程序在以下情况下执行完整目录列表:
- 启动新流
- 从目录列表或旧文件通知中迁移数据流
- 流加载路径已更改
- 包含文件事件的自动加载程序在 7 天内未运行
- 对使自动加载程序读取位置失效的外部位置进行了更新。 例如,当重新关闭和打开文件事件、外部位置的路径被更改,或提供不同的队列给外部位置时。
自动加载程序始终在首次运行时执行完整列表,即使 includeExistingFiles 设置为 false。 通过此标志,可以导入在流开始时间后创建的所有文件。 自动加载程序会列出整个目录,以发现在流开始时间后创建的所有文件,保护文件事件缓存中的读取位置,并将其存储在检查点中。 后续运行直接从文件事件缓存读取,不需要目录列表。
Databricks 文件事件服务还会定期对外部位置执行完整目录列表,以确认它未错过任何文件(例如,如果提供的队列配置错误)。 在外部位置启用文件事件后,第一个完整目录列表将立即开始。 只要至少有一个“Auto Loader”流使用文件事件引入数据,后续列表就会定期发生。
使用文件事件的自动加载程序最佳做法
在将自动加载程序与文件事件配合使用时,请遵循以下最佳做法来优化性能和可靠性。
使用存储卷实现最佳文件查找
为了提高性能,Databricks建议为自动加载程序加载数据的每个路径或子目录创建外部卷,并向自动加载程序提供卷路径(例如/Volumes/someCatalog/someSchema/someVolume),而不是云路径(例如s3://bucket/path/to/volume)。 这会优化文件发现,因为自动加载器能够使用一个优化的数据访问模式列出所有卷。
考虑事件驱动管道的文件到达触发器
对于事件驱动的数据处理,请考虑使用 文件到达触发器 而不是连续管道。 当新文件到达时,文件到达触发器会自动启动管道,从而提供更好的资源利用率和成本效益,因为群集仅在有新文件要处理时运行。
使用连续触发器配置适当的间隔
建议在文件到达后立即使用 文件到达触发器 来处理文件。 但是,如果你的用例需要使用连续触发器,比如 Trigger.ProcessingTime, 我们建议将触发器间隔设置为 1 minute 或更长(使用 Lakeflow Spark 声明性管道时设置为 pipelines.trigger.interval)。 这会降低检查频率,以验证是否有新文件到达,并允许更多流同时从工作区运行。
自动加载程序在文件事件中的限制
- 不支持路径重写。 在 DBFS 下装载多个存储桶或容器时,将使用路径重写,这是已弃用的使用模式。
有关文件事件限制的常规列表,请参阅 文件事件限制。
常见问题解答
查找有关文件事件的自动加载程序常见问题的解答。
如何确认文件事件是否已正确设置?
单击外部位置页上的“ 测试连接 ”按钮。 如果文件事件设置正确,你将看到 文件事件读取 项的绿色复选标记。 如果您刚刚创建了外部位置并在 Automatic 模式下启用了文件事件,则在 Databricks 为外部位置设置通知期间,测试将显示 Skipped。 等待几分钟,然后再次单击 “测试连接 ”。 如果 Databricks 没有设置或读取文件事件所需的权限,则会看到 文件事件读取 项的错误。
是否可以在初始运行期间避免完整目录列表?
否。 即使 includeExistingFiles 设置为 false,自动加载程序也会执行目录列表以发现在流启动后创建的文件,并使用文件事件缓存获取最新状态(确保缓存中的有效读取位置并将其存储在流的检查点中)。
是否应设置为 cloudFiles.backfillInterval 避免丢失文件?
否。 对于旧文件通知模式,建议使用此设置,因为云存储通知系统可能会导致丢失或迟到的文件。 现在,Databricks 会定期对外部存储位置执行完整目录列表检查。 在外部位置启用文件事件后,第一个完整目录列表将立即开始。 只要至少有一个自动加载程序流使用文件事件引入数据,后续列表会定期列出。
我使用提供的存储队列设置文件事件,但队列配置不正确,我错过了文件。 如何确保 Auto Loader 重新引入由于队列配置错误而遗漏的文件?
首先,确认提供的队列配置错误已修复。 若要检查,请单击外部位置页上的“ 测试连接 ”按钮。 如果文件事件设置正确,你将看到 文件事件读取 项的绿色复选标记。
Databricks 为启用了文件事件的外部存储位置执行完整的目录列出操作。 此目录列表发现错误配置期间错过的任何文件,并将其存储在文件事件缓存中。
修复错误配置并由 Databricks 完成目录列表后,Auto Loader 将继续从文件事件缓存中读取,并自动引入错误配置期间错过的任何文件。
Databricks 如何获取创建云资源以及读取和删除队列中的消息的权限?
Databricks 使用存储凭据中授予的权限,这些凭据与启用文件事件的外部位置关联。