メインコンテンツまでスキップ

Databricks SDK for Go

この記事では、 Databricks SDK for Go を使用して Databricks の運用を自動化し、開発を加速する方法について説明します。 この記事では、Databricks SDK for Go の README、API リファレンス、および例を補足します。

注記

この機能は ベータ版 であり、本番運用で使用しても問題ありません。

ベータ期間中、Databricks では、コードが依存する Databricks SDK for Go の特定のマイナー バージョンへの依存関係 (プロジェクトの go.mod ファイルなど) をピン留めすることをお勧めします。依存関係のピン留めの詳細については、「 依存関係の管理」を参照してください。

要件​

Databricks SDK for Goを使用するには、開発マシンには、以下が必要です:

Databricks SDK for Go の使用を開始する​

  1. Go が既にインストールされ、既存の Go コード プロジェクトが既に作成され、Databricks 認証が構成されている開発用マシンで、次の例のように go mod init コマンドを実行して Go コードの依存関係を追跡するための go.mod ファイルを作成します。

    Bash
    go mod init sample
  2. Databricks SDK for Go パッケージに依存するには、 go mod edit -require コマンドを実行し、 0.8.0 を CHANGELOG に記載されている最新バージョンの Databricks SDK for Go パッケージに置き換えます。

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

    go.modファイルは次のようになります。

    Go
    module sample

    go 1.18

    require github.com/databricks/databricks-sdk-go v0.8.0
  3. プロジェクト内で、Databricks SDK for Go をインポートする Go コード ファイルを作成します。 次の例では、次の内容の main.go という名前のファイルで、 Databricks ワークスペース内のすべてのクラスターが一覧表示されます。

    Go
    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. 不足しているモジュールの依存関係を追加するには、 go mod tidy コマンドを実行します。

    Bash
    go mod tidy
注記

エラーが表示された場合 go: warning: "all" matched no packagesDatabricks SDK for Go をインポートする Go コード ファイルを追加するのを忘れました。

  1. mainモジュール内のパッケージのビルドとテストをサポートするために必要なすべてのパッケージのコピーを取得するには、go mod vendor次のコマンドを実行します。

    Bash
    go mod vendor
  2. Databricks 認証用に開発用マシンを設定します。

  3. main.goという名前のファイルを想定して、go run コマンドを実行して、Go コード ファイルを実行します。

    Bash
    go 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 プロジェクトを更新するには、次の操作を行います。

  1. プロジェクトのルートから go get コマンドを実行し、更新を実行するための -u フラグを指定し、Databricks SDK for Go パッケージの名前とターゲット バージョン番号を指定します。 たとえば、バージョン 0.12.0に更新するには、次のコマンドを実行します。

    Bash
    go get -u github.com/databricks/databricks-sdk-go@v0.12.0
  2. 欠落しているモジュールや古いモジュールの依存関係を追加および更新するには、 go mod tidy コマンドを実行します。

    Go
    go mod tidy
  3. mainモジュール内のパッケージのビルドとテストをサポートするために必要なすべての新しいパッケージと更新されたパッケージのコピーを取得するには、go mod vendor次のコマンドを実行します。

    Go
    go 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オブジェクトをインスタンス化します。

    Go
    import (
    "github.com/databricks/databricks-sdk-go"
    )
    // ...
    w := databricks.Must(databricks.NewWorkspaceClient())
  • 必須フィールドのハードコーディングはサポートされていますが、Databricksパーソナルアクセストークンなどのコード内の機密情報が公開される危険があるため推奨はされません。以下の例では、Databricksトークン認証用にDatabricksホストとアクセストークンの値がハードコーディングされています。

    Go
    import (
    "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メソッド呼び出しにより、新しいクラスターがワークスペースで実行されるまで、コードは停止します。

Go
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を持つクラスターをワークスペースから完全に削除します。

Go
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メソッド呼び出しにより、新しいジョブがワークスペースでの実行を完了するまで、コードは停止します。

Go
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 機能に対するさまざまな呼び出しを示します。

Go
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 アカウント内で使用可能なユーザーを一覧表示します。

Go
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 に関する一般的な問題に対するものです。

問題やその他のフィードバックを報告するには、 Databricks SDK for Go の GitHub 問題を作成します。

エラー: 応答を解析できません​

Databricks SDK for Go を使用しようとしたときに次のエラーが表示された場合は、ほとんどの場合、認証構成に問題があることを示しています。

Error: unable to parse response. This is likely a bug in the Databricks SDK for Go or the underlying REST API.

このエラーが発生した場合は、次の点を確認してください。

  • Databricks ホストが正しく設定されていることを確認します。
  • 認証方法に、実行しようとしている API 操作に必要な権限があることを確認します。
  • 企業のファイアウォールの内側にいる場合は、API トラフィックをブロックまたはリダイレクトしていないことを確認してください。

このエラーの一般的な原因は、SDK が処理できないログイン ページに SDK をリダイレクトするプライベート リンクです。これは通常、VPC エンドポイントが属するネットワークとは異なるネットワークから、パブリックインターネットアクセスなしで構成されたプライベートリンク対応ワークスペースにアクセスしようとしたときに発生します。

詳細については、次を参照してください。

追加のリソース​

詳細については、以下を参照してください。