簡體   English   中英

Azure Databricks API,如何通過 API 將集群附加到上傳的筆記本

[英]Azure Databricks API, how to attach a cluster to an uploaded notebook via API

我正在使用 python 3.6 運行以下腳本以將本地文件上傳到特定文件夾中的 Azure databricks notebooks。 我已遵循此鏈接中的文檔。 使用下面的腳本,我已經能夠上傳筆記本。 但是,我無法弄清楚如何在通過 API 上傳后將集群附加到該筆記本上。我在文檔中找不到它。 完全有可能嗎? 如果是,如何?

我使用的python腳本如下:

import requests
import os
from os.path import isfile, join
from os import listdir
import base64


dbrks_create_dir_url =  "https://"+os.environ['DBRKS_INSTANCE']+".azuredatabricks.net/api/2.0/workspace/mkdirs"
dbrks_import_rest_url = "https://"+os.environ['DBRKS_INSTANCE']+".azuredatabricks.net/api/2.0/workspace/import"


DBRKS_REQ_HEADERS = {
    'Authorization': 'Bearer ' + os.environ['DBRKS_BEARER_TOKEN'],
    'X-Databricks-Azure-Workspace-Resource-Id': '/subscriptions/'+ os.environ['DBRKS_SUBSCRIPTION_ID'] +'/resourceGroups/'+ os.environ['DBRKS_RESOURCE_GROUP'] +'/providers/Microsoft.Databricks/workspaces/' + os.environ['DBRKS_WORKSPACE_NAME'],
    'X-Databricks-Azure-SP-Management-Token': os.environ['DBRKS_MANAGEMENT_TOKEN']}

## This is the address of the notebook to upload.
notebooks = os.environ['DefaultWorkingDirectory'] + "/notebooks/"

    
path = notebooks
onlyfiles = [f for f in listdir(path) if isfile(join(path, f))]
for file in onlyfiles:
  fileLocation = path +"/"+ file 

  data = open(fileLocation, "rb").read()
  encoded = base64.b64encode(data)
  files = {"content": (fileLocation,encoded)}

  if ".py" in file:
    fileName = file.split(".")[0]
    fileName = fileName.replace(".py", "")
    print(fileName)
    response = requests.post(dbrks_import_rest_url,headers=DBRKS_REQ_HEADERS, files=files, data={'path': '/Users/myuser/' + fileName, 'language':'PYTHON','format':'SOURCE', 'overwrite': 'true', 'content': encoded})


  if response.status_code == 200:
      print(response.json)
  else:
      raise Exception(response.content)  

所有操作系統環境變量都是從我的 Azure DevOps 管道發送的。 但是,您不需要從管道執行腳本。 只要您有一個可以訪問數據塊工作區的服務主體,就可以從本地計算機執行它。 要運行 python 腳本,您可以將這些環境變量替換為您自己的憑據。

解釋腳本中的變量:

  • os.environ['DBRKS_INSTANCE']:數據塊實例的名稱
  • os.environ['DBRKS_BEARER_TOKEN']:不記名令牌。 您需要它來驗證您的服務主體或您的用戶到數據塊。 稍后我解釋了如何獲得它。
  • os.environ['DBRKS_MANAGEMENT_TOKEN']:如果您使用的服務原則未添加為數據塊工作區用戶或管理員,則您需要此令牌。 稍后我解釋了如何獲得它。
  • os.environ['DBRKS_SUBSCRIPTION_ID']:databricks 工作空間所在的 Azure 訂閱 ID。
  • os.environ['DBRKS_RESOURCE_GROUP']:databricks 工作空間的 Azure 資源組的名稱。
  • os.environ['DBRKS_WORKSPACE_NAME']:Azure 數據塊工作區的名稱。
  • os.environ["DBRKS_CLUSTER_ID"]:將在數據塊中執行作業的集群 ID。
  • os.environ['DefaultWorkingDirectory']:只需將其替換為本地計算機上的地址即可獲取示例筆記本文件。 筆記本文件只是一個擴展名為 .py 的文件。 您可以在此文件中添加注釋或僅打印 ("Hello World.")。

使上述腳本運行的最后一點:要獲取 DBRKS_BEARER_TOKEN 和 DBRKS_MANAGEMENT_TOKEN 的上述兩個變量,您可以運行以下腳本並手動將 os.environ['DBRKS_BEARER_TOKEN'] 和 os.environ['DBRKS_MANAGEMENT_TOKEN'] 替換為打印出來的腳本執行后的值:

import requests
import json
import os


TOKEN_BASE_URL = 'https://login.microsoftonline.com/' + os.environ['SVCDirectoryID'] + '/oauth2/token'
TOKEN_REQ_HEADERS = {'Content-Type': 'application/x-www-form-urlencoded'}
TOKEN_REQ_BODY = {
       'grant_type': 'client_credentials',
       'client_id': os.environ['SVCApplicationID'],
       'client_secret': os.environ['SVCSecretKey']}



def dbrks_management_token():
        TOKEN_REQ_BODY['resource'] = 'https://management.core.windows.net/'
        response = requests.get(TOKEN_BASE_URL, headers=TOKEN_REQ_HEADERS, data=TOKEN_REQ_BODY)
        if response.status_code == 200:
            print(response.status_code)
        else:
            raise Exception(response.text)
        return response.json()['access_token']


def dbrks_bearer_token():
        TOKEN_REQ_BODY['resource'] = '2ff814a6-3304-4ab8-85cb-cd0e6f879c1d'
        response = requests.get(TOKEN_BASE_URL, headers=TOKEN_REQ_HEADERS, data=TOKEN_REQ_BODY)
        if response.status_code == 200:
            print(response.status_code)
        else:
            raise Exception(response.text)
        return response.json()['access_token']

DBRKS_BEARER_TOKEN = dbrks_bearer_token()
DBRKS_MANAGEMENT_TOKEN = dbrks_management_token()

os.environ['DBRKS_BEARER_TOKEN'] = DBRKS_BEARER_TOKEN 
os.environ['DBRKS_MANAGEMENT_TOKEN'] = DBRKS_MANAGEMENT_TOKEN 

print("DBRKS_BEARER_TOKEN",os.environ['DBRKS_BEARER_TOKEN'])
print("DBRKS_MANAGEMENT_TOKEN",os.environ['DBRKS_MANAGEMENT_TOKEN'])
  • SVCDirectoryID 是 Azure Active Directory (AAD) 服務主體租戶 ID
  • SVCApplicationID 是 AAD 服務主體客戶端 ID 的值。
  • SVCSecretKey 是 AAD 服務主體密鑰。

感謝您的寶貴意見。

謝謝用戶 Alex Ott - Stack Overflow 將您的建議作為答案發布,以幫助其他社區成員。

您可以為 Databricks 筆記本使用Nutter 框架,使用 Repos 而不是上傳筆記本。

您的 Databricks 工作區需要啟用回購功能。 如果已啟用,您應該會在導航面板中看到“ Repos ”圖標:

  • 將存儲庫分叉到您的環境中 - Github 或 Azure DevOps(按照 Databricks 文檔使用它)
  • Repos中,單擊“ Create Repo ”並將其鏈接到您已分叉的 Git 存儲庫

在此處輸入圖像描述

參考資料: GitHub - microsoft/nutter:Databricks 筆記本的測試框架GitHub - alexott/databricks-nutter-repos-demo:在 CI/CD 管道中使用 Nutter 測試 Databricks 筆記本的演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM