自动加载程序常见问题解答

查找有关 Databricks 自动加载程序常见问题的解答。

当文件被追加或覆盖时,自动加载程序是否会再次处理文件?

使用默认设置(cloudFiles.allowOverwrites = false),文件将完全处理一次。 将文件追加到或覆盖时,自动加载程序无法保证将处理哪个文件版本。 若要允许自动加载器在文件被追加或覆盖时再次处理该文件,可以将 cloudFiles.allowOverwrites 设置为 true。 在这种情况下,可以保证自动加载程序处理最新版本的文件。 但是,自动加载程序无法保证处理哪个中间版本。

如果在文件通知模式下启用 cloudFiles.allowOverwrites ,请谨慎使用。 在文件通知模式下,自动加载程序可以通过文件通知和目录列表识别新文件。 由于文件通知事件时间和文件修改时间可能有所不同,因此自动加载程序可能会收到两个不同的时间戳,并引入同一文件两次,即使文件尚未更新。

启用 cloudFiles.allowOverwrites 后,必须自行处理重复记录。 自动加载程序会重新处理整个文件,即使文件被追加或部分更新。 通常,Azure Databricks建议使用自动加载程序仅引入不可变文件,并使用默认设置 cloudFiles.allowOverwrites = false。 如果存在进一步的问题,请联系Azure Databricks帐户团队。

自动加载程序如何确定文件是否已引入?

自动加载程序通常仅根据其文件路径引入每个文件一次。 但是,如果将选项设置为 allowOverwritestrue,Auto Loader 还会使用文件的上次修改时间戳来确定文件是新文件还是已更新,是否需要重新进行引入。 请参阅 自动加载程序在追加或覆盖文件时是否再次处理文件?

如果我的数据文件不是连续送达,而是定期送达(例如,一天一次),我是否仍应使用此源,是否有任何好处?

在这种情况下,你可以设置一个 Trigger.AvailableNow 结构化流作业(在 Databricks Runtime 10.4 LTS 及更高版本中可用),并计划在预期的文件到达时间之后运行。 自动加载器既适用于不频繁的更新,也适用于频繁的更新。 即使最终更新非常大,自动加载程序也能够很好地根据输入大小进行缩放。 自动加载程序的高效文件发现技术和架构演变功能使自动加载程序成为增量数据引入的推荐方法。

自动加载程序如何推理架构?

首次定义数据帧时,自动加载程序会列出源目录,选择最近的 50 GB 数据或 1000 个文件(按文件修改时间),并使用这些文件来推理数据架构。

自动加载程序还通过检查源目录结构来推理分区列,并查找包含 /key=value/ 结构的文件路径。 例如,如果源目录采用了不一致的结构:

base/path/partition=1/date=2020-12-31/file1.json
// inconsistent because date and partition directories are in different orders
base/path/date=2020-12-31/partition=2/file2.json
// inconsistent because the date directory is missing
base/path/partition=3/file3.json

自动加载程序会将分区列识别为空。 使用 cloudFiles.partitionColumns 显式分析目录结构中的列。

当源文件夹为空时,自动加载程序的行为如何?

如果源目录为空,则自动加载程序会要求你提供架构,因为没有任何数据可用于执行推理。

自动加载程序何时推断架构? 它是否会在完成每个微批后自动演变?

首次在代码中定义数据帧时,将推断模式。 在处理每个微批期间,将即时评估架构更改;因此,你无需担心对性能的影响。 当流重启时,它会从架构存储位置获取更新的架构并开始执行,而不会产生推理相关的开销。

使用 Auto Loader 架构推理时,对数据引入性能有什么影响?

在初始架构推理时,对于非常大的源目录,预期架构推理会花费几分钟时间。 除此之外,在流执行期间,性能不应会受到较大的影响。 如果在Azure Databricks笔记本中运行代码,则可以看到状态更新,这些更新指定自动加载程序何时列出目录以采样和推断数据架构。

由于出现 bug,某个错误的文件极大地改变了我的架构。 我该如何回滚数据库架构更改?

请联系 Databricks 支持人员取得帮助。

如果在重启流时更改了检查点位置,会发生什么情况?

检查点位置存储流的重要标识信息。 更改检查点位置实际上意味着已放弃上一个流并启动一个新流。

是否需要事先创建事件通知服务?

不是。 如果你选择文件通知模式并提供所需的权限,自动加载程序可以为你创建文件通知服务。 请参阅单独管理每个自动加载程序流的文件通知队列(经典)。

如果在 Unity 目录中的外部位置启用了文件事件,则文件事件服务可以在云提供程序中创建文件事件,并且无需配置自动加载程序来为每个流创建它们。 请参阅 将文件通知模式与文件事件配合使用

我可以从同一个存储桶/容器上的不同输入目录运行多个流式查询吗?

可以,只要它们不是父子目录;例如,prod-logs/prod-logs/usage/ 不可行,因为 /usage/prod-logs 的子目录。

当桶或容器中已存在文件通知时,我是否可以使用此功能?

可以,只要输入目录与现有通知前缀不冲突(例如上面的父子目录)。

是否可以在自动加载程序和其他应用程序之间共享 SQS 队列?

Databricks 不建议在自动加载程序和其他应用程序之间共享 SQS 队列。 相反,将 S3 事件通知转发到一个 SNS 主题,然后为每个应用程序设置一个单独的 SQS 队列来订阅该主题。 使用 SNS 订阅筛选器策略来确保仅将相关消息转发到每个队列。 然后向自动加载程序提供专用队列。

如何确认文件事件是否已正确设置?

单击外部位置页上的“ 测试连接 ”按钮。 如果正确设置了文件事件,则会看到 “文件事件读取 ”项的绿色复选标记。 如果您刚刚在Automatic模式下创建了外部位置并启用了文件事件,则在 Azure Databricks 为外部位置设置通知时,测试会显示Skipped。 等待几分钟,然后再次单击 “测试连接 ”。 如果 Azure Databricks 没有所需的权限来设置文件事件或从文件事件中读取,您将会看到 File Events Read 项显示错误。

是否可以在初始运行期间避免完整目录列表?

不是。 即使 includeExistingFiles 设置为 false,自动加载程序也会执行目录列表以发现在流启动后创建的文件,并使用文件事件缓存获取最新状态(确保缓存中的有效读取位置并将其存储在流的检查点中)。

是否需要设置 cloudFiles.backfillInterval 以避免丢失文件?

不是。 Azure Databricks 以前建议将此设置用于经典文件通知模式,因为云存储通知系统可能会导致丢失或迟到的文件。 现在,Azure Databricks 在外部位置执行完整目录列表。 在外部位置启用文件事件后,第一个完整目录列表将立即开始。 只要至少有一个自动加载程序流使用文件事件引入数据,每个后续列表都会在上次完全扫描后 24 小时发生。

我使用提供的存储队列设置文件事件,但队列配置不正确,我错过了文件。 如何确保自动加载程序在队列配置错误时引入丢失的文件?

首先,验证提供的队列配置错误是否已修复。 若要检查,请单击外部位置页上的“ 测试连接 ”按钮。 如果正确设置文件事件,则会为 “文件事件读取 ”项显示绿色复选标记。

Azure Databricks 为启用了文件事件的外部位置执行完整目录列表。 此目录列表发现错误配置期间错过的任何文件,并将其存储在文件事件缓存中。

修复错误配置并 Azure Databricks 完成目录列表后,自动加载程序将继续从文件事件缓存中读取,并自动引入错误配置期间错过的任何文件。

如何从 CF_MANAGED_FILE_EVENTS_INVALID_CONTINUATION_TOKEN 错误中恢复?

如果文件事件服务的自动加载程序检查点中存储的延续令牌无效,则会发生此错误。

一些常见原因:

  • cloudFiles.useManagedFileEvents 已关闭,然后再次打开。
  • 修改源的外部位置或卷。
  • 修改提供的队列。

若要恢复:

  1. 在流式处理查询中设置 .option("cloudFiles.listOnStart", "true").option("cloudFiles.validateOptions", false)
  2. 重新启动流媒体。 自动加载程序在启动时执行完整目录列表,并绕过无效的继续标记。
  3. 成功微批处理后,删除这两个选项并重启流。

有关选项的详细信息 cloudFiles.listOnStart ,请参阅 文件通知

如何清理自动加载程序创建的事件通知资源?

你可以使用云资源管理器列出和清除资源。 还可以使用云提供商的 UI 或 API 手动删除这些资源。