バンドルを手動で作成する

このチュートリアルでは、Databricks アセット バンドルを最初から作成します。 この単純なバンドルは、2 つのノートブックと、これらのノートブックを実行するための Databricks ジョブの定義で構成されています。 その後、Databricks ワークスペースでジョブを検証、デプロイ、実行します。 これらのステップは、「Databricksジョブを使用して最初のワークフローを作成する」というタイトルのクイックスタートを自動化します。

要件

  • Databricks CLI バージョン 0.218.0 以降。 インストールされている Databricks CLI のバージョンを確認するには、コマンド databricks -vを実行します。 Databricks CLI をインストールするには、「 Databricks CLI のインストールまたは更新」を参照してください。

  • Databricks CLI 用に構成された認証。 「Databricks CLI の認証」を参照してください。

  • リモート Databricks ワークスペースでは、ワークスペース ファイルが有効になっている必要があります。 「ワークスペースファイルとは」を参照してください。

ステップ 1: バンドルを作成する

バンドルには、デプロイする成果物と、実行するリソースの設定が含まれています。

  1. 開発用マシンに空のディレクトリを作成するか、特定します。

  2. ターミナルの空のディレクトリに切り替えるか、IDEで開きます。

ヒント

Git プロバイダーからクローンされたリポジトリを含むディレクトリを使用することもできます。 これにより、外部バージョン管理を使用してバンドルを管理し、プロジェクトで他の開発者や IT プロフェッショナルとより簡単に共同作業を行うことができます。

このデモの リポジトリを複製することを選択した場合、Databricks では、リポジトリを空にするか、 README.gitignoreなどの基本的なファイルのみを含めることをお勧めします。 そうしないと、リポジトリ内の既存のファイルが Databricks ワークスペースに不必要に同期される可能性があります。

ステップ 2: プロジェクトにノートブックを追加する

この手順では、プロジェクトに 2 つのノートブックを追加します。 最初のノートブックは、ニューヨーク州保健局の公開データソースから、2007年以降のトレンドの赤ちゃんの名前のリストを取得しています。 部門のウェブサイトで赤ちゃん の名前:名前によるトレンド:2007年以降 を参照してください。 次に、最初のノートブックは、このデータを my-volume という名前の Databricks Unity Catalog ボリューム、main という名前のカタログ内の default という名前のスキーマに保存します。 2 番目のノートブックは、保存されたデータをクエリし、2014 年の赤ちゃんの名前の集計数をファーストネームと性別別に表示します。

  1. ディレクトリのルートから、最初のノートブック ( retrieve-baby-names.pyという名前のファイル) を作成します。

  2. 次のコードを retrieve-baby-names.py ファイルに追加します。

    # Databricks notebook source
    import requests
    
    response = requests.get('http://health.data.ny.gov/api/views/jxy9-yhdk/rows.csv')
    csvfile = response.content.decode('utf-8')
    dbutils.fs.put("/Volumes/main/default/my-volume/babynames.csv", csvfile, True)
    
  3. 同じディレクトリに 2 つ目のノートブック ( filter-baby-names.pyという名前のファイル) を作成します。

  4. 次のコードを filter-baby-names.py ファイルに追加します。

    # Databricks notebook source
    babynames = spark.read.format("csv").option("header", "true").option("inferSchema", "true").load("/Volumes/main/default/my-volume/babynames.csv")
    babynames.createOrReplaceTempView("babynames_table")
    years = spark.sql("select distinct(Year) from babynames_table").toPandas()['Year'].tolist()
    years.sort()
    dbutils.widgets.dropdown("year", "2014", [str(x) for x in years])
    display(babynames.filter(babynames.Year == dbutils.widgets.get("year")))
    

ステップ 3: バンドル構成スキーマファイルをプロジェクトに追加する

YAML ファイルと JSON スキーマ ファイルをサポートする Visual Studio Code、PyCharm Professional、IntelliJ IDEA Ultimate などの IDE を使用している場合は、IDE を使用してバンドル構成スキーマ ファイルを作成するだけでなく、プロジェクトのバンドル構成ファイルの構文と書式設定を確認できます。 ステップ 5 の後半で作成するバンドル設定ファイルは YAML ベースですが、このステップ のバンドル設定ファイルスキーマファイルは JSONベースです。

  1. Visual Studio Code Marketplace から YAML 拡張機能をインストールするなどして、YAML 言語サーバーのサポートを Visual Studio Code に追加します。

  2. Databricks CLI を使用して bundle schema コマンドを実行し、出力を JSON ファイルにリダイレクトすることで、Databricks Asset Bundle 構成 JSON スキーマ ファイルを生成します。 たとえば、次のように、現在のディレクトリに bundle_config_schema.json という名前のファイルを生成します。

    databricks bundle schema > bundle_config_schema.json
    
  3. ステップ 5 では、バンドル設定ファイルの先頭に次のコメントを追加して、バンドル設定ファイルを指定した JSON スキーマファイルに関連付けます。

    # yaml-language-server: $schema=bundle_config_schema.json
    

    注:

    前のコメントで、Databricks Asset Bundle 構成 JSON スキーマ ファイルが異なるパスにある場合は、 bundle_config_schema.json をスキーマ ファイルへの完全なパスに置き換えます。

  1. Databricks CLI を使用して Databricks Asset Bundle 構成 JSON スキーマ ファイルを生成し、 bundle schema コマンドを実行し、出力を JSON ファイルにリダイレクトします。 たとえば、次のように、現在のディレクトリに bundle_config_schema.json という名前のファイルを生成します。

    databricks bundle schema > bundle_config_schema.json
    
  2. バンドル設定 JSON スキーマファイルを認識するように PyCharm を設定し、「 カスタム JSON スキーマの設定」の手順に従って JSON スキーママッピングを完了します。

  3. ステップ 5 では、 PyCharm を使用してバンドル設定ファイルを作成または開きます。 慣例により、このファイルの名前は databricks.ymlです。

  1. Databricks CLI を使用して bundle schema コマンドを実行し、出力を JSON ファイルにリダイレクトすることで、Databricks Asset Bundle 構成 JSON スキーマ ファイルを生成します。 たとえば、次のように、現在のディレクトリに bundle_config_schema.json という名前のファイルを生成します。

    databricks bundle schema > bundle_config_schema.json
    
  2. バンドル構成 JSON スキーマ ファイルを認識するように IntelliJ IDEA を構成し、「 カスタム JSON スキーマの構成」の手順に従って JSON スキーマ マッピングを完了します。

  3. ステップ 5 では、IntelliJ IDEA を使用してバンドル設定ファイルを作成するか、開きます。 慣例により、このファイルの名前は databricks.ymlです。

ステップ 4: 認証を設定する

この手順では、開発マシン上の Databricks CLI と Databricks ワークスペースとの間の認証を設定します。 この記事では、 OAuth ユーザー対マシン (U2M) 認証と、認証に DEFAULT という名前の対応する Databricks 構成プロファイルを使用することを前提としています。

注:

U2M認証は、これらのステップをリアルタイムで試すのに適しています。 完全に自動化されたワークフローの場合、Databricks では、代わりに OAuth マシン間 (M2M) 認証を使用することをお勧めします。 「認証」のM2M認証の設定手順を参照してください。

  1. Databricks CLIを使用して、ターゲットワークスペースごとに以下のコマンドを実行し、ローカルでOAuthトークン管理を開始します。

    次のコマンドで、<workspace-url>をDatabricksワークスペースインスタンスのURLに置き換えます(例:https://1234567890123456.7.gcp.databricks.com)。

    databricks auth login --host <workspace-url>
    
  2. Databricks CLIは、入力した情報をDatabricks構成プロファイルとして保存するよう促します。Enterを押して提案されたプロファイル名を受け入れるか、新規または既存のプロファイルの名前を入力してください。同じ名前の既存のプロファイルは、入力した情報で上書きされます。プロファイルを使用すると、複数のワークスペース間で認証コンテキストをすばやく切り替えることができます。

    既存のプロファイルのリストを取得するには、別のターミナルまたはコマンドプロンプトでDatabricks CLIを使用してコマンドdatabricks auth profilesを実行します。特定のプロファイルの既存の設定を表示するには、コマンドdatabricks auth env --profile <profile-name>を実行します。

  3. Webブラウザで、画面の指示に従ってDatabricksワークスペースにログインします。

  4. 以下のいずれかのコマンドを実行して、プロファイルの現在のOAuthトークンの値とトークンの今後の有効期限のタイムスタンプを表示します。

    • databricks auth token --host <workspace-url>

    • databricks auth token -p <profile-name>

    • databricks auth token --host <workspace-url> -p <profile-name>

    同じ--host値を持つプロファイルが複数ある場合、Databricks CLIが正しいOAuthトークン情報を見つけられるように--host-pオプションを一緒に指定する必要がある場合があります。

ステップ 5: バンドル構成ファイルをプロジェクトに追加する

この手順では、2 つのノートブックをデプロイして実行する方法を定義します。 このデモでは、Databricks ジョブを使用して最初のノートブックを実行し、次に 2 番目のノートブックを実行します。 最初のノートブックがデータを保存し、2 番目のノートブックが保存されたデータをクエリするため、2 番目のノートブックが開始する前に最初のノートブックの実行を完了する必要があります。 これらの目標は、プロジェクトのバンドル設定ファイルでモデル化します。

  1. ディレクトリのルートから、バンドル設定ファイル ( databricks.ymlという名前のファイル) を作成します。

  2. 次のコードを databricks.yml ファイルに追加し、 <workspace-url>ワークスペースの URL に置き換えます (例: https://1234567890123456.7.gcp.databricks.com)。 この URL は、 .databrickscfg ファイル内の URL と一致する必要があります。

ヒント

最初の行は # yaml-language-serverで始まるもので、IDE がサポートしている場合にのみ必要です。 詳細については、前のステップ 3 を参照してください。

# yaml-language-server: $schema=bundle_config_schema.json
bundle:
  name: baby-names

resources:
  jobs:
    retrieve-filter-baby-names-job:
      name: retrieve-filter-baby-names-job
      job_clusters:
        - job_cluster_key: common-cluster
          new_cluster:
            spark_version: 12.2.x-scala2.12
            node_type_id: n2-highmem-4
            num_workers: 1
      tasks:
        - task_key: retrieve-baby-names-task
          job_cluster_key: common-cluster
          notebook_task:
            notebook_path: ./retrieve-baby-names.py
        - task_key: filter-baby-names-task
          depends_on:
            - task_key: retrieve-baby-names-task
          job_cluster_key: common-cluster
          notebook_task:
            notebook_path: ./filter-baby-names.py

targets:
  development:
    workspace:
      host: <workspace-url>

ジョブをカスタマイズする場合、ジョブ宣言のマッピングは、 リファレンスの POST /api/2.1/job/create に記載されているように、ジョブ作成操作のリクエストペイロード (YAML 形式で表される)RESTAPI に対応します。

ヒント

バンドル内の新しいジョブクラスターの設定を定義、結合、および上書きするには、「Databricksアセットバンドルでクラスター設定を上書きする」で説明されている手法を使用します。

ステップ 6: プロジェクトのバンドル設定ファイルを検証する

このステップでは、バンドル設定が有効かどうかを確認します。

  1. Databricks CLI を使用して、次のように bundle validate コマンドを実行します。

    databricks bundle validate
    
  2. バンドル構成のサマリーが返された場合、検証は成功しています。 エラーが返された場合は、エラーを修正し、この手順を繰り返します。

この手順の後にバンドルに変更を加えた場合は、この手順を繰り返して、バンドル構成がまだ有効かどうかを確認する必要があります。

ステップ 7: ローカル プロジェクトをリモート ワークスペースに配置する

この手順では、2 つのローカル ノートブックをリモート Databricks ワークスペースにデプロイし、ワークスペースに Databricks ジョブを作成します。

  1. Databricks CLI を使用して、次のように bundle deploy コマンドを実行します。

    databricks bundle deploy -t development
    
  2. 2つのローカルノートブックがデプロイされたかどうかを確認する: Databricks ワークスペースのサイドバーで、[ ワークスペース]をクリックします。

  3. 「Users 」> <your-username> > > baby-names > development > files フォルダをクリックします。2 つのノートブックは、このフォルダーにある必要があります。

  4. ジョブが作成されたかどうかを確認する: Databricks ワークスペースのサイドバーで、 [ワークフロー] をクリックします。

  5. 「ジョブ」タブで、「retrieve-filter-baby-names-job」をクリックします。

  6. 「タスク」タブをクリックします。retrieve-baby-names-taskfilter-baby-names-task の 2 つのタスクが必要です。

この手順の後にバンドルに変更を加えた場合は、ステップ 6-7 を繰り返して、バンドル構成がまだ有効かどうかを確認してから、プロジェクトを再デプロイする必要があります。

ステップ 8: デプロイされたプロジェクトを実行する

この手順では、ワークスペースで Databricks ジョブを実行します。

  1. Databricks CLI を使用して、次のように bundle run コマンドを実行します。

    databricks bundle run -t development retrieve-filter-baby-names-job
    
  2. ターミナルに表示される Run URL の値をコピーし、この値を Web ブラウザーに貼り付けて Databricks ワークスペースを開きます。

  3. Databricksワークスペースで、2 つのタスクが正常に完了し、緑色のタイトル バーが表示されたら、filter-baby-names-task タスクをクリックしてクエリ結果を表示します。

この手順の後にバンドルに変更を加えた場合は、ステップ 6 から 8 を繰り返して、バンドル構成がまだ有効かどうかを確認し、プロジェクトを再デプロイして、再デプロイされたプロジェクトを実行してください。

ステップ 9: クリーンアップ

この手順では、デプロイされた 2 つのノートブックとジョブをワークスペースから削除します。

  1. Databricks CLI を使用して、次のように bundle destroy コマンドを実行します。

    databricks bundle destroy
    
  2. ジョブの削除要求を確認する: リソースを完全に破棄するように求められたら、「 y 」と入力して Enterキーを押します。

  3. ノートブックの削除要求を確認する: 以前にデプロイしたフォルダーとそのすべてのファイルを完全に破棄するように求められたら、「 y 」と入力して Enterキーを押します。

bundle destroyコマンドを実行すると、デプロイされたジョブと、デプロイされた 2 つのノートブックを含むフォルダーのみが削除されます。このコマンドでは、最初のノートブックで作成した babynames.csv ファイルなどの副作用は削除されません。 babybnames.csvファイルを削除するには、次の操作を行います。

  1. Databricks ワークスペースのサイドバーで、 [カタログ] をクリックします。

  2. [DBFS の参照] をクリックします。

  3. FileStore フォルダをクリックします。

  4. babynames.csvの横にあるドロップダウン矢印をクリックします。をクリックし、[ 削除] をクリックします。

  5. 開発マシンからバンドルも削除する場合は、ステップ 1 からローカル ディレクトリを削除できます。