Databricks SDK for Go
この記事では、 Databricks SDK for Go を使用して Databricks の運用を自動化し、開発を加速する方法について説明します。 この記事では、Databricks SDK for Go の README、API リファレンス、および例を補足します。
始める前に
Databricks SDK for Go の使用を開始する前に、開発用マシンに次のものが必要です。
- インストール済みです 。
- Databricks 認証 が構成されています。
Databricks SDK for Go の使用を開始する
-
Go が既にインストールされ、既存の Go コード プロジェクトが既に作成され、Databricks 認証が構成されている開発用マシンで、次の例のように
go mod init
コマンドを実行して Go コードの依存関係を追跡するためのgo.mod
ファイルを作成します。Bashgo mod init sample
-
Databricks SDK for Go パッケージに依存するには、
go mod edit -require
コマンドを実行し、0.8.0
を CHANGELOG に記載されている最新バージョンの Databricks SDK for Go パッケージに置き換えます。Bashgo mod edit -require github.com/databricks/databricks-sdk-go@v0.8.0
go.mod
ファイルは次のようになります。Gomodule sample
go 1.18
require github.com/databricks/databricks-sdk-go v0.8.0 -
プロジェクト内で、Databricks SDK for Go をインポートする Go コード ファイルを作成します。 次の例では、次の内容の
main.go
という名前のファイルで、 Databricks ワークスペース内のすべてのクラスターが一覧表示されます。Gopackage 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
コマンドを実行します。Bashgo mod tidy
エラーが表示された場合 go: warning: "all" matched no packages
Databricks SDK for Go をインポートする Go コード ファイルを追加するのを忘れました。
-
main
モジュール内のパッケージのビルドとテストをサポートするために必要なすべてのパッケージのコピーを取得するには、go mod vendor
次のコマンドを実行します。Bashgo mod vendor
-
Databricks 認証用に開発用マシンを設定します。
-
main.go
という名前のファイルを想定して、go run
コマンドを実行して、Go コード ファイルを実行します。Bashgo run main.go
前の w := databricks.Must(databricks.NewWorkspaceClient())
の呼び出しで *databricks.Config
を引数として設定しないことで、Go の Databricks SDK は Databricks 認証の実行にデフォルト プロセスを使用します。 このデフォルトの動作をオーバーライドするには、「アカウントまたはワークスペースで Go の を認証DatabricksSDKDatabricks する」を参照してください。
Databricks SDK for Go を更新する
CHANGELOG に記載されている Databricks SDK for Go パッケージのいずれかを使用するように Go プロジェクトを更新するには、次の操作を行います。
-
プロジェクトのルートから
go get
コマンドを実行し、更新を実行するための-u
フラグを指定し、Databricks SDK for Go パッケージの名前とターゲット バージョン番号を指定します。 たとえば、バージョン0.12.0
に更新するには、次のコマンドを実行します。Bashgo get -u github.com/databricks/databricks-sdk-go@v0.12.0
-
欠落しているモジュールや古いモジュールの依存関係を追加および更新するには、
go mod tidy
コマンドを実行します。Gogo mod tidy
-
main
モジュール内のパッケージのビルドとテストをサポートするために必要なすべての新しいパッケージと更新されたパッケージのコピーを取得するには、go mod vendor
次のコマンドを実行します。Gogo mod vendor
Databricks アカウントまたはワークスペースで Databricks SDK for Go を認証します
Databricks SDK for Go は、 Databricks クライアント統合認証 標準を実装しており、認証に対するアーキテクチャとプログラムによる統合アプローチと一貫性のあるアプローチです。 このアプローチにより、Databricks による認証の設定と自動化をより一元化し、予測可能にすることができます。 これにより、Databricks 認証を一度構成すると、認証構成をさらに変更することなく、その構成を複数の Databricks ツールや SDK で使用できます。 Go のより完全なコード例など、詳細については、「クライアント統合認証Databricks」を参照してください。
Databricks SDK for Go を使用して Databricks 認証を初期化するために使用できるコーディング パターンには、次のようなものがあります。
-
以下のいずれかを実行して、Databricksのデフォルト認証を使用します。
- ターゲット Databricks 認証の種類に必要なフィールドを持つカスタム Databricks 構成プロファイル を作成または識別します。 次に、
DATABRICKS_CONFIG_PROFILE
環境変数をカスタム構成プロファイルの名前に設定します。 - ターゲットのDatabricks認証タイプに必要とされる環境変数を設定します。
次に、たとえば次のようにDatabricksのデフォルト認証で
WorkspaceClient
オブジェクトをインスタンス化します。Goimport (
"github.com/databricks/databricks-sdk-go"
)
// ...
w := databricks.Must(databricks.NewWorkspaceClient()) - ターゲット Databricks 認証の種類に必要なフィールドを持つカスタム Databricks 構成プロファイル を作成または識別します。 次に、
-
必須フィールドのハードコーディングはサポートされていますが、Databricksパーソナルアクセストークンなどのコード内の機密情報が公開される危険があるため推奨はされません。以下の例では、Databricksトークン認証用にDatabricksホストとアクセストークンの値がハードコーディングされています。
Goimport (
"github.com/databricks/databricks-sdk-go"
"github.com/databricks/databricks-sdk-go/config"
)
// ...
w := databricks.Must(databricks.NewWorkspaceClient(&databricks.Config{
Host: "https://...",
Token: "...",
}))
Databricks SDK for Go の README の 「認証 」も参照してください。
例
次のコード例は、Go の Databricks SDK を使用して、クラスター、実行ジョブ、およびアカウント ユーザーの一覧表示と削除を行う方法を示しています。 DatabricksSDKこれらのコード例では、Go のデフォルトDatabricks認証 プロセス を使用しています。
その他のコード例については、GitHub の Databricks SDK for Go リポジトリの examples フォルダーを参照してください。
クラスターを作成する
このコード例では、利用可能な最新の Databricks Runtime Long Term Support (LTS) バージョンと、ローカル ディスクを持つ使用可能な最小のクラスター ノード タイプを使用してクラスターを作成します。 このクラスターには 1 人のワーカーがおり、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)
}
}
ジョブを実行する
このコード例では、指定したクラスターで指定したノートブックを実行する Databricks ジョブを作成します。 コードが実行されると、ターミナルのユーザーから既存のノートブックのパス、既存のクラスター 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 Catalog ボリューム内のファイルを管理する
このコード例では、Unity Catalog ボリュームにアクセスするために WorkspaceClient
内の files
機能に対するさまざまな呼び出しを示します。
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,
},
)
}
アカウント ユーザーの一覧表示
このコード例では、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)
}
}
追加のリソース
詳細については、以下を参照してください。
- Databricks SDK for Go README (英語)
- Databricks SDK for Go API リファレンス
- その他のコード例
- ロギング
- テスト
- 長期にわたる運用
- ページ分割されたレスポンス