Condividi tramite


Databricks SDK per Go

Questo articolo illustra come automatizzare le operazioni in account, aree di lavoro e risorse correlate di Azure Databricks con Databricks SDK per Go. Questo articolo integra Databricks SDK per Go README, informazioni di riferimento sulle API ed esempi.

Nota

Questa funzionalità è in versione beta e può essere usata nell'ambiente di produzione.

Durante il periodo beta, Databricks consiglia di aggiungere una dipendenza dalla versione secondaria specifica di Databricks SDK per Go da cui dipende il codice, ad esempio, nel file di go.mod un progetto. Per altre informazioni sull'aggiunta delle dipendenze, vedere Gestione delle dipendenze.

Operazioni preliminari

Prima di iniziare a usare Databricks SDK for Go, il computer di sviluppo deve avere:

Introduzione a Databricks SDK per Go

  1. Nel computer di sviluppo con Go già installato, un progetto di codice Go esistente già creato e l'autenticazione di Azure Databricks configurata, creare un go.mod file per tenere traccia delle dipendenze del codice Go eseguendo il go mod init comando, ad esempio:

    go mod init sample
    
  2. Usare una dipendenza dal pacchetto Databricks SDK for Go eseguendo il go mod edit -require comando, sostituendo 0.8.0 con la versione più recente del pacchetto Databricks SDK for Go, come indicato in CHANGELOG:

    go mod edit -require github.com/databricks/databricks-sdk-go@v0.8.0
    

    Il file go.mod dovrà risultare simile al seguente:

    module sample
    
    go 1.18
    
    require github.com/databricks/databricks-sdk-go v0.8.0
    
  3. All'interno del progetto creare un file di codice Go che importa Databricks SDK per Go. L'esempio seguente, in un file denominato main.go con il contenuto seguente, elenca tutti i cluster nell'area di lavoro di 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. Aggiungere eventuali dipendenze del modulo mancanti eseguendo il go mod tidy comando :

    go mod tidy
    

    Nota

    Se viene visualizzato l'errore go: warning: "all" matched no packages, si è dimenticato di aggiungere un file di codice Go che importa Databricks SDK per Go.

  5. Acquisire copie di tutti i pacchetti necessari per supportare compilazioni e test di pacchetti nel main modulo eseguendo il go mod vendor comando :

    go mod vendor
    
  6. Configurare il computer di sviluppo per l'autenticazione di Azure Databricks.

  7. Eseguire il file di codice Go, presupponendo che un file denominato main.go, eseguendo il go run comando :

    go run main.go
    

    Nota

    Non impostando *databricks.Config come argomento nella chiamata precedente a w := databricks.Must(databricks.NewWorkspaceClient()), Databricks SDK for Go usa il processo predefinito per tentare di eseguire l'autenticazione di Azure Databricks. Per eseguire l'override di questo comportamento predefinito, vedere Autenticare Databricks SDK per Go con l'account o l'area di lavoro di Azure Databricks.

Aggiornare Databricks SDK per Go

Per aggiornare il progetto Go per usare uno dei pacchetti Databricks SDK per Go, come indicato in CHANGELOG, eseguire le operazioni seguenti:

  1. Eseguire il go get comando dalla radice del progetto, specificando il -u flag per eseguire un aggiornamento e specificando il nome e il numero di versione di destinazione del pacchetto Databricks SDK per Go. Ad esempio, per eseguire l'aggiornamento alla versione 0.12.0, eseguire il comando seguente:

    go get -u github.com/databricks/databricks-sdk-go@v0.12.0
    
  2. Aggiungere e aggiornare eventuali dipendenze del modulo mancanti e obsolete eseguendo il go mod tidy comando :

    go mod tidy
    
  3. Acquisire copie di tutti i pacchetti nuovi e aggiornati necessari per supportare compilazioni e test di pacchetti nel main modulo eseguendo il go mod vendor comando :

    go mod vendor
    

Autenticare Databricks SDK for Go con l'account o l'area di lavoro di Azure Databricks

Databricks SDK per Go implementa lo standard di autenticazione unificata del client Databricks, un approccio architetturale e programmatico consolidato e coerente all'autenticazione. Questo approccio consente di configurare e automatizzare l'autenticazione con Azure Databricks più centralizzato e prevedibile. Consente di configurare l'autenticazione di Databricks una sola volta e quindi di usarla tra più strumenti e SDK di Databricks senza ulteriori modifiche alla configurazione dell'autenticazione. Per altre informazioni, inclusi esempi di codice più completi in Go, vedere Autenticazione unificata del client Databricks.

Alcuni dei modelli di codifica disponibili per inizializzare l'autenticazione di Databricks con Databricks SDK per Go includono:

  • Usare l'autenticazione predefinita di Databricks eseguendo una delle operazioni seguenti:

    • Creare o identificare un profilo di configurazione di Databricks personalizzato con i campi obbligatori per il tipo di autenticazione databricks di destinazione. Impostare quindi la DATABRICKS_CONFIG_PROFILE variabile di ambiente sul nome del profilo di configurazione personalizzato.
    • Impostare le variabili di ambiente necessarie per il tipo di autenticazione di Databricks di destinazione.

    Creare quindi un'istanza di un WorkspaceClient oggetto con l'autenticazione predefinita di Databricks come indicato di seguito:

    import (
      "github.com/databricks/databricks-sdk-go"
    )
    // ...
    w := databricks.Must(databricks.NewWorkspaceClient())
    
  • Il hardcoded dei campi obbligatori è supportato ma non consigliato, perché rischia di esporre informazioni riservate nel codice, ad esempio i token di accesso personale di Azure Databricks. L'esempio seguente imposta come hardcoded azure Databricks host e valori dei token di accesso per l'autenticazione del token di 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: "...",
    }))
    

Vedere anche Autenticazione in Databricks SDK per Go README.

Esempi

Gli esempi di codice seguenti illustrano come usare Databricks SDK per Go per creare ed eliminare cluster, eseguire processi ed elencare gli utenti degli account. Questi esempi di codice usano databricks SDK per il processo di autenticazione predefinito di Azure Databricks di Go.

Per altri esempi di codice, vedere la cartella examples nel repository Databricks SDK for Go in GitHub.

Creare un cluster

Questo esempio di codice crea un cluster con la versione più recente disponibile di Databricks Runtime Long Term Support (LTS) e il tipo di nodo del cluster più piccolo disponibile con un disco locale. Questo cluster ha un ruolo di lavoro e il cluster terminerà automaticamente dopo 15 minuti di inattività. La CreateAndWait chiamata al metodo fa sì che il codice venga sospeso fino a quando il nuovo cluster non viene eseguito nell'area di lavoro.

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
}

Eliminare definitivamente un cluster

Questo esempio di codice elimina definitivamente il cluster con l'ID cluster specificato dall'area di lavoro.

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)
  }
}

Eseguire un processo

Questo esempio di codice crea un processo di Azure Databricks che esegue il notebook specificato nel cluster specificato. Durante l'esecuzione del codice, ottiene il percorso del notebook esistente, l'ID cluster esistente e le impostazioni del processo correlate dall'utente nel terminale. La RunNowAndWait chiamata al metodo causa la sospensione del codice fino al termine dell'esecuzione del nuovo processo nell'area di lavoro.

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)
}

Gestire i file nei volumi del catalogo Unity

Questo esempio di codice illustra varie chiamate alle funzionalità all'interno WorkspaceClient di per accedere a files un volume del catalogo 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,
    },
  )
}

Elencare gli utenti dell'account

Questo esempio di codice elenca gli utenti disponibili all'interno di un account 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)
  }
}

Risorse aggiuntive

Per altre informazioni, vedi: