ノートブックのためのソフトウェアエンジニアリングのベストプラクティス
この記事では、バージョン管理、コード共有、テスト、そしてオプションとして継続的インテグレーションと継続的デリバリーまたはデプロイメント(CI/CD)を含む、ソフトウェアエンジニアリングのベストプラクティスをDatabricksノートブックに適用する方法を示す実践的なチュートリアルをご紹介します。
このチュートリアルでは、以下のことを行います。
バージョン管理のためにノートブックを Databricks Git フォルダーに追加します。
いずれかのノートブックからコードの一部を共有可能なモジュールに抽出します。
共有コードをテストします。
Databricksジョブからノートブックを実行します。
必要に応じて、共有コードにCI/CDを適用します。
要件
このチュートリアルを完了するには、以下のリソースが必要です。
Databricks がサポートする Git プロバイダー を含むリモート リポジトリ。 この記事のチュートリアルでは、GitHub を使用します。 このチュートリアルでは、
best-notebooks
という名前の GitHub リポジトリが使用可能であることを前提としています。 (リポジトリに別の名前を付けることができます。 その場合は、このチュートリアル全体でbest-notebooks
をリポジトリの名前に置き換えます)。 GitHub リポジトリ をまだ作成していない場合は作成します。注
新しいリポジトリを作成する場合は、少なくとも1つのファイル、例えば
README
ファイルでリポジトリを初期化してください。Databricks ワークスペース。ワークスペースを作成します(まだ作成していない場合)。
ワークスペース内の Databricks All-Purposeクラスター 。 設計フェーズでノートブックを実行するには、 実行中の All-Purposeクラスターにノートブックをアタッチします。 後で、このチュートリアルでは Databricks ジョブ を使用して、このクラスターでのノートブックの実行を自動化します。 (ジョブの有効期間のみ存在する ジョブ クラスター でジョブを実行することもできます。 All-Purposeクラスターを まだお持ちでない場合は、作成してください。
ステップ 1: Databricks Git フォルダーをセットアップする
このステップでは、既存の GitHub リポジトリを、既存の Databricks ワークスペースの Databricks Git フォルダーに接続します。
ワークスペースをGitHubリポジトリに接続できるようにするには、まずワークスペースにGitHubの認証情報を入力する必要があります(まだ行っていない場合)。
ステップ1.1:GitHubの認証情報を指定する
ワークスペースの右上にあるユーザー名をクリックし、ドロップダウン リストで[設定]をクリックします。
[設定]サイドバーの[ユーザー]で、 [リンクされたアカウント]をクリックします。
[Git 統合] の [Git プロバイダー] で、 [GitHub] を選択します。
[ 個人用アクセストークン] をクリックします。
「Gitプロバイダーのユーザー名またはEメールアドレス」に、GitHubユーザー名を入力します。
「トークン」にGitHubパーソナルアクセストークン(クラシック)を入力します。このパーソナルアクセストークン(クラシック)には、リポジトリとワークフローの権限が必要です。
「保存」をクリックします。
ステップ1.2:GitHubリポジトリに接続する
ワークスペースのサイドバーで、 「ワークスペース」をクリックします。
ワークスペースブラウザで、 [ワークスペース] > [ユーザー]を展開します。
ユーザー名フォルダーを右クリックし、 [作成] > [Git フォルダー]をクリックします。
「Git フォルダーの作成」ダイアログで:
「GitリポジトリURL」に、GitHubリポジトリのHTTPSでのクローンのURLで入力してくださいこの記事は、URLが
best-notebooks.git
で終わると仮定しています(例:https://github.com/<your-GitHub-username>/best-notebooks.git
)。Gitプロバイダーとして、GitHubを選択します。
Git フォルダー名はリポジトリの名前に設定したままにしておきます (例:
best-notebooks
)。「Git フォルダーの作成」をクリックします。
ステップ2:ノートブックをインポートして実行する
このステップでは、既存の外部ノートブックをリポジトリにインポートします。このチュートリアル用に独自のノートブックを作成することもできますが、チュートリアルを迅速に完了するために、ここではノートブックを提供しています。
ステップ2.1:リポジトリに作業ブランチを作成する
このサブステップでは、リポジトリにeda
という名前のブランチを作成します。このブランチを使用すると、リポジトリのmain
ブランチから独立してファイルやコードを操作できるようになります。これは、ソフトウェアエンジニアリングのベストプラクティスです(ブランチに別の名前を付けることもできます)。
注
レポジトリによっては、main
ブランチの代わりにmaster
という名前が付けられることもあります。その場合は、このチュートリアル全体を通してmain
をmaster
に置き換えてください。
ヒント
Gitブランチでの作業に慣れていない場合は、Git Webサイトの「Gitブランチ - ブランチの概要」を参照してください。
ステップ 1.2 の Git フォルダーが開いているはずです。 そうでない場合は、ワークスペースサイドバーで[ワークスペース] > [ユーザー]を展開し、ユーザー名フォルダーを展開して、Git フォルダーをクリックします。
ワークスペース ナビゲーション ブレッドクラムの下のフォルダー名の横にあるメインのGit ブランチ ボタンをクリックします。
ベストノートブックダイアログで、 「ブランチの作成」ボタンをクリックします。
注
リポジトリの名前が
best-notebooks
以外の場合、このダイアログのタイトルは、ここと、このチュートリアル全体で異なります。eda
と入力し、「作成」をクリックします。このダイアログを閉じます。
ステップ2.2:ノートブックをリポジトリにインポートする
このサブステップでは、既存のノートブックを別のリポジトリからお客様のリポジトリにインポートします。このノートブックでは、以下の処理を行います。
owid/covid-19-dataのGitHubリポジトリからCSVファイルをワークスペースのクラスターにコピーします。このCSVファイルには、COVID-19の入院状況と世界中の集中治療指標に関する公開データが含まれています。
CSVファイルの内容をpandas DataFrameに読み込みます。
米国の指標のみが含まれるようにデータをフィルタリングします。
データのプロットを表示します。
pandas DataFrameをSpark DataFrameのPandas APIとして保存します。
Spark DataFrame上のPandas APIでデータクレンジングを実行します。
ワークスペースに Delta テーブル として Spark DataFrame に PandasAPI を書き込みます。
Deltaテーブルの内容を表示します。
ここでリポジトリに独自のノートブックを作成することもできますが、代わりに既存のノートブックをインポートすると、このウォークスルーを高速化できます。 ノートブックをインポートする代わりに、このブランチにノートブックを作成するか、既存のノートブックをこのブランチに移動するには、 「 ワークスペース ファイルの基本的な使用法 」を参照してください。
best-NotebookGitフォルダーから、 [作成] > [フォルダー]をクリックします。
「 新規フォルダ 」ダイアログで、「
notebooks
」と入力し、「 作成」をクリックします。ノートブックフォルダーからケバブをクリックし、 [インポート] をクリックします。
「 インポート 」ダイアログで、次の操作を行います。
「インポート元」で「URL」を選択します。
GitHubの
databricks/notebook-best-practices
リポジトリにcovid_eda_raw
ノートブックの生コンテンツのURLを入力します。このURLを取得するには:https://github.com/databricks/notebook-best-practicesに移動します。
notebooks
フォルダをクリックします。covid_eda_raw.py
ファイルをクリックします。「生データ」をクリックします。
Webブラウザのアドレスバーから完全なURLを [インポート ]ダイアログにコピーします。
注
[インポート]ダイアログは、パブリック リポジトリの Git URL のみで機能します。
「インポート」をクリックします。
ステップ2.3:ノートブックを実行する
ノートブックがまだ表示されていない場合は、ノートブックフォルダーを開き、フォルダー内のcovid_eda_rawノートブックをクリックします。
このノートブックをアタッチするクラスターを選択します。 クラスターの作成手順については、「 クラスターの作成」を参照してください。
「すべて実行」をクリックします。
ノートブックが実行されるまで待ちます。
ノートブックの実行が完了すると、ノートブックには、データのプロットと、Deltaテーブル内の600行を超える生データが表示されます。このノートブックの実行を開始したときにクラスターがまだ実行されていない場合は、クラスターが起動して結果が表示されるまでに数分かかることがあります。
ステップ2.4:ノートブックをチェックインしてマージする
このサブステップでは、これまでの作業をGitHubリポジトリに保存します。次に、ノートブックを作業ブランチからリポジトリのmain
ブランチにマージします。
ノートブック名の横にある「eda Git ブランチ」ボタンをクリックします。
「best-notebooks」ダイアログの「変更」タブで、notebook/covid_eda_raw.pyファイルが選択されていることを確認します。
[コミット メッセージ (必須)]に、
Added raw notebook
と入力します。「概要(任意)」を入力します。
This is the first version of the notebook.
「コミット&プッシュ」をクリックします。
バナーの [Create a pull request on your git provider] (git プロバイダーでプル要求を作成する ) の pull request リンクをクリックします。
GitHub でプル リクエストを作成し、そのプル リクエストを
main
ブランチにマージします。Databricksワークスペースに戻り、「best-notebooks」ダイアログがまだ表示されている場合は閉じます。
ステップ5:ノートブックを実行するジョブを作成する
前のステップでは、共有コードを手動でテストし、ノートブックを手動で実行しました。このステップでは、Databricksジョブを使用して共有コードをテストし、オンデマンドまたは定期的なスケジュールでノートブックを自動的に実行します。
ステップ5.1:テストノートブックを実行するジョブタスクを作成する
ワークスペースのサイドバーで、 「ワークフロー」をクリックします。
「ジョブ」タブで、「ジョブを作成」をクリックします。
ジョブの名前を編集して
covid_report
にします。「タスク名」に
run_notebook_tests
と入力します。「タイプ」で「ノートブック」を選択します。
[ソース]で、 [Git プロバイダー]を選択します。
「gitリファレンスを追加」をクリックします。
「Git情報」ダイアログで、
「GitリポジトリURL」に、GitHubリポジトリのHTTPSでのクローンのURLで入力してくださいこの記事は、URLが
best-notebooks.git
で終わると仮定しています(例:https://github.com/<your-GitHub-username>/best-notebooks.git
)。Gitプロバイダーとして、GitHubを選択します。
「Gitリファレンス(ブランチ/タグ/コミット)」に、
main
と入力します。「Gitリファレンス(ブランチ/タグ/コミット)」の横にある「ブランチ」を選択します。
「確認」をクリックします。
「パス」に
notebooks/run_unit_tests
と入力します。.py
ファイル拡張子は追加しないでください。「クラスター」で、前のステップのクラスターを選択します。
「タスクを作成」をクリックします。
注
このシナリオでは、「スケジュールされたノートブックジョブの作成と管理」で説明したように、ノートブックのスケジュールボタンを使用してこのノートブックを定期的に実行するジョブをスケジュールすることはお勧めしていません。スケジュールボタンを使用すると、ジョブの作成にワークスペースリポジトリ内のノートブックの最新の作業コピーが使用されるためです。代わりに、Databricksでは、前述のステップに従って、リポジトリ内のノートブックの最新のコミットされたバージョンを使用してジョブを作成することをお勧めしています。
ステップ5.2:メインノートブックを実行するジョブタスクを作成する
[+ タスクの追加] アイコンをクリックします。
ポップアップメニューが表示されます。[ノートブック] を選択します。
「タスク名」に
run_main_notebook
と入力します。「タイプ」で「ノートブック」を選択します。
「パス」に
notebooks/covid_eda_modular
と入力します。.py
ファイル拡張子は追加しないでください。「クラスター」で、前のステップのクラスターを選択します。
[Depends on] の値が [
run_notebook-tests
] であることを確認します。「タスクを作成」をクリックします。
ステップ5.3:ジョブを実行する
「今すぐ実行」をクリックします。
ポップアップで、「実行結果を表示」をクリックします。
注
ポップアップがすぐに消えてしまう場合は、以下を実行してください。
データサイエンス & エンジニアリング または Databricks Mosaic AI 環境のサイドバーで、ワークフローをクリックします。
「ジョブ実行」タブで、「ジョブ」列のcovid_reportを含む最新ジョブの「開始時刻」値をクリックします。
ジョブ結果を見るには、run_notebook_testsタイル、run_main_notebookタイル、またはその両方をクリックします。各タイルの結果は、ノートブックを1つずつ自分で実行した場合と同じです。
注
このジョブはオンデマンドで実行されました。 このジョブを定期的に実行するように設定するには、「 Databricks ジョブのトリガーの種類」を参照してください。
(省略可能)ステップ6:コードが変更されるたびにコードのテストとノートブックの実行を自動的に行うようにリポジトリを設定する
前のステップでは、ジョブを使用して共有コードを自動的にテストし、ある時点または定期的にノートブックを実行しました。 ただし、変更が GitHub リポジトリにマージされるときに、 GitHub Actionsなどの CI/CD ツールを使用してテストを自動的にトリガーすることもできます。
ステップ6.1:ワークスペースへのGitHubアクセスを設定する
このサブステップでは、変更がリポジトリにマージされるたびにワークスペースでジョブを実行する GitHub Actions ワークフローを設定します。 これを行うには、GitHub にアクセス用の一意の Databricks トークンを与えます。
セキュリティ上の理由から、Databricks ワークスペース ユーザーの個人用アクセストークンを GitHub に提供することはお勧めしません。 手順については、GitHub Actions Marketplace の Databricks ノートブックの GitHub Action の実行 ページの GCP セクションを参照してください。
重要
ノートブックは、トークンに関連付けられている ID のすべてのワークスペース アクセス許可で実行されるため、Databricks ではサービスプリンシパルの使用を推奨しています。 Databricks ワークスペース ユーザーの個人用アクセストークンを個人的な探索目的でのみ GitHub に提供する必要があり、セキュリティ上の理由から Databricks がこの方法を推奨していないことを理解する場合は、 ワークスペース ユーザーの個人用アクセストークンを作成する手順を参照してください。
ステップ6.2:GitHub Actionsワークフローを追加する
このサブステップでは、リポジトリへのプルリクエストがあるたびにrun_unit_tests
ノートブックを実行するGitHub Actionsワークフローを追加します。
このサブステップでは、GitHub リポジトリ内の複数のフォルダー レベルに保存されているファイルに GitHub Actions ワークフローを保存します。 GitHub Actions が適切に動作するには、リポジトリに特定のネストされたフォルダー階層が存在する必要があります。 Databricks Git フォルダー ユーザー インターフェイスはネストされたフォルダー階層の作成をサポートしていないため、このステップを完了するには、GitHub リポジトリの Web サイトを使用する必要があります。
GitHubリポジトリのWebサイトで、「コード」タブをクリックします。
mainの横にある矢印をクリックして、 [ブランチまたはタグの切り替え] ドロップダウン リストを展開します。
「ブランチを検索または作成」ボックスに
adding_github_actions
と入力します。「ブランチを作成:adding_github_actions from 'main'」をクリックします。
「ファイルを追加」>「新しいファイルを作成」をクリックします。
「ファイルに名前を付ける」に
.github/workflows/databricks_pull_request_tests.yml
と入力します。エディター ウィンドウで、次のコードを入力します。 このコードは、実行 Databricks Notebook GitHub Actionsの pull_request フックを使用して、
run_unit_tests
ノートブックを実行します。以下のコードで、以下のように置き換えます。
<your-workspace-instance-URL>
を Databricks インスタンス名に置き換えます。<your-access-token>
を、以前生成したトークンで置き換えます。<your-cluster-id>
をターゲット クラスター ID に置き換えます。
name: Run pre-merge Databricks tests on: pull_request: env: # Replace this value with your workspace instance name. DATABRICKS_HOST: https://<your-workspace-instance-name> jobs: unit-test-notebook: runs-on: ubuntu-latest timeout-minutes: 15 steps: - name: Checkout repo uses: actions/checkout@v2 - name: Run test notebook uses: databricks/run-notebook@main with: databricks-token: <your-access-token> local-notebook-path: notebooks/run_unit_tests.py existing-cluster-id: <your-cluster-id> git-commit: "${{ github.event.pull_request.head.sha }}" # Grant all users view permission on the notebook's results, so that they can # see the result of the notebook, if they have related access permissions. access-control-list-json: > [ { "group_name": "users", "permission_level": "CAN_VIEW" } ] run-name: "EDA transforms helper module unit tests"
「変更をコミット」をクリックします。
[変更のコミット]ダイアログで、コミット メッセージに
Create databricks_pull_request_tests.yml
と入力します。[adding_github_actions ブランチに直接コミット]を選択し、 [変更をコミット]をクリックします。
「コード」タブで、「比較とプルリクエスト」をクリックし、プルリクエストを作成します。
プルリクエストページで、「マージ前のDatabricksテスト/unit-test-notebook(pull_request)を実行」の横にあるアイコンに緑色のチェックマークが表示されるまで待ちます(アイコンが表示されるまでに少し時間がかかる場合があります)。緑色のチェックマークではなく赤色のXが表示されている場合は、「詳細」をクリックして理由を確認してください。アイコンまたは「詳細」が表示されていない場合は、「すべてのチェックを表示」をクリックします。
緑のチェックマークが表示されたら、プルリクエストを
main
ブランチにマージします。