Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье вы узнаете, как автоматизировать операции 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 и настроена аутентификация Azure Databricks, создайте файл для отслеживания зависимостей вашего кода 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 unified authentication.
Некоторые из доступных шаблонов кода для инициализации проверки подлинности Databricks с помощью пакета SDK Databricks для Go включают:
Используйте проверку подлинности databricks по умолчанию, выполнив одно из следующих действий:
- Создайте или определите пользовательский профиль конфигурации Databricks с обязательными полями для целевого типа проверки подлинности Databricks. Затем задайте для переменной среды
DATABRICKS_CONFIG_PROFILEимя пользовательского профиля конфигурации. - Задайте необходимые переменные среды для целевого типа проверки подлинности Databricks.
Затем, например, создайте экземпляр объекта с аутентификацией по умолчанию 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 для Go, который применяет процесс проверки подлинности Azure Databricks по умолчанию.
Дополнительные примеры кода см. в папке examples в репозитории 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
В этом примере кода продемонстрированы различные вызовы функционала files внутри WorkspaceClient для доступа к тому каталога 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.
Чтобы сообщить о проблемах или оставить другие отзывы, создайте заявку на GitHub для SDK Databricks на Go.
Ошибка: не удается проанализировать ответ
Если при попытке использовать пакет SDK Databricks для Go возникает следующая ошибка, она почти всегда указывает на проблему с конфигурацией проверки подлинности.
Error: unable to parse response. This is likely a bug in the Databricks SDK for Go or the underlying REST API.
Если возникла эта ошибка, проверьте следующее:
- Убедитесь, что узел Databricks настроен правильно.
- Убедитесь, что метод проверки подлинности имеет необходимые разрешения для операции API, которую вы пытаетесь выполнить.
- Если вы находитесь за корпоративным брандмауэром, убедитесь, что он не блокирует или перенаправляет трафик API.
Распространенной причиной этой ошибки является приватная ссылка, перенаправляющая пакет SDK на страницу входа, которую пакет SDK не может обрабатывать. Обычно это происходит при попытке доступа к рабочей области с поддержкой приватных ссылок, настроенной без общедоступного доступа к Интернету из другой сети, чем сеть, к которой принадлежит конечная точка VPC.
Дополнительные сведения см. в следующем разделе:
Дополнительные ресурсы
Дополнительные сведения см. в разделе:
- Пакет SDK Databricks для Go README
- Справочник API Databricks SDK для Go API reference
- Дополнительные примеры кода
- Логирование
- Тестирование
- Длительные операции
- Ответы с разбивкой на страницы