本页概述了从 Azure Databricks 工作区导出数据和配置的工具和方法。 可以导出工作区资产以满足合规性要求、数据可移植性、备份目的或工作区迁移。
概述
Azure Databricks 工作区包含各种资产,包括工作区配置、托管表、AI 和 ML 对象以及存储在云存储中的数据。 需要导出工作区数据时,可以使用内置工具和 API 的组合系统提取这些资产。
导出工作区数据的常见原因包括:
- 合规性要求:根据 GDPR 和 CCPA 等法规满足数据可移植性义务。
- 备份和灾难恢复:为业务连续性创建关键工作区资产的副本。
- 工作区迁移:在工作区或云提供商之间移动资产。
- 审核和存档:保留工作区配置和数据的历史记录。
规划出口操作
在开始导出工作区数据之前,请创建需要导出的资产清单并了解它们之间的依赖关系。
了解工作区资产
Azure Databricks 工作区包含可导出的多个类别的资产:
- 工作区配置:笔记本、文件夹、存储库、机密、用户、组、访问控制列表(ACL)、群集配置和作业定义。
- 数据资产:托管表、数据库、Databricks 文件系统文件和存储在云存储中的数据。
- 计算资源:群集配置、策略和实例池定义。
- AI 和 ML 资产:MLflow 试验、运行、模型、功能存储表、矢量搜索索引和 Unity 目录模型。
- Unity 目录对象:元存储配置、目录、架构、表、卷和权限。
限定导出范围
根据要求创建要导出的资产清单。 请考虑以下问题:
- 是否需要导出所有资产或仅特定类别?
- 是否有合规性或安全要求决定了必须导出哪些资产?
- 您是否需要保留资产之间的关系(例如,涉及笔记本的作业)?
- 是否需要在另一个环境中重新创建工作区配置?
规划导出范围有助于选择正确的工具并避免缺少关键依赖项。
导出工作区配置
Terraform 导出程序是导出工作区配置的主要工具。 它生成 Terraform 配置文件,这些文件将工作区资产表示为代码。
使用 Terraform 导出工具
Terraform 导出程序内置于 Azure Databricks Terraform 提供程序中,并为工作区资源生成 Terraform 配置文件,包括笔记本、作业、群集、用户、组、机密和访问控制列表。 必须为每个工作区单独运行导出程序。 请参阅 Databricks Terraform 供应商。
先决条件:
- 您的计算机上已安装 Terraform
- Azure Databricks 身份验证已配置
- 要导出的工作区的管理员权限
导出工作区资源:
查看 示范视频 以了解导出器的操作演练。
使用导出程序工具下载并安装 Terraform 提供程序:
wget -q -O terraform-provider-databricks.zip $(curl -s https://api.github.com/repos/databricks/terraform-provider-databricks/releases/latest|grep browser_download_url|grep linux_amd64|sed -e 's|.*: "\([^"]*\)".*$|\1|') unzip -d terraform-provider-databricks terraform-provider-databricks.zip为工作区设置身份验证环境变量:
export DATABRICKS_HOST=https://your-workspace-url export DATABRICKS_TOKEN=your-token运行导出程序以生成 Terraform 配置文件:
terraform-provider-databricks exporter \ -directory ./exported-workspace \ -listing notebooks,jobs,clusters,users,groups,secrets常见的导出程序选项:
-
-listing:指定要导出的资源类型(逗号分隔) -
-services:筛选资源的替代方案 -
-directory:生成的.tf文件的输出目录 -
-incremental:在分阶段迁移的增量模式下运行
-
查看输出目录中生成的
.tf文件。 导出程序为每个资源类型创建一个文件。
注释
Terraform 导出程序侧重于工作区配置和元数据。 它不会导出存储在表或 Databricks 文件系统中的实际数据。 必须使用以下各节中所述的方法单独导出数据。
导出特定资产类型
对于 Terraform 导出程序未完全涵盖的资产,请使用以下方法:
- 笔记本:从工作区 UI 单独下载笔记本,或使用工作区 API 以编程方式导出笔记本。 请参阅 “管理工作区对象”。
- 机密:出于安全原因,无法直接导出机密。 您必须在目标环境中手动重新创建机密信息。 记录机密名称和范围以供参考。
- MLflow 对象:使用 mlflow-export-import 工具导出试验、运行和模型。 请参阅下面的 ML 资产部分 。
导出数据
客户数据通常位于云帐户存储中,而不是 Azure Databricks 中。 无需导出云存储中已有的数据。 但是,你确实需要导出存储在 Azure Databricks 托管位置中的数据。
导出托管表
尽管托管表位于云存储中,但它们存储在基于 UUID 的层次结构中,难以分析。 可以使用 DEEP CLONE 命令将托管表重写为指定位置中的外部表,使其更易于使用。
示例 DEEP CLONE 命令:
CREATE TABLE delta.`abfss://container@storage.dfs.core.windows.net/path/to/storage/`
DEEP CLONE my_catalog.my_schema.my_table
要获得用于克隆多个目录中的所有表的完整脚本,请参阅以下示例脚本。
导出 Databricks 默认存储
对于无服务器工作区,Azure Databricks 提供默认存储,这是 Azure Databricks 帐户中完全托管的存储解决方案。 在删除或停用工作区之前,必须将默认存储中的数据导出到客户拥有的存储容器中。 有关无服务器工作区的详细信息,请参阅 “创建无服务器工作区”。
对于默认存储中的表,使用 DEEP CLONE 将数据写入客户拥有的存储容器。 对于数据卷和任意文件,请遵循以下 DBFS 根导出部分 中所述的相同模式。
导出 Databricks 文件系统根目录
Databricks 文件系统根目录是工作区存储帐户中的旧存储位置,其中包含客户拥有的资产、用户上传、init 脚本、库和表。 尽管 Databricks 文件系统根目录是已弃用的存储模式,但旧工作区可能仍存储于需要导出的此位置中的数据。 有关工作区存储体系结构的详细信息,请参阅 工作区存储。
导出 Databricks 文件系统根目录:
由于 Azure 上的根存储桶是专用的,因此无法使用 Azure 原生工具,例如 azcopy 在存储帐户之间移动数据。 而是在 Azure Databricks 中使用 dbutils fs cp 和 Delta DEEP CLONE 。 这可能需要很长时间才能运行,具体取决于数据量。
# Copy DBFS files to a local path
dbutils.fs.cp("dbfs:/path/to/remote/folder", "/path/to/local/folder", recurse=True)
对于 Databricks 文件系统根存储中的表,请使用 DEEP CLONE:
CREATE TABLE delta.`abfss://container@storage.dfs.core.windows.net/path/to/external/storage/`
DEEP CLONE delta.`dbfs:/path/to/dbfs/location`
重要
从云存储导出大量数据可能会产生大量的数据传输和存储成本。 在启动大型导出之前,请查看云提供商的定价。
常见的导出挑战
秘密:
出于安全原因,无法直接导出机密。 使用 -export-secrets 选项时,Terraform 导出程序会在 vars.tf 中生成一个与机密同名的变量。 必须手动使用实际机密值更新此文件,或使用 -export-secrets 选项运行 Terraform 导出器(仅适用于 Azure Databricks 托管机密)。
Azure Databricks 建议使用 Azure Key Vault 支持的机密存储。
导出 AI 和 ML 资产
某些 AI 和 ML 资产需要不同的工具和导出方法。 Unity 目录模型作为 Terraform 导出程序一部分导出。
MLflow 对象
由于 API 中的差距和序列化难度,Terraform 导出程序未涵盖 MLflow。 若要导出 MLflow 试验、运行、模型和项目,请使用 mlflow-export-import 工具。 此开源工具提供 MLflow 迁移的半完整覆盖。
对于仅导出方案,可以在客户拥有的存储桶中存储所有 MLflow 资产,而无需执行导入步骤。 有关 MLflow 管理的详细信息,请参阅 Unity 目录中的管理模型生命周期。
特性存储和矢量搜索
矢量搜索索引:矢量搜索索引不在欧盟数据导出程序范围内。 如果仍要导出它们,则必须将它们写入标准表,然后使用该表导出 DEEP CLONE。
功能存储表:功能存储应与矢量搜索索引类似。 使用 SQL,选择相关数据后,将其写入标准表,然后使用 DEEP CLONE。
验证导出的数据
导出工作区数据后,验证任务、用户、笔记本和其他资源是否已正确导出,然后再停用旧环境。 使用在范围和规划阶段创建的清单来验证你期望导出的所有内容是否已成功导出。
验证清单
使用此清单验证导出:
- 生成的配置文件:将为所有必需的工作区资源创建 Terraform 配置文件。
- 导出的笔记本:所有笔记本均连同其内容和元数据一并导出。
- 克隆的表:托管表已成功克隆到导出位置。
- 复制的数据文件:完全复制云存储数据,而不会出错。
- 导出的 MLflow 对象:试验、运行和模型及其构件一起导出。
- 记录的权限:访问控制列表和权限在 Terraform 配置中被记录。
- 标识的依赖项:资产之间的关系(例如引用笔记本的作业)保留在导出中。
导出后最佳做法
验证和验收测试主要由你的要求驱动,可能有所不同。 但是,这些一般最佳做法适用:
- 定义测试平台:创建一个作业或笔记本的测试平台,用于验证机密、数据、挂载、连接器和其他依赖项在导出环境中是否正常工作。
- 从开发环境开始:如果以分阶段方式移动,请从开发环境开始,并投入生产。 这提前呈现了主要问题,并避免了生产影响。
- 利用 Git 文件夹:尽可能使用 Git 文件夹,因为它们位于外部 Git 存储库中。 这可以避免手动导出并确保代码在环境中完全相同。
- 记录导出过程:记录使用的工具、执行的命令以及遇到的任何问题。
- 安全导出的数据:确保导出的数据使用适当的访问控制安全地存储,尤其是包含敏感或个人身份信息时。
- 维护符合性:如果出于合规性目的导出,请验证导出是否符合法规要求和保留策略。
示例脚本和自动化
可以使用脚本和计划任务来自动导出工作区。
深度克隆导出脚本
以下脚本使用 DEEP CLONE 导出 Unity Catalog 托管表。 应在源工作区中运行此代码,将给定目录导出到中间存储桶。 更新catalogs_to_copy变量和dest_bucket变量。
import pandas as pd
# define catalogs and destination bucket
catalogs_to_copy = ["my_catalog_name"]
dest_bucket = "<cloud-storage-path>://my-intermediate-bucket"
manifest_name = "manifest"
# initialize vars
system_info = sql("SELECT * FROM system.information_schema.tables")
copied_table_names = []
copied_table_types = []
copied_table_schemas = []
copied_table_catalogs = []
copied_table_locations = []
# loop through all catalogs to copy, then copy all non-system tables
# note: this would likely be parallelized using thread pooling in prod
for catalog in catalogs_to_copy:
filtered_tables = system_info.filter((system_info.table_catalog == catalog) & (system_info.table_schema != "information_schema"))
for table in filtered_tables.collect():
schema = table['table_schema']
table_name = table['table_name']
table_type = table['table_type']
print(f"Copying table {schema}.{table_name}...")
target_location = f"{dest_bucket}/{catalog}_{schema}_{table_name}"
sqlstring = f"CREATE TABLE delta.`{target_location}` DEEP CLONE {catalog}.{schema}.{table_name}"
sql(sqlstring)
# lists used to create manifest table DF
copied_table_names.append(table_name)
copied_table_types.append(table_type)
copied_table_schemas.append(schema)
copied_table_catalogs.append(catalog)
copied_table_locations.append(target_location)
# create the manifest as a df and write to a table in dr target
# this contains catalog, schema, table and location
manifest_df = pd.DataFrame({"catalog": copied_table_catalogs,
"schema": copied_table_schemas,
"table": copied_table_names,
"location": copied_table_locations,
"type": copied_table_types})
spark.createDataFrame(manifest_df).write.mode("overwrite").format("delta").save(f"{dest_bucket}/{manifest_name}")
display(manifest_df)
自动化注意事项
自动导出时:
- 使用计划作业:创建按常规计划运行导出脚本的 Azure Databricks 作业。
- 监视导出作业:配置警报,以在导出失败或花费的时间超过预期时通知你。
- 管理凭据:使用 Azure Databricks 机密安全地存储云存储凭据和 API 令牌。 请参阅机密管理。
- 版本导出:使用导出路径中的时间戳或版本号来维护历史导出。
- 清理旧导出:实施保留策略以删除旧导出和管理存储成本。
- 增量导出:对于大型工作区,请考虑实现增量导出,即仅导出自上次导出以来更改的数据。