Пакет SDK Databricks для Go
В этой статье вы узнаете, как автоматизировать операции Azure Databricks и ускорить разработку с помощью пакета SDK Databricks для Go. Эта статья дополняет пакет SDK Databricks для Go README, справочник по API и примеры.
Примечание.
Эта функция доступна в бета-версии и подходит для использования в рабочей среде.
В период бета-версии Databricks рекомендует закрепить зависимость от конкретной дополнительной версии пакета SDK Databricks для Go, от которой зависит код, например, в файле проекта go.mod
. Дополнительные сведения о закреплении зависимостей см. в разделе "Управление зависимостями".
Подготовка к работе
Прежде чем приступить к использованию пакета SDK Databricks для Go, компьютер разработки должен иметь следующее:
- Установите go.
- Настроена проверка подлинности Azure Databricks.
Начало работы с пакетом SDK Databricks для Go
На компьютере разработки с помощью Go уже например:
go mod init sample
Зависимость от пакета SDK Databricks для Go, выполнив
go mod edit -require
команду, заменив0.8.0
последнюю версию пакета SDK Databricks для Go, как указано в файле CHANGELOG:go mod edit -require github.com/databricks/databricks-sdk-go@v0.8.0
Теперь файл
go.mod
должен выглядеть так:module sample go 1.18 require github.com/databricks/databricks-sdk-go v0.8.0
В проекте создайте файл кода Go, который импортирует пакет SDK Databricks для Go. В следующем примере в файле
main.go
со следующим содержимым перечислены все кластеры в рабочей области Azure Databricks:package main import ( "context" "github.com/databricks/databricks-sdk-go" "github.com/databricks/databricks-sdk-go/service/compute" ) func main() { w := databricks.Must(databricks.NewWorkspaceClient()) all, err := w.Clusters.ListAll(context.Background(), compute.ListClustersRequest{}) if err != nil { panic(err) } for _, c := range all { println(c.ClusterName) } }
Добавьте все отсутствующие зависимости модуля, выполнив
go mod tidy
команду:go mod tidy
Примечание.
Если вы получите ошибку
go: warning: "all" matched no packages
, вы забыли добавить файл кода Go, который импортирует пакет SDK Databricks для Go.Захват копий всех пакетов, необходимых для поддержки сборок и тестов пакетов в
main
модулеgo mod vendor
, выполнив команду:go mod vendor
Настройте машину для разработки для аутентификации Azure Databricks .
Запустите файл кода Go, если файл с именем
main.go
, выполнивgo run
команду:go run main.go
Примечание.
Не устанавливая
*databricks.Config
в качестве аргумента в предыдущем вызовеw := databricks.Must(databricks.NewWorkspaceClient())
, пакет SDK Databricks для Go использует свой процесс по умолчанию для проверки подлинности Azure Databricks. Чтобы переопределить это поведение по умолчанию, ознакомьтесь с проверкой подлинности пакета SDK Databricks для Go с помощью учетной записи Azure Databricks или рабочей области.
Обновление пакета SDK Databricks для Go
Чтобы обновить ваш проект Go для использования одного из пакетов Databricks SDK для Go, перечисленных в CHANGELOG, выполните следующие действия:
Выполните команду
go get
из корневого каталога проекта, указав флаг-u
для обновления и указав имя и номер целевой версии пакета Sdk Databricks для Go. Например, чтобы обновить версию0.12.0
, выполните следующую команду:go get -u github.com/databricks/databricks-sdk-go@v0.12.0
Добавьте и обновите все отсутствующие и устаревшие зависимости модуля, выполнив команду
go mod tidy
:go mod tidy
Захват копий всех новых и обновленных пакетов, необходимых для поддержки сборок и тестов пакетов в
main
модулеgo mod vendor
, выполнив команду:go mod vendor
Проверка подлинности пакета SDK Databricks для Go с помощью учетной записи Или рабочей области Azure Databricks
Пакет SDK Databricks для Go реализует стандарт унифицированной проверки подлинности клиента Databricks, консолидированный и согласованный архитектурный и программный подход к проверке подлинности. Этот подход помогает настроить и автоматизировать проверку подлинности с помощью Azure Databricks более централизованным и предсказуемым. Он позволяет настроить проверку подлинности Databricks один раз, а затем использовать эту конфигурацию в нескольких средствах Databricks и пакетах SDK без дальнейших изменений конфигурации проверки подлинности. Дополнительные сведения, включая более полные примеры кода в Go, см. в статье Databricks client unified authentication.
Некоторые из доступных шаблонов кода для инициализации проверки подлинности Databricks с помощью пакета SDK Databricks для Go включают:
Используйте проверку подлинности databricks по умолчанию, выполнив одно из следующих действий:
- Создайте или определите пользовательский профиль конфигурации Databricks с обязательными полями для целевого типа проверки подлинности Databricks. Затем задайте для переменной среды
DATABRICKS_CONFIG_PROFILE
имя пользовательского профиля конфигурации. - Задайте необходимые переменные среды для целевого типа проверки подлинности Databricks.
Затем создайте экземпляр объекта с проверкой
WorkspaceClient
подлинности databricks по умолчанию следующим образом:import ( "github.com/databricks/databricks-sdk-go" ) // ... w := databricks.Must(databricks.NewWorkspaceClient())
- Создайте или определите пользовательский профиль конфигурации Databricks с обязательными полями для целевого типа проверки подлинности Databricks. Затем задайте для переменной среды
Жесткое кодирование обязательных полей поддерживается, но не рекомендуется, так как он рискует предоставлять конфиденциальную информацию в коде, например личные маркеры доступа Azure Databricks. В следующем примере жестко прописываются значения хоста Azure Databricks и токенов доступа для аутентификации по токену Databricks.
import ( "github.com/databricks/databricks-sdk-go" "github.com/databricks/databricks-sdk-go/config" ) // ... w := databricks.Must(databricks.NewWorkspaceClient(&databricks.Config{ Host: "https://...", Token: "...", }))
См. также проверку подлинности в пакете SDK Databricks для Go README.
Примеры
В следующих примерах кода демонстрируется, как использовать Databricks SDK для Go для создания и удаления кластеров, выполнения заданий и перечисления пользователей учетной записи. В этих примерах кода используется пакет SDK Databricks для процесса проверки подлинности Azure Databricks по умолчанию.
Дополнительные примеры кода см . в папке примеров в репозитории Databricks SDK для Go в GitHub.
- Создание кластера
- Окончательное удаление кластера
- Запуск задания
- Управление файлами в томах каталога Unity
- Список пользователей учетной записи
Создание кластера
В этом примере кода создается кластер с последней доступной версией Databricks Runtime Long Term Support (LTS) и наименьшим доступным типом узла кластера с локальным диском. Этот кластер имеет одну рабочую роль, и кластер будет автоматически завершаться через 15 минут времени простоя. Вызов CreateAndWait
метода приводит к приостановке кода до тех пор, пока новый кластер не будет запущен в рабочей области.
package main
import (
"context"
"fmt"
"github.com/databricks/databricks-sdk-go"
"github.com/databricks/databricks-sdk-go/service/compute"
)
func main() {
const clusterName = "my-cluster"
const autoTerminationMinutes = 15
const numWorkers = 1
w := databricks.Must(databricks.NewWorkspaceClient())
ctx := context.Background()
// Get the full list of available Spark versions to choose from.
sparkVersions, err := w.Clusters.SparkVersions(ctx)
if err != nil {
panic(err)
}
// Choose the latest Long Term Support (LTS) version.
latestLTS, err := sparkVersions.Select(compute.SparkVersionRequest{
Latest: true,
LongTermSupport: true,
})
if err != nil {
panic(err)
}
// Get the list of available cluster node types to choose from.
nodeTypes, err := w.Clusters.ListNodeTypes(ctx)
if err != nil {
panic(err)
}
// Choose the smallest available cluster node type.
smallestWithLocalDisk, err := nodeTypes.Smallest(clusters.NodeTypeRequest{
LocalDisk: true,
})
if err != nil {
panic(err)
}
fmt.Println("Now attempting to create the cluster, please wait...")
runningCluster, err := w.Clusters.CreateAndWait(ctx, compute.CreateCluster{
ClusterName: clusterName,
SparkVersion: latestLTS,
NodeTypeId: smallestWithLocalDisk,
AutoterminationMinutes: autoTerminationMinutes,
NumWorkers: numWorkers,
})
if err != nil {
panic(err)
}
switch runningCluster.State {
case compute.StateRunning:
fmt.Printf("The cluster is now ready at %s#setting/clusters/%s/configuration\n",
w.Config.Host,
runningCluster.ClusterId,
)
default:
fmt.Printf("Cluster is not running or failed to create. %s", runningCluster.StateMessage)
}
// Output:
//
// Now attempting to create the cluster, please wait...
// The cluster is now ready at <workspace-host>#setting/clusters/<cluster-id>/configuration
}
Окончательное удаление пользователя
Этот пример кода окончательно удаляет кластер с указанным идентификатором кластера из рабочей области.
package main
import (
"context"
"github.com/databricks/databricks-sdk-go"
"github.com/databricks/databricks-sdk-go/service/clusters"
)
func main() {
// Replace with your cluster's ID.
const clusterId = "1234-567890-ab123cd4"
w := databricks.Must(databricks.NewWorkspaceClient())
ctx := context.Background()
err := w.Clusters.PermanentDelete(ctx, compute.PermanentDeleteCluster{
ClusterId: clusterId,
})
if err != nil {
panic(err)
}
}
Выполнение задания
В этом примере кода создается задание Azure Databricks, которое запускает указанную записную книжку в указанном кластере. По мере выполнения кода он получает путь к существующей записной книжке, существующий идентификатор кластера и связанные параметры задания от пользователя в терминале. Вызов RunNowAndWait
метода приводит к приостановке кода, пока новое задание не завершит работу в рабочей области.
package main
import (
"bufio"
"context"
"fmt"
"os"
"strings"
"github.com/databricks/databricks-sdk-go"
"github.com/databricks/databricks-sdk-go/service/jobs"
)
func main() {
w := databricks.Must(databricks.NewWorkspaceClient())
ctx := context.Background()
nt := jobs.NotebookTask{
NotebookPath: askFor("Workspace path of the notebook to run:"),
}
jobToRun, err := w.Jobs.Create(ctx, jobs.CreateJob{
Name: askFor("Some short name for the job:"),
Tasks: []jobs.JobTaskSettings{
{
Description: askFor("Some short description for the job:"),
TaskKey: askFor("Some key to apply to the job's tasks:"),
ExistingClusterId: askFor("ID of the existing cluster in the workspace to run the job on:"),
NotebookTask: &nt,
},
},
})
if err != nil {
panic(err)
}
fmt.Printf("Now attempting to run the job at %s/#job/%d, please wait...\n",
w.Config.Host,
jobToRun.JobId,
)
runningJob, err := w.Jobs.RunNow(ctx, jobs.RunNow{
JobId: jobToRun.JobId,
})
if err != nil {
panic(err)
}
jobRun, err := runningJob.Get()
if err != nil {
panic(err)
}
fmt.Printf("View the job run results at %s/#job/%d/run/%d\n",
w.Config.Host,
jobRun.JobId,
jobRun.RunId,
)
// Output:
//
// Now attempting to run the job at <workspace-host>/#job/<job-id>, please wait...
// View the job run results at <workspace-host>/#job/<job-id>/run/<run-id>
}
// Get job settings from the user.
func askFor(prompt string) string {
var s string
r := bufio.NewReader(os.Stdin)
for {
fmt.Fprint(os.Stdout, prompt+" ")
s, _ = r.ReadString('\n')
if s != "" {
break
}
}
return strings.TrimSpace(s)
}
Управление файлами в томах каталога Unity
В этом примере кода показаны различные вызовы функции
package main
import (
"context"
"io"
"os"
"github.com/databricks/databricks-sdk-go"
"github.com/databricks/databricks-sdk-go/service/files"
)
func main() {
w := databricks.Must(databricks.NewWorkspaceClient())
catalog := "main"
schema := "default"
volume := "my-volume"
volumePath := "/Volumes/" + catalog + "/" + schema + "/" + volume // /Volumes/main/default/my-volume
volumeFolder := "my-folder"
volumeFolderPath := volumePath + "/" + volumeFolder // /Volumes/main/default/my-volume/my-folder
volumeFile := "data.csv"
volumeFilePath := volumeFolderPath + "/" + volumeFile // /Volumes/main/default/my-volume/my-folder/data.csv
uploadFilePath := "./data.csv"
// Create an empty folder in a volume.
err := w.Files.CreateDirectory(
context.Background(),
files.CreateDirectoryRequest{DirectoryPath: volumeFolderPath},
)
if err != nil {
panic(err)
}
// Upload a file to a volume.
fileUpload, err := os.Open(uploadFilePath)
if err != nil {
panic(err)
}
defer fileUpload.Close()
w.Files.Upload(
context.Background(),
files.UploadRequest{
Contents: fileUpload,
FilePath: volumeFilePath,
Overwrite: true,
},
)
// List the contents of a volume.
items := w.Files.ListDirectoryContents(
context.Background(),
files.ListDirectoryContentsRequest{DirectoryPath: volumePath},
)
for {
if items.HasNext(context.Background()) {
item, err := items.Next(context.Background())
if err != nil {
break
}
println(item.Path)
} else {
break
}
}
// List the contents of a folder in a volume.
itemsFolder := w.Files.ListDirectoryContents(
context.Background(),
files.ListDirectoryContentsRequest{DirectoryPath: volumeFolderPath},
)
for {
if itemsFolder.HasNext(context.Background()) {
item, err := itemsFolder.Next(context.Background())
if err != nil {
break
}
println(item.Path)
} else {
break
}
}
// Print the contents of a file in a volume.
file, err := w.Files.DownloadByFilePath(
context.Background(),
volumeFilePath,
)
if err != nil {
panic(err)
}
bufDownload := make([]byte, file.ContentLength)
for {
file, err := file.Contents.Read(bufDownload)
if err != nil && err != io.EOF {
panic(err)
}
if file == 0 {
break
}
println(string(bufDownload[:file]))
}
// Delete a file from a volume.
w.Files.DeleteByFilePath(
context.Background(),
volumeFilePath,
)
// Delete a folder from a volume.
w.Files.DeleteDirectory(
context.Background(),
files.DeleteDirectoryRequest{
DirectoryPath: volumeFolderPath,
},
)
}
Список пользователей учетной записи
В этом примере кода перечислены доступные пользователи в учетной записи Azure Databricks.
package main
import (
"context"
"github.com/databricks/databricks-sdk-go"
"github.com/databricks/databricks-sdk-go/service/iam"
)
func main() {
a := databricks.Must(databricks.NewAccountClient())
all, err := a.Users.ListAll(context.Background(), iam.ListAccountUsersRequest{})
if err != nil {
panic(err)
}
for _, u := range all {
println(u.UserName)
}
}
Дополнительные ресурсы
Дополнительные сведения см. в разделе:
- Пакет SDK Databricks для Go README
- Справочник по API Databricks для Go
- Дополнительные примеры кода
- Ведение журнала
- Тестирование
- Длительные операции
- Ответы с разбивкой на страницы