DatabricksとGitHubを連携するお話

## はじめに
ここ数ヶ月、機械学習の前処理プロジェクトを前任から引き継ぎ、2人体制で開発を進めてきました。そこで課題になったのがコードレビューです。
今回は、DatabricksにGitHubを連携してレビューをすることになった経緯と、連携に必要な手順をご紹介しようと思います。

## 状況
【開発環境】
・ プラットフォーム： Databricks
・ 言語： pyspark

【課題】
Databricksは、Jupyter notebookライクなUIで、データをインタラクティブに確認・探索できたり、notebookをそのままバッチスクリプトとして利用できたりと、使い勝手の良いプラットフォームです。

2人体制に変わった当初は、Databricksのコメント機能などを利用して互いのコードをレビューしてました。
しかしながら、コード変更の差分が把握しにくく、開発中のコミュニケーションが分散しやすいこと、開発の背景やレビューの履歴を残しにくいことから、GitHubに連携して開発・レビューを進めることにしました。

ただし、GitHub連携が不十分（デフォルトはpullができない）なため、GitHubを使って開発するのは少々 ~~面倒~~ 工夫が必要な状況です。


## 工夫したところ
GitHub連携にあたり、工夫したのは以下です。

1. プロジェクトのnotebookをCircle CIに連携
   チームで導入されているCircle CIを利用することにしました。
GitHubのmasterにマージしてDatabricksに反映されたものを、バッチスクリプトに利用します。

2. DatabricksのWorkspaceとローカルPCをDatabricksCLIで同期
   開発の流れは、下記のようにしました。
    - GitHubのmasterからローカルPCへpull。ブランチを作成して開発開始
    - 完成したら、Databricksで稼働を確認
    - GitHubへPull request  
    
    Databricksの個人Workspaceにmasterのnotebookをコピーする手もありますが、Databricksの編集機能が弱い（置換ができない、文章補完が遅い等）こと、GitHubとの連携が容易で最新masterの使用を担保しやすいこともあり、上記運用になりました。

3. GitHub の Issue と Pull request にテンプレを設定
開発の背景や概要、レビューしてほしいことなど、入力必須な項目をテンプレ化しました。連携前は、slackやnotebook内のコメントなど、複数のチャネルに情報が分散してわかりにくい状況でした。

連携の際に一つ注意点です。
GitHubで差分を把握するには `.py` 形式での保存が必要です。
DatabricksCLIでローカルにファイルをダウンロードする場合、自動的に`.py`が付与されますが、Databricks上でGitHubにpushする場合、入力が任意となりますのでご留意ください。

## Circle CIの連携手順
では、連携の具体的な手順をご紹介します。
ここではCircle CIの説明は省きますが、[こちら](https://codezine.jp/article/detail/11208)がわかりやすかったです。

### GitHubのリポジトリを作成する
まずはリポジトリを作成します。

### .ymlファイルを追加する
リポジトリページで`.circleci/config.yml`という名前で新規ファイルを作成します。
ファイルには、circle ciの設定情報を記載します。下記サンプルは最もベーシックな内容です。必要に応じて、設定を追記してください。

```.circleci/config.yml
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を取得する
1. User settings > Access Tokensから Generate New Tokenを押下
2. `Lifetime (days)`にTokenの有効期間を入力し、tokenを発行する  
※表示されるtokenは、一度しか表示されないので、忘れずに控えてください


### ビルドをCircle CI上でセットアップする
1. サインアップページから”Start with GitHub”をクリックし、アカウントを作成します
2. 「ADD PROJECTS」から対象リポジトリを選択し、Start Buildボタンをクリックします


### プロジェクトにDatabricksのtokenを入力する
1. 「JOBS」から対象プロジェクトの歯車ボタンを押下し、設定に移動します
2. BUILD SETTINGS の Environment Variablesを選択します
3. 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を入力してください。

```Bash
$ databricks configure --token
>>Databricks Host (should begin with https://): https://<your-host>.cloud.databricks.com/ # アクセスしているhost名を貼る
>>Token:  # tokenを貼る
```

以上でDatabricksCLIの設定は完了です。


## 改善できたところ
上記の設定を経て、ローカルでの開発＆GitHubでのレビューに変更したおかげで、

1. 変更の差分がわかりやすくなった
2. テンプレの導入で、コミュニケーションコストが大幅に減った
3. 開発の背景を含めて履歴を残せるようになり、タスク管理や確認が容易になった

と、かなりレビューしやすくなりました。やはり、GitHubは便利ですね。
差分が把握しやすくなったのは地味に嬉しいですが、レビューの視点をnotebook単位からIssue単位へ引き上げることができたのが、最もよかったです。


## 課題
次に課題。コーディングと実行のインターフェースが違うことです。
わかってたことですが、コーディングしてすぐに試せないのは結構ストレスです。
当初、pycharmを使ってローカルPCでコードの実行もできるよう構想してたのですが、両者の環境を同期するのは困難と判断し、今に至っています。


## まとめ
Databricks単体の開発は、個人のアドホック分析には強いのですが、複数人の開発では余分なコミュニケーションコストが発生し、最適手とは言えません。
GitHubと連携することで、Databricksの良さを生かしたまま、開発の見通しがよくなりました。
今後、コーディングとコードの実行をワンストップでできる方法を模索できればと思います。