Share via


SDK do Databricks para Go

Neste artigo, você aprenderá a automatizar operações em contas, workspaces e recursos relacionados do Azure Databricks com o SDK do Databricks para Go. Este artigo complementa o LEIAME, a referência de API e os exemplos do SDK do Databricks para Go.

Observação

Esse recurso está em Beta e pode ser usado na produção.

Durante o período Beta, o Databricks recomenda que você fixe uma dependência na versão secundária específica do SDK do Databricks para Go da qual seu código depende, por exemplo, no arquivo go.mod de um projeto. Para obter mais informações sobre como fixar dependências, consulte Como gerenciando dependências.

Antes de começar

Antes de começar a usar o SDK do Databricks para Go, seu computador de desenvolvimento deve ter:

Introdução ao SDK do Databricks para linguagem Go

  1. Em seu computador de desenvolvimento com o Go já instalado, um projeto de código Go existente criado e a autenticação do Azure Databricks configurada, crie um arquivo go.mod para acompanhar as dependências do código Go executando o comando go mod init, por exemplo:

    go mod init sample
    
  2. Estabeleça uma dependência do pacote SDK do Databricks para linguagem Go executando o comando go mod edit -require, substituindo 0.8.0 pela versão mais recente do pacote SDK do Databricks para linguagem Go, conforme listado no CHANGELOG:

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

    Seu arquivo go.mod agora deve ser assim:

    module sample
    
    go 1.18
    
    require github.com/databricks/databricks-sdk-go v0.8.0
    
  3. Em seu projeto, crie um arquivo de código Go que importe o SDK do Databricks para Go. O exemplo a seguir, em um arquivo nomeado main.go com o conteúdo a seguir, lista todos os clusters no seu espaço de trabalho do 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. Adicione as dependências de módulo ausentes executando o comando go mod tidy:

    go mod tidy
    

    Observação

    Se receber o erro go: warning: "all" matched no packages, você esqueceu de adicionar um arquivo de código Go que importa o SDK do Databricks para Go.

  5. Obtenha cópias de todos os pacotes necessários para dar suporte a builds e testes de pacotes em seu módulo main executando o comando go mod vendor:

    go mod vendor
    
  6. Configure seu computador de desenvolvimento para autenticação do Azure Databricks.

  7. Execute o arquivo de código Go, considerando um arquivo chamado main.go, executando o comando go run:

    go run main.go
    

    Observação

    Ao não definir *databricks.Config como um argumento na chamada anterior para w := databricks.Must(databricks.NewWorkspaceClient()), o SDK do Databricks para Go usa seu processo padrão para tentar executar a autenticação do Azure Databricks. Para substituir esse comportamento padrão, consulte Autenticar o SDK do Databricks para Go com sua conta ou workspace do Azure Databricks.

Atualizar o SDK do Databricks para Go

Para atualizar seu projeto Go para usar um dos pacotes do SDK do Databricks para Go, conforme listado no CHANGELOG, faça o seguinte:

  1. Execute o comando go get a partir da raiz do projeto, especificando o sinalizador -u para fazer uma atualização e fornecendo o nome e o número da versão de destino do pacote do SDK do Databricks para Go. Por exemplo, para atualizar para a versão 0.12.0, execute o seguinte comando:

    go get -u github.com/databricks/databricks-sdk-go@v0.12.0
    
  2. Adicione e atualize todas as dependências de módulo ausentes e desatualizadas executando o comando go mod tidy:

    go mod tidy
    
  3. Obtenha cópias de todos os pacotes novos e atualizados necessários para dar suporte a compilações e testes de pacotes em seu módulo main, executando o comando go mod vendor:

    go mod vendor
    

Autenticar o SDK do Databricks para Go com sua conta ou workspace do Azure Databricks

O SDK do Databricks para linguagem Go implementa o padrão de autenticação unificada do cliente do Databricks, uma abordagem arquitetônica e programática consolidada e consistente para autenticação. Essa abordagem ajuda a tornar a configuração e a automação da autenticação com o Azure Databricks mais centralizada e previsível. Ele permite que você configure a autenticação do Databricks uma vez e use essa configuração em várias ferramentas e SDKs do Databricks sem mais alterações na configuração da autenticação. Para obter mais informações, incluindo exemplos de código mais completos em Go, confira Autenticação unificada do cliente do Databricks.

Alguns dos padrões de codificação disponíveis para inicializar a autenticação do Databricks com o SDK do Databricks para linguagem Go incluem:

  • Use a autenticação padrão do Databricks executando um destes procedimentos:

    • Criar ou identificar um perfil de configuração do Databricks personalizado com os campos obrigatórios para o tipo de autenticação do Databricks de destino. Em seguida, defina a variável de ambiente DATABRICKS_CONFIG_PROFILE para o nome do perfil de configuração personalizado.
    • Defina as variáveis de ambiente necessárias para o tipo de autenticação do Databricks de destino.

    Em seguida, crie uma instância, por exemplo, de um objeto WorkspaceClient com a autenticação padrão do Databricks da seguinte maneira:

    import (
      "github.com/databricks/databricks-sdk-go"
    )
    // ...
    w := databricks.Must(databricks.NewWorkspaceClient())
    
  • A codificação dos campos obrigatórios é suportada, mas não recomendada, pois corre o risco de expor informações confidenciais em seu código, como tokens de acesso pessoal do Azure Databricks. O exemplo a seguir codifica os valores de host e token de acesso do Azure Databricks para autenticação de token do 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: "...",
    }))
    

Confira também Autenticação no LEIAME do SDK do Databricks para Go.

Exemplos

Os exemplos de código a seguir demonstram como usar o SDK do Databricks para linguagem Go para criar e excluir clusters, executar trabalhos e listar usuários da conta. Esses exemplos de código usam o SDK do Databricks para o processo de autenticação padrão do Azure Databricks do Go.

Para obter exemplos de código adicionais, consulte a pasta de exemplos no repositório SDK do Databricks para Go no GitHub.

Criar um cluster

Este exemplo de código cria um cluster com a versão LTS (suporte de longo prazo) do Databricks Runtime mais recente disponível e o menor tipo de nó de cluster disponível com um disco local. Esse cluster tem um trabalho e o cluster será encerrado automaticamente após 15 minutos de tempo ocioso. A chamada de método CreateAndWait faz com que o código pause até que o novo cluster esteja em execução no workspace.

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
}

Excluir um cluster permanentemente

Este exemplo de código exclui permanentemente o cluster com a ID de cluster especificada do workspace.

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

Executar um trabalho

Esse exemplo de código cria um trabalho do Azure Databricks que executa o notebook especificado no cluster especificado. À medida que o código é executado, ele obtém o caminho do notebook existente, a ID do cluster existente e as configurações de trabalho relacionadas do usuário no terminal. A chamada de método RunNowAndWait faz com que o código pause até que o novo trabalho tenha concluído a execução no workspace.

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

Listar os usuários da conta

Esse exemplo de código lista os usuários disponíveis em uma conta do 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)
  }
}

Recursos adicionais

Para saber mais, veja: