Пакет 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

  1. На вашей машине для разработки, где уже установлен Go, создан существующий проект кода Go и настроена аутентификация Azure Databricks, создайте файл для отслеживания зависимостей вашего кода Go, выполнив команду , например:

    go mod init sample
    
  2. Установите зависимость от пакета 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
    
  3. В проекте создайте файл кода 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)
      }
    }
    
  4. Добавьте все отсутствующие зависимости модуля, выполнив go mod tidy команду:

    go mod tidy
    

    Примечание.

    Если вы получите ошибку go: warning: "all" matched no packages, вы забыли добавить файл кода Go, который импортирует пакет SDK Databricks для Go.

  5. Получите копии всех пакетов, необходимых для поддержки сборок и тестов пакетов в модуле main, выполнив команду go mod vendor.

    go mod vendor
    
  6. Настройте машину для разработки для аутентификации Azure Databricks .

  7. Запустите файл кода 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, выполните следующие действия:

  1. Выполните команду go get из корневого каталога проекта, указав флаг -u для обновления и указав имя и номер целевой версии пакета Sdk Databricks для Go. Например, чтобы обновить версию 0.12.0, выполните следующую команду:

    go get -u github.com/databricks/databricks-sdk-go@v0.12.0
    
  2. Добавьте и обновите все отсутствующие и устаревшие зависимости модуля, выполнив команду go mod tidy:

    go mod tidy
    
  3. Скачайте копии всех новых и обновленных пакетов, необходимых для поддержки сборок и тестирования пакетов в модуле 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())
    
  • Хардкодинг обязательных полей поддерживается, но не рекомендуется, так как это может привести к раскрытию конфиденциальной информации в вашем коде, например таких личных токенов доступа, как 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.

Создание кластера

В этом примере кода создается кластер с последней доступной версией 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.

Дополнительные сведения см. в следующем разделе:

Дополнительные ресурсы

Дополнительные сведения см. в разделе: