Go용 Databricks SDK
이 문서에서는 Go용 Databricks SDK를 사용하여 Azure Databricks 계정, 작업 영역 및 관련 리소스에서 작업을 자동화하는 방법을 알아봅니다. 이 문서에서는 Go README, API 참조 및 예제에 대한 Databricks SDK를 보완합니다.
참고 항목
이 기능은 베타 버전이며 프로덕션 환경에서도 사용할 수 있습니다.
베타 기간 동안 Databricks는 코드가 종속되는 특정 부 버전의 Databricks SDK for Go에 대한 종속성을 프로젝트 go.mod
파일에서 고정하는 것이 좋습니다. 종속성 고정에 대한 자세한 내용은 종속성 관리를 참조 하세요.
시작하기 전에
Go용 Databricks SDK를 사용하기 전에 개발 머신은 다음 요건을 충족해야 합니다.
Go용 Databricks SDK 시작하기
Go가 이미 설치된 개발 머신에서 기존 Go 코드 프로젝트가 이미 생성되고 Azure Databricks 인증이 구성된 상태에서
go mod init
명령을 실행하여 Go 코드의 종속성을 추적하는go.mod
파일을 만듭니다. 예를 들면 다음과 같습니다.go mod init sample
CHANGELOG에 나열된 대로 최신 버전의 Databricks SDK for Go 패키지로 대체
0.8.0
하여 명령을 실행go mod edit -require
하여 Databricks SDK for Go 패키지에 종속됩니다.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
프로젝트 내에서 Go용 Databricks SDK를 가져오는 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) } }
go mod tidy
명령을 실행하여 누락된 모듈 종속성을 추가합니다.go mod tidy
참고 항목
오류
go: warning: "all" matched no packages
가 발생하면 Go용 Databricks SDK를 가져오는 Go 코드 파일을 추가하는 것을 잊어버린 것입니다.go mod vendor
명령을 실행하여main
모듈에서 패키지의 빌드 및 테스트를 지원하는 데 필요한 모든 패키지의 복사본을 가져옵니다.go mod vendor
Azure Databricks 인증을 위해 개발 머신을 설정합니다.
go run
명령을 실행하여main.go
라는 파일을 가정한 Go 코드 파일을 실행합니다.go run main.go
참고 항목
이전
w := databricks.Must(databricks.NewWorkspaceClient())
호출에서*databricks.Config
를 인수로 설정하지 않음으로써 Go용 Databricks SDK는 Azure Databricks 인증을 수행하기 위해 기본 프로세스를 사용합니다. 이 기본 동작을 재정의하려면 Azure Databricks 계정 또는 작업 영역을 사용하여 Go용 Databricks SDK 인증을 참조하세요.
Go용 Databricks SDK 업데이트
CHANGELOG에 나열된 대로 Go용 Databricks SDK 패키지 중 하나를 사용하도록 Go 프로젝트를 업데이트하려면 다음을 수행합니다.
go get
프로젝트의 루트에서 명령을 실행하고, 업데이트를 수행할 플래그를-u
지정하고, Databricks SDK for Go 패키지의 이름 및 대상 버전 번호를 제공합니다. 예를 들어 버전0.12.0
으로 업데이트하려면 다음 명령을 실행합니다.go get -u github.com/databricks/databricks-sdk-go@v0.12.0
다음 명령을 실행
go mod tidy
하여 누락되고 오래된 모듈 종속성을 추가하고 업데이트합니다.go mod tidy
명령을 실행하여 모듈에서 패키지의 빌드 및 테스트를 지원하는 데 필요한 모든 신규 및 업데이트된 패키지
main
의 복사본을go mod vendor
가져옵니다.go mod vendor
Azure Databricks 계정 또는 작업 영역을 사용하여 Go용 Databricks SDK 인증
Databricks SDK for Go는 인증에 대한 통합되고 일관된 아키텍처 및 프로그래밍 방식인 Databricks 클라이언트 통합 인증 표준을 구현합니다. 이 방법을 사용하면 Azure Databricks를 사용하여 인증을 보다 중앙 집중화하고 예측 가능하게 설정하고 자동화할 수 있습니다. 이를 통해 Databricks 인증을 한 번 구성한 다음, 추가 인증 구성 변경 없이 여러 Databricks 도구 및 SDK에서 해당 구성을 사용할 수 있습니다. Go의 전체 코드 예제를 비롯한 자세한 내용은 Databricks 클라이언트 통합 인증을 참조하세요.
Databricks SDK for Go를 사용하여 Databricks 인증을 초기화하는 데 사용할 수 있는 코딩 패턴 중 일부는 다음과 같습니다.
다음 중 하나를 수행하여 Databricks 기본 인증을 사용합니다.
- 대상 Databricks 인증 유형에 필요한 필드를 사용하여 사용자 지정 Databricks 구성 프로필을 만들거나 식별합니다. 그런 다음 환경 변수를
DATABRICKS_CONFIG_PROFILE
사용자 지정 구성 프로필의 이름으로 설정합니다. - 대상 Databricks 인증 유형에 필요한 환경 변수를 설정합니다.
그런 다음, 다음과 같이 Databricks 기본 인증을 사용하여
WorkspaceClient
개체를 인스턴스화합니다.import ( "github.com/databricks/databricks-sdk-go" ) // ... w := databricks.Must(databricks.NewWorkspaceClient())
- 대상 Databricks 인증 유형에 필요한 필드를 사용하여 사용자 지정 Databricks 구성 프로필을 만들거나 식별합니다. 그런 다음 환경 변수를
Azure Databricks 개인용 액세스 토큰과 같은 중요한 정보를 코드에 노출할 위험이 있으므로 필수 필드를 하드 코딩하는 것은 지원되지만 권장되지는 않습니다. 다음 예제에서는 Databricks 토큰 인증에 대한 Azure 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: "...", }))
Go 추가 정보용 Databricks SDK의 인증도 참조하세요.
예제
다음 코드 예제에서는 Databricks SDK for Go를 사용하여 클러스터를 만들고 삭제하고, 작업을 실행하고, 계정 사용자를 나열하는 방법을 보여 줍니다. 이러한 코드 예제에서는 Go용 Azure Databricks의 기본 Azure Databricks 인증 프로세스를 사용합니다.
추가 코드 예제는 GitHub의 Go용 Databricks SDK 리포지토리의 예제 폴더를 참조하세요.
클러스터 생성
이 코드 예제에서는 사용 가능한 최신 Databricks 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
}
클러스터 영구 삭제
이 코드 예제에서는 작업 영역에서 지정된 클러스터 ID를 사용하여 클러스터를 영구적으로 삭제합니다.
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)
}
}
작업 실행
이 코드 예제에서는 지정된 클러스터에서 지정된 Notebook을 실행하는 Azure Databricks 작업을 만듭니다. 코드가 실행되면 터미널의 사용자로부터 기존 Notebook의 경로, 기존 클러스터 ID 및 관련 작업 설정을 가져옵니다. 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 카탈로그 볼륨에서 파일 관리
이 코드 예제에서는 Unity 카탈로그 볼륨에 액세스하기 위해 files
내 WorkspaceClient
기능에 대한 다양한 호출을 보여 줍니다.
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)
}
}
추가 리소스
자세한 내용은 다음을 참조하세요.