Поделиться через


Пакет SDK Databricks для Go

В этой статье вы узнаете, как автоматизировать операции в учетных записях Azure Databricks, рабочих областях и связанных ресурсах с помощью пакета SDK Databricks для Go. Эта статья дополняет пакет SDK Databricks для Go README, справочник по API и примеры.

Примечание.

Эта функция доступна в бета-версии и подходит для использования в рабочей среде.

В период бета-версии Databricks рекомендует закрепить зависимость от конкретной дополнительной версии пакета SDK Databricks для Go, от которой зависит код, например, в файле проекта go.mod . Дополнительные сведения о закреплении зависимостей см. в разделе "Управление зависимостями".

Подготовка к работе

Прежде чем приступить к использованию пакета SDK Databricks для Go, компьютер разработки должен иметь следующее:

Начало работы с пакетом SDK Databricks для Go

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

    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, чтобы использовать один из пакетов SDK Databricks для 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 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())
    
  • Жесткое кодирование обязательных полей поддерживается, но не рекомендуется, так как он рискует предоставлять конфиденциальную информацию в коде, например личные маркеры доступа 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.

Примеры

В следующих примерах кода показано, как использовать пакет SDK Databricks для Go для создания и удаления кластеров, выполнения заданий и пользователей учетной записи списка. В этих примерах кода используется пакет SDK Databricks для процесса проверки подлинности Azure Databricks по умолчанию.

Дополнительные примеры кода см . в папке примеров в репозитории 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)
  }
}

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

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