Go için Databricks SDK'sı

Bu makalede Go için Databricks SDK'sı ile Azure Databricks hesaplarında, çalışma alanlarında ve ilgili kaynaklarda işlemleri otomatikleştirmeyi öğreneceksiniz. Bu makalede Go README için Databricks SDK'sı, API başvurusu ve örnekler desteklenir.

Not

Bu özellik Beta sürümündedir ve üretimde kullanılabilir.

Beta döneminde Databricks, go için Databricks SDK'sının kodunuzun bağlı olduğu belirli bir alt sürüme bağımlılığı sabitlemenizi önerir. Örneğin, projenin go.mod dosyasında. Bağımlılıkları sabitleme hakkında daha fazla bilgi için bkz . Bağımlılıkları yönetme.

Başlamadan önce

Go için Databricks SDK'sını kullanmaya başlamadan önce geliştirme makinenizde aşağıdakiler olmalıdır:

Go için Databricks SDK'sını kullanmaya başlama

  1. Go'nun zaten yüklü olduğu geliştirme makinenizde, zaten oluşturulmuş bir Go kodu projesi ve Azure Databricks kimlik doğrulaması yapılandırılmış durumda, komutunu çalıştırarak Go kodunuzun go mod init bağımlılıklarını izlemek için bir go.mod dosya oluşturun, örneğin:

    go mod init sample
    
  2. komutunu çalıştırarak go mod edit -require go için Databricks SDK'sı paketine bağımlılığı alın ve değerini CHANGELOG'da listelenen Go için Databricks SDK paketinin en son sürümüyle değiştirin0.8.0:

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

    Dosyanız go.mod şu şekilde görünmelidir:

    module sample
    
    go 1.18
    
    require github.com/databricks/databricks-sdk-go v0.8.0
    
  3. Projenizde Go için Databricks SDK'sını içeri aktaran bir Go kod dosyası oluşturun. Aşağıdaki örnek, aşağıdaki içeriklere sahip adlı main.go bir dosyada Azure Databricks çalışma alanınızdaki tüm kümeleri listeler:

    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. komutunu çalıştırarak go mod tidy eksik modül bağımlılıklarını ekleyin:

    go mod tidy
    

    Not

    hatasını go: warning: "all" matched no packagesalırsanız, Go için Databricks SDK'sını içeri aktaran bir Go kod dosyası eklemeyi unuttunuz.

  5. Komutunu çalıştırarak modülünüzdeki main paketlerin derlemelerini ve testlerini desteklemek için gereken tüm paketlerin kopyalarını go mod vendor alın:

    go mod vendor
    
  6. Azure Databricks kimlik doğrulaması için geliştirme makinenizi ayarlayın.

  7. komutunu çalıştırarak, adlı main.gobir dosya varsayarak Go kod dosyanızı çalıştırın go run :

    go run main.go
    

    Not

    Önceki çağrısında w := databricks.Must(databricks.NewWorkspaceClient())bağımsız değişken olarak ayarlanmadığından*databricks.Config, Go için Databricks SDK'sı Azure Databricks kimlik doğrulamasını gerçekleştirmeye çalışmak için varsayılan işlemini kullanır. Bu varsayılan davranışı geçersiz kılmak için bkz . Azure Databricks hesabınız veya çalışma alanınızla Go için Databricks SDK'sının kimliğini doğrulama.

Go için Databricks SDK'sını güncelleştirme

Go projenizi CHANGELOG'da listelenen Go için Databricks SDK paketlerinden birini kullanacak şekilde güncelleştirmek için aşağıdakileri yapın:

  1. go get Projenizin kökünden komutunu çalıştırın, güncelleştirme yapılacak bayrağı belirtin -u ve Go için Databricks SDK paketinin adını ve hedef sürüm numarasını sağlayın. Örneğin, sürümüne 0.12.0güncelleştirmek için aşağıdaki komutu çalıştırın:

    go get -u github.com/databricks/databricks-sdk-go@v0.12.0
    
  2. komutunu çalıştırarak eksik ve güncel olmayan modül bağımlılıklarını ekleyin ve güncelleştirin go mod tidy :

    go mod tidy
    
  3. Komutunu çalıştırarak modülünüzdeki main paketlerin derlemelerini ve testlerini desteklemek için gereken tüm yeni ve güncelleştirilmiş paketlerin kopyalarını go mod vendor alın:

    go mod vendor
    

Azure Databricks hesabınız veya çalışma alanınızla Go için Databricks SDK'sının kimliğini doğrulama

Go için Databricks SDK'sı, kimlik doğrulamasına yönelik birleştirilmiş ve tutarlı bir mimari ve programlı yaklaşım olan Databricks istemci birleşik kimlik doğrulama standardını uygular. Bu yaklaşım, Azure Databricks ile kimlik doğrulamasını ayarlamayı ve otomatikleştirmeyi daha merkezi ve öngörülebilir hale getirmenizi sağlar. Databricks kimlik doğrulamasını bir kez yapılandırmanıza ve daha fazla kimlik doğrulaması yapılandırması değişikliği yapmadan bu yapılandırmayı birden çok Databricks aracında ve SDK'da kullanmanıza olanak tanır. Go'da daha eksiksiz kod örnekleri de dahil olmak üzere daha fazla bilgi için bkz . Databricks istemcisi birleşik kimlik doğrulaması.

Go için Databricks SDK'sı ile Databricks kimlik doğrulamasını başlatmak için kullanılabilir kodlama desenlerinden bazıları şunlardır:

  • Aşağıdakilerden birini yaparak Databricks varsayılan kimlik doğrulamasını kullanın:

    • Hedef Databricks kimlik doğrulama türü için gerekli alanlarla özel bir Databricks yapılandırma profili oluşturun veya tanımlayın. Ardından ortam değişkenini DATABRICKS_CONFIG_PROFILE özel yapılandırma profilinin adına ayarlayın.
    • Hedef Databricks kimlik doğrulama türü için gerekli ortam değişkenlerini ayarlayın.

    Ardından databricks varsayılan kimlik doğrulamasıyla bir nesne örneği WorkspaceClient oluşturun:

    import (
      "github.com/databricks/databricks-sdk-go"
    )
    // ...
    w := databricks.Must(databricks.NewWorkspaceClient())
    
  • Azure Databricks kişisel erişim belirteçleri gibi hassas bilgilerin kodunuzda açığa çıkmasına neden olduğundan, gerekli alanların sabit kodlanması desteklenir ancak önerilmez. Aşağıdaki örnek Databricks belirteci kimlik doğrulaması için Azure Databricks konağı ve erişim belirteci değerlerini sabit kodlar:

    import (
      "github.com/databricks/databricks-sdk-go"
      "github.com/databricks/databricks-sdk-go/config"
    )
    // ...
    w := databricks.Must(databricks.NewWorkspaceClient(&databricks.Config{
      Host:  "https://...",
      Token: "...",
    }))
    

Ayrıca bkz. Go README için Databricks SDK'sında kimlik doğrulaması .

Örnekler

Aşağıdaki kod örneklerinde küme oluşturmak ve silmek, işleri çalıştırmak ve hesap kullanıcılarını listelemek için Go için Databricks SDK'sının nasıl kullanılacağı gösterilmektedir. Bu kod örnekleri Go'nun varsayılan Azure Databricks kimlik doğrulama işlemi için Databricks SDK'sını kullanır.

Ek kod örnekleri için GitHub'daki Go için Databricks SDK deposundaki örnekler klasörüne bakın.

Küme oluşturma

Bu kod örneği, kullanılabilir en son Databricks Runtime Uzun Süreli Destek (LTS) sürümüne ve yerel diske sahip en küçük kullanılabilir küme düğümü türüne sahip bir küme oluşturur. Bu kümenin bir çalışanı vardır ve küme 15 dakikalık boşta kalma süresinden sonra otomatik olarak sonlandırılır. Yöntem CreateAndWait çağrısı, yeni küme çalışma alanında çalıştırılana kadar kodun duraklatılmış olmasını sağlar.

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
}

Kümeyi kalıcı olarak silme

Bu kod örneği, belirtilen küme kimliğine sahip kümeyi çalışma alanından kalıcı olarak siler.

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

İş çalıştırma

Bu kod örneği, belirtilen kümede belirtilen not defterini çalıştıran bir Azure Databricks işi oluşturur. Kod çalışırken, terminaldeki kullanıcıdan mevcut not defterinin yolunu, mevcut küme kimliğini ve ilgili iş ayarlarını alır. Yöntem RunNowAndWait çağrısı, yeni işin çalışma alanında çalışması bitene kadar kodun duraklatılmış olmasını sağlar.

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 Kataloğu birimlerindeki dosyaları yönetme

Bu kod örneği, bir Unity Kataloğu birimine fileserişmek için içindeki WorkspaceClient işlevlere yönelik çeşitli çağrıları gösterir.

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

Hesap kullanıcılarını listeleme

Bu kod örneği, bir Azure Databricks hesabındaki kullanılabilir kullanıcıları listeler.

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

Ek kaynaklar

Daha fazla bilgi için bkz.