Azure Databricks 在何处写入数据?

本文详细介绍了 Azure Databricks 使用常见操作和配置写入数据的位置。 由于 Azure Databricks 提供了一套工具,这些工具跨越多种技术,并在共享责任模型中与云资源交互,因此用于存储数据的默认位置因执行环境、配置和库而异。

本文中的信息旨在帮助你了解各种操作的默认路径,以及配置可能会如何更改这些默认值。 对于数据专员和管理员,如果希望获得有关配置和控制数据访问的指导,则应参阅 Unity Catalog 的数据治理

若要了解如何配置对象存储和其他数据源,请参阅连接到数据源

什么是对象存储?

在云计算中,对象存储或 blob 存储是指将数据作为对象进行维护的存储容器,每个对象由数据、元数据和全局唯一资源标识符 (URI) 组成。 对象存储中的数据操作通常仅限于通过 REST API 接口执行的创建、读取、更新和删除 (CRUD) 操作。 某些对象存储产品/服务包括版本控制和生命周期管理等功能。 对象存储具有以下优点:

  • 高可用性、持续性和可靠性。
  • 与大多数其他存储选项相比,存储成本更低。
  • 可无限缩放(受云的给定区域中可用存储总量的限制)。

大多数基于云的数据湖都基于云对象存储中的开源数据格式构建。

Azure Databricks 如何使用对象存储?

对象存储是 Azure Databricks 用于执行大多数操作的主要存储形式。 Databricks 文件系统 (DBFS) 允许 Azure Databricks 用户与对象存储中的文件进行交互,就像在任何其他文件系统中一样。 除非专门针对外部数据系统配置表,否则在 Azure Databricks 中创建的所有表都会将数据存储在云对象存储中。

存储在云对象存储中的 Delta Lake 文件为 Databricks 湖屋提供了数据基础。

什么是块存储?

在云计算中,块存储或磁盘存储是指与传统硬盘驱动器 (HDD) 或固态硬盘 (SSD) 相对应的存储卷(也称为“硬盘驱动器”)。 在云计算环境中部署块存储时,通常会部署一个或多个物理驱动器的逻辑分区。 产品服务和云供应商的实现略有不同,但通常可在实现中发现以下特征:

  • 所有虚拟机 (VM) 都需要附加的块存储卷。
  • 只要块存储卷存在,安装到块存储卷的文件和程序就一直存在。
  • 块存储卷通常用于临时数据存储。
  • 附加到 VM 的块存储卷通常随 VM 一同删除。

Azure Databricks 如何使用块存储?

启用计算资源时,Azure Databricks 会配置和部署 VM 并附加块存储卷。 此块存储用于在计算生存期内存储临时数据文件。 这些文件包括操作系统和已安装的库,以及磁盘缓存使用的数据。 虽然 Apache Spark 在后台使用块存储来实现高效的并行化和数据加载,但在 Azure Databricks 上运行的大多数代码不会直接将数据保存或加载到块存储。

可以运行任意代码,例如 Python 或 Bash 命令,这些命令使用附加到驱动程序节点的块存储。 请参阅使用附加到驱动程序节点的临时存储中的文件

Unity Catalog 在何处存储数据文件?

Unity Catalog 依赖于管理员来配置云存储与关系对象之间的关系。 数据的确切位置取决于管理员对关系所做的配置。

写入或上传到受 Unity Catalog 管理的对象的数据将存储在以下某个位置:

  • 与元存储、目录或架构关联的托管存储位置。 写入或上传到托管表和托管卷的数据将使用托管存储。 请参阅托管存储
  • 使用存储凭据配置的外部位置。 写入或上传到外部表和外部卷的数据将使用外部存储。 请参阅使用 Unity Catalog 连接到云对象存储

Databricks SQL 将在何处存储数据备份表?

使用配置了 Unity Catalog 的 Databricks SQL 运行 CREATE TABLE 语句时,默认行为是将数据文件存储在通过 Unity Catalog 配置的托管存储位置。 请参阅 Unity Catalog 在何处存储数据文件?

hive_metastore 目录将遵循不同的规则。 请参阅使用 Unity Catalog 和旧式 Hive 元存储

增量实时表在何处存储数据文件?

Databricks 建议在创建 DLT 管道时使用 Unity Catalog。 数据将存储在与目标架构关联的托管存储位置内的目录中。

你可以选择使用 Hive 元存储配置 DLT 管道。 使用 Hive 元存储进行配置后,你可以在 DBFS 或云对象存储上指定存储位置。 如果未指定位置,则会将 DBFS 根目录上的位置分配给管道。

Apache Spark 在何处写入数据文件?

Databricks 建议将对象名称与 Unity Catalog 配合使用来读取和写入数据。 还可以使用以下模式将文件写入 Unity Catalog 卷:/Volumes/<catalog>/<schema>/<volume>/<path>/<file-name>。 你必须具有足够的权限才能在 Unity Catalog 控制的对象中上传、创建、更新或插入数据。

可以选择使用通用资源标识符 (URI) 来指定数据文件的路径。 URI 因云提供商而异。 你还必须为当前计算配置写入权限才能写入到云对象存储。

Azure Databricks 使用 Databricks 文件系统将 Apache Spark 读取和写入命令映射回云对象存储。 每个 Azure Databricks 工作区都附带在为工作区分配的云帐户中配置的 DBFS 根存储位置,所有用户都可以访问该位置来读取和写入数据。 Databricks 不建议使用 DBFS 根目录来存储任何生产数据。 请参阅什么是 Databricks 文件系统 (DBFS)?有关使用 DBFS 根的建议

pandas 会将数据文件写入 Azure Databricks 上的哪个位置?

在 Databricks Runtime 14.0 及更高版本中,所有本地 Python 读取和写入操作的默认当前工作目录 (CWD) 是包含相应笔记本的目录。 如果在保存数据文件时仅提供了文件名,pandas 会将该数据文件保存为与当前正在运行的笔记本并行的工作区文件。

并非所有 Databricks Runtime 版本都支持工作区文件,某些 Databricks Runtime 版本具有不同的行为,这具体取决于你是使用笔记本还是存储库。 请参阅默认的当前工作目录是什么?

应将临时文件写入 Azure Databricks 上的哪个位置?

如果必须写入不希望在关闭群集后保留的临时文件,则在当前工作目录位于工作区文件系统的情况下,将临时文件写入 $TEMPDIR 比写入当前工作目录 (CWD) 会产生更好的性能。 如果代码在存储库中运行,还可以避免超过分支大小限制。 有关详细信息,请参阅文件和存储库大小限制

如果要写入的数据量非常大,并且希望存储会自动缩放,请写入 /local_disk0