使用 databricks-connect 在工作区之间切换

Switch between workspaces with databricks-connect

是否可以使用 databricks-connect 切换工作区?

我目前正在尝试切换:spark.conf.set('spark.driver.host', cluster_config['host'])

但这会返回以下错误: AnalysisException: Cannot modify the value of a Spark config: spark.driver.host

可能它不会直接回答您的问题,但也可以使用 Visual Studio Databricks 插件,该插件将使用 databricks 连接,并且从那里很容易切换到不同的环境。 https://marketplace.visualstudio.com/items?itemName=paiqo.databricks-vscode.

        "databricks.connectionManager": "VSCode Settings",
        "databricks.connections": [
            {
                "apiRootUrl": "https://westeurope.azuredatabricks.net",
                "displayName": "My DEV workspace",
                "localSyncFolder": "c:\Databricks\dev",
                "personalAccessToken": "dapi219e30212312311c6721a66ce879e"
            },
            {
                "apiRootUrl": "https://westeurope.azuredatabricks.net",
                "displayName": "My TEST workspace",
                "localSyncFolder": "c:\Databricks\test",
                "personalAccessToken": "dapi219e30212312311c672aaaaaaaaaa"
            }
        ],
        ...

如果你查看 documentation on setting the client,你会发现有三种配置 Databricks Connect 的方法:

  • 使用 databricks-connect configure 生成的配置文件 - 文件名始终为 ~/.databricks-connect
  • 环境变量 - DATABRICKS_ADDRESSDATABRICKS_API_TOKEN、...
  • Spark Configuration properties - spark.databricks.service.address, spark.databricks.service.token, ... 但是当使用这个方法时,Spark Session 可能已经被初始化,所以你可能无法在不重启 Spark 的情况下即时切换.

但是如果你使用不同的 DBR 版本,那么改变配置属性是不够的,你还需要切换 Python 包含相应版本的 Databricks Connect 发行版的环境。

对于我自己的工作,我编写了以下 Zsh 脚本,它允许在不同的设置(分片)之间轻松切换 - 虽然它允许一次只使用一个分片。先决条件是:

  • Python 环境已创建,名称为 <name>-shard
  • databricks-connect 安装到激活的 conda 环境中:
pyenv activate field-eng-shard
pip install -U databricks-connect==<DBR-version>
  • databricks-connect 配置一次,特定 cluster/shard 的配置存储在 ~/.databricks-connect-<name> 文件中,该文件将被符号链接到 ~/.databricks-connect
function use-shard() {
    SHARD_NAME=""
    if [ -z "$SHARD_NAME" ]; then
        echo "Usage: use-shard shard-name"
        return 1
    fi
    if [ ! -L ~/.databricks-connect ] && [ -f ~/.databricks-connect ]; then
        echo "There is ~/.databricks-connect file - possibly you configured another shard"
    elif [ -f ~/.databricks-connect-${SHARD_NAME} ]; then
        rm -f ~/.databricks-connect
        ln -s ~/.databricks-connect-${SHARD_NAME} ~/.databricks-connect
        pyenv deactivate
        pyenv activate ${SHARD_NAME}-shard
    else
        echo "There is no configuration file for shard: ~/.databricks-connect-${SHARD_NAME}"
    fi
}

我创建了一个简单的 python 脚本来更改 .databricks-connect 配置文件中的 cluster_id

要执行,请确保您的虚拟环境配置了环境变量 DATABRICKS_CLUSTER。官方 databricks-connect 文档中显示 here 获取集群 ID。

设置环境变量:

export DATABRICKS_CLUSTER=your-cluster-id

设置环境变量后,只需使用以下 python 脚本即可在激活新虚拟环境时切换集群。

import os
import json

#Get databricks cluster associated with current virtual env
DATABRICKS_CLUSTER = os.getenv('DATABRICKS_CLUSTER')
HOME = os.getenv('HOME')

#Open the databricks-connect config file
with open(f'{HOME}/.databricks-connect', 'r') as j:
    config = json.loads(j.read())

#Update new cluster ID
config['cluster_id'] = DATABRICKS_CLUSTER

#Save the databricks connect config file
with open(f'{HOME}/.databricks-connect', 'w') as outfile:
    json.dump(config, outfile, indent=4)