はじめに
ここ数ヶ月、機械学習の前処理プロジェクトを前任から引き継ぎ、2人体制で開発を進めてきました。そこで課題になったのがコードレビューです。
今回は、DatabricksにGitHubを連携してレビューをすることになった経緯と、連携に必要な手順をご紹介しようと思います。
状況
【開発環境】
・ プラットフォーム: Databricks
・ 言語: pyspark
【課題】
Databricksは、Jupyter notebookライクなUIで、データをインタラクティブに確認・探索できたり、notebookをそのままバッチスクリプトとして利用できたりと、使い勝手の良いプラットフォームです。
2人体制に変わった当初は、Databricksのコメント機能などを利用して互いのコードをレビューしてました。
しかしながら、コード変更の差分が把握しにくく、開発中のコミュニケーションが分散しやすいこと、開発の背景やレビューの履歴を残しにくいことから、GitHubに連携して開発・レビューを進めることにしました。
ただし、GitHub連携が不十分(デフォルトはpullができない)なため、GitHubを使って開発するのは少々 面倒 工夫が必要な状況です。
工夫したところ
GitHub連携にあたり、工夫したのは以下です。
-
プロジェクトのnotebookをCircle CIに連携
チームで導入されているCircle CIを利用することにしました。
GitHubのmasterにマージしてDatabricksに反映されたものを、バッチスクリプトに利用します。 -
DatabricksのWorkspaceとローカルPCをDatabricksCLIで同期
開発の流れは、下記のようにしました。- GitHubのmasterからローカルPCへpull。ブランチを作成して開発開始
- 完成したら、Databricksで稼働を確認
- GitHubへPull request
Databricksの個人Workspaceにmasterのnotebookをコピーする手もありますが、Databricksの編集機能が弱い(置換ができない、文章補完が遅い等)こと、GitHubとの連携が容易で最新masterの使用を担保しやすいこともあり、上記運用になりました。
-
GitHub の Issue と Pull request にテンプレを設定
開発の背景や概要、レビューしてほしいことなど、入力必須な項目をテンプレ化しました。連携前は、slackやnotebook内のコメントなど、複数のチャネルに情報が分散してわかりにくい状況でした。
連携の際に一つ注意点です。
GitHubで差分を把握するには .py 形式での保存が必要です。
DatabricksCLIでローカルにファイルをダウンロードする場合、自動的に.pyが付与されますが、Databricks上でGitHubにpushする場合、入力が任意となりますのでご留意ください。
Circle CIの連携手順
では、連携の具体的な手順をご紹介します。
ここではCircle CIの説明は省きますが、こちらがわかりやすかったです。
GitHubのリポジトリを作成する
まずはリポジトリを作成します。
.ymlファイルを追加する
リポジトリページで.circleci/config.ymlという名前で新規ファイルを作成します。
ファイルには、circle ciの設定情報を記載します。下記サンプルは最もベーシックな内容です。必要に応じて、設定を追記してください。
version: 2
jobs:
build:
docker: # See https://docs.docker.com/get-started/#docker-concepts if you are new to Docker.
- image: circleci/ruby:2.4.1
steps:
- checkout
- run: echo "A first hello"
Databricksのtokenを取得する
- User settings > Access Tokensから Generate New Tokenを押下
-
Lifetime (days)にTokenの有効期間を入力し、tokenを発行する
※表示されるtokenは、一度しか表示されないので、忘れずに控えてください
ビルドをCircle CI上でセットアップする
- サインアップページから”Start with GitHub”をクリックし、アカウントを作成します
- 「ADD PROJECTS」から対象リポジトリを選択し、Start Buildボタンをクリックします
プロジェクトにDatabricksのtokenを入力する
- 「JOBS」から対象プロジェクトの歯車ボタンを押下し、設定に移動します
- BUILD SETTINGS の Environment Variablesを選択します
- Add Variablesボタンを押下し、
Nameに「DATABRICKS_TOKEN」、Valueにtokenを入力します
これで、GitHubとCircle CIとの連携は完了です。
DatabricksCLIの設定手順
次に、DatabricksCLIの設定手順です。
pipでDatabricksCLIをインストール
$ pip install databricks-cli
configにHostとtokenを設定する
DatabricksCLIのconfigにHostとtokenを設定します。
ターミナルからconfigを呼び出し(一番上を実行する)、Hostと先ほど発行したtokenを入力してください。
$ databricks configure --token
>>Databricks Host (should begin with https://): https://<your-host>.cloud.databricks.com/ # アクセスしているhost名を貼る
>>Token: # tokenを貼る
以上でDatabricksCLIの設定は完了です。
改善できたところ
上記の設定を経て、ローカルでの開発&GitHubでのレビューに変更したおかげで、
- 変更の差分がわかりやすくなった
- テンプレの導入で、コミュニケーションコストが大幅に減った
- 開発の背景を含めて履歴を残せるようになり、タスク管理や確認が容易になった
と、かなりレビューしやすくなりました。やはり、GitHubは便利ですね。
差分が把握しやすくなったのは地味に嬉しいですが、レビューの視点をnotebook単位からIssue単位へ引き上げることができたのが、最もよかったです。
課題
次に課題。コーディングと実行のインターフェースが違うことです。
わかってたことですが、コーディングしてすぐに試せないのは結構ストレスです。
当初、pycharmを使ってローカルPCでコードの実行もできるよう構想してたのですが、両者の環境を同期するのは困難と判断し、今に至っています。
まとめ
Databricks単体の開発は、個人のアドホック分析には強いのですが、複数人の開発では余分なコミュニケーションコストが発生し、最適手とは言えません。
GitHubと連携することで、Databricksの良さを生かしたまま、開発の見通しがよくなりました。
今後、コーディングとコードの実行をワンストップでできる方法を模索できればと思います。