跨工作区共享功能表(旧版)

重要

  • 本文档已过时,将来可能不会更新。
  • Databricks 建议使用 Unity Catalog 中的特征工程跨工作区共享功能表。 本文中的方法已弃用。

Azure Databricks 支持在多个工作区之间共享功能表。 例如,可以从自己的工作区创建、写入或读取集中式功能存储中的功能表。 当有多个团队要共享对功能表的访问权限或所在组织有多个工作区来处理不同的开发阶段时,这非常有用。

对于集中式功能存储,Databricks 建议指定一个工作区来存储所有功能存储元数据,并为每个需要访问功能存储的用户创建帐户。

如果团队还要跨工作区共享模型,可以选择为功能表和模型指定相同的集中式工作区,也可以为每个工作区指定不同的集中式工作区。

多功能存储工作区

对集中式功能存储的访问由令牌控制。 每个需要访问的用户或脚本都会在集中式功能存储中创建个人访问令牌,并将该令牌复制到其本地工作区的机密管理器中。 发送到集中式功能存储工作区的每个 API 请求都必须包含访问令牌;功能存储客户端提供了一种简单的机制来指定执行跨工作区操作时要使用的机密。

注意

作为安全最佳做法,在使用自动化工具、系统、脚本和应用进行身份验证时,Databricks 建议使用属于服务主体(而不是工作区用户)的个人访问令牌。 若要为服务主体创建令牌,请参阅管理服务主体的令牌

要求

跨工作区使用特征存储需要:

  • 功能存储客户端 v0.3.6 及更高版本。
  • 这两个工作区必须有权访问原始特征数据。 它们必须共享相同的外部 Hive 元存储,并有权访问相同的 DBFS 存储
  • 如果启用了 IP 访问列表,则工作区 IP 地址必须在访问列表中。

设置远程注册表的 API 令牌

在本部分中,“工作区 B”指的是集中式或远程功能存储工作区。

  1. 在工作区 B 中,请创建访问令牌
  2. 在本地工作区中,请创建机密,以存储访问令牌和有关工作区 B 的信息:
    1. 创建机密范围:databricks secrets create-scope --scope <scope>
    2. 为工作区 B 选择唯一标识符,此处显示为 <prefix>。 然后使用指定的密钥名称创建三个机密:
      • databricks secrets put --scope <scope> --key <prefix>-host:输入工作区 B 的主机名。使用以下 Python 命令获取工作区的主机名:

        import mlflow
        
        host_url = mlflow.utils.databricks_utils.get_webapp_url()
        host_url
        
      • databricks secrets put --scope <scope> --key <prefix>-token:输入来自工作区 B 的访问令牌。

      • databricks secrets put --scope <scope> --key <prefix>-workspace-id:输入工作区 B 的工作区 ID,该 ID 可以在任何页面的 URL 中找到。

注意

你可能想要与其他用户共享机密范围,因为每个工作区的机密范围数量有限

指定远程功能存储

根据为远程功能存储工作区创建的机密范围和名称前缀,可以构造以下格式的功能存储 URI:

feature_store_uri = f'databricks://<scope>:<prefix>'

然后,在实例化 FeatureStoreClient 时显式指定 URI:

fs = FeatureStoreClient(feature_store_uri=feature_store_uri)

为共享 DBFS 位置中的特征表创建数据库

在远程特征存储中创建特征表之前,必须先创建用于存储这些表的数据库。 该数据库必须存在于共享的 DBFS 位置中。

例如,若要在共享位置 /mnt/shared 中创建数据库 recommender,请使用以下命令:

%sql CREATE DATABASE IF NOT EXISTS recommender LOCATION '/mnt/shared'

在远程功能存储中创建功能表

用于在远程特征存储中创建特征表的 API 取决于所使用的 Databricks Runtime 版本。

V0.3.6 及更高版本

使用 FeatureStoreClient.create_table API:

fs = FeatureStoreClient(feature_store_uri=f'databricks://<scope>:<prefix>')
fs.create_table(
  name='recommender.customer_features',
  primary_keys='customer_id',
  schema=customer_features_df.schema,
  description='Customer-keyed features'
)

V0.3.5 及更低版本

使用 FeatureStoreClient.create_feature_table API:

fs = FeatureStoreClient(feature_store_uri=f'databricks://<scope>:<prefix>')
fs.create_feature_table(
  name='recommender.customer_features',
  keys='customer_id',
  schema=customer_features_df.schema,
  description='Customer-keyed features'
)

有关其他特征存储方法的示例,请参阅笔记本示例:跨工作区共享特征表

使用远程功能存储中的功能表

可以通过首先设置 feature_store_uri 来使用 FeatureStoreClient.read_table 方法读取远程功能存储中的功能表:

fs = FeatureStoreClient(feature_store_uri=f'databricks://<scope>:<prefix>')
customer_features_df = fs.read_table(
  name='recommender.customer_features',
)

还支持用于访问功能表的其他帮助程序方法:

fs.read_table()
fs.get_feature_table() # in v0.3.5 and below
fs.get_table() # in v0.3.6 and above
fs.write_table()
fs.publish_table()
fs.create_training_set()

使用远程模型注册表

除了指定远程功能存储 URI,还可以指定远程模型注册表 URI 以跨工作区共享模型

要为模型日志记录或评分指定远程模型注册表,可以使用模型注册表 URI 来实例化 FeatureStoreClient。

fs = FeatureStoreClient(model_registry_uri=f'databricks://<scope>:<prefix>')
customer_features_df = fs.log_model(
    model,
    "recommendation_model",
    flavor=mlflow.sklearn,
    training_set=training_set,
    registered_model_name="recommendation_model"
)

通过 feature_store_urimodel_registry_uri,可以使用任何本地或远程功能表来训练模型,然后在任何本地或远程模型注册表中注册模型。

fs = FeatureStoreClient(
    feature_store_uri=f'databricks://<scope>:<prefix>',
    model_registry_uri=f'databricks://<scope>:<prefix>'
)

笔记本示例:跨工作区共享特征表

以下笔记本演示如何使用集中式特征存储。

集中式功能存储示例笔记本

获取笔记本