Python開発者向けDatabricksのご紹介

[Databricks for Python developers \| Databricks on AWS](https://docs.databricks.com/languages/python.html) [2022/11/3時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

本書では、Python言語を用いたDatabricksにおけるノートブックやジョブの開発に対するガイドを提供します。最初のサブセクションでは、一般的なワークフローやタスクに関するチュートリアルへのリンクを提供します。二つ目のサブセクションでは、API、ライブラリ、キーとなるツールへのリンクを提供します。

スタートする際の基本的なワークフローは以下となります。

- [コードのインポート](#ノートブックとdatabricks-reposによるコード管理): ファイルやGitリポジトリからご自身のコードをインポートするか、以下に示すチュートリアルをトライします。インタラクティブなDatabricksノートブックを用いて学習を行うことをお勧めします。
- [クラスターにおけるコードの実行](#クラスターとライブラリ): ご自身でクラスターを作成するか、共有クラスターを使用する権限を持っていることを確認します。ノートブックをクラスターにアタッチし、ノートブックを実行します。
- さらに、より固有のトピックに分岐することができます。
    - Apache Sparkを用いて[より大規模なデータセットを操作](#python-api)する。
    - [ビジュアライゼーションの追加](#ビジュアライゼーション)
    - ジョブとして[ワークロードを自動化](#ジョブ)。
    - データを分析するために[機械学習を活用](#機械学習)。
    - [IDEによる開発](#ide開発ツールapi)

# チュートリアル

以下のチュートリアルでは、一般的なワークフローを学ぶためのサンプルコードとノートブックを提供しています。ワークスペースにサンプルノートブックをインポートする手順に関しては、[ノートブックのインポート](https://qiita.com/taka_yayoi/items/c306161906d6d34e8bd5#%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88)をご覧ください。

## インタラクティブなデータサイエンスと機械学習

- データオペレーションと分析のためにApache Sparkデータフレームを使い始めます: [チュートリアル：DatabricksでPySparkデータフレームを操作する](https://qiita.com/taka_yayoi/items/6cf24cd4ad921aa61356)
- チュートリアル: [Databricksにおける機械学習モデル構築のエンドツーエンドのサンプル](https://qiita.com/taka_yayoi/items/f48ccd35e0452611d81b)。その他のサンプルに関しては、[Tutorials: Get started with ML](https://docs.databricks.com/machine-learning/tutorial/index.html)とMLflowガイドの[Quickstart Python](https://docs.databricks.com/mlflow/quick-start-python.html)をご覧ください。
- [Databricks AutoML](https://qiita.com/taka_yayoi/items/0ed860131a02aeade14f)を用いることで、お使いのデータセットに対する機械学習モデルの開発をクイックにスタートすることができます。Databricks AutoMLのガラスボックスアプローチによって、クローン、修正、再実行できる完全な機械学習ワークフローを含むノートブックを生成します。

## データエンジニアリング

- [チュートリアル：DatabricksでPySparkデータフレームを操作する](https://qiita.com/taka_yayoi/items/6cf24cd4ad921aa61356)では、データ準備と分析のために使うApache Sparkデータフレームに関して学ぶ役に立つウォークスルーを提供しています。
- [Tutorial: Delta Lake](https://docs.databricks.com/delta/tutorial.html)
- [Delta Live Tablesクイックスタート](https://qiita.com/taka_yayoi/items/7fe8ed2c2f95fd53cc3d)は、高信頼データパイプラインを構築、管理するためのDelta Live TablesのウォークスルーとPythonのサンプルを提供しています。

## プロダクションの機械学習と機械学習オペレーション

- [MLflow Model Registry example](https://docs.databricks.com/mlflow/model-registry-example.html)
- [Databricksにおける機械学習モデル構築のエンドツーエンドのサンプル](https://qiita.com/taka_yayoi/items/f48ccd35e0452611d81b)

## Pythonノートブックのデバッグ

以下のサンプルノートブックでは、DatabrikcksノートブックでPythonデバッガー(pdb)をどの様に使うのかを説明しています。Pythonデバッガーを使うには、Databricksランタイム11.2以降が必要となります。

### Pythonデバッガーサンプルノートブック

https://github.com/taka-yayoi/public_repo_2/blob/master/python_debugger/Debugging%20Examples.py

:::note
**注意**
`breakpoint()`は[IPythonでサポートされておらず](https://github.com/ipython/ipykernel/issues/897)、Databricksノートブックでは動作しません。`breakpoint()`の代わりに`import pdb; pdb.set_trace()`を使うことができます。
:::

# リファレンス

以降のサブセクションでは、DatabricksでPythonを用いた開発を始める際に役立つキーの機能とティップスを説明しています。

## Python API

Databricksの外で動作するPythonコードは、通常はDatabricks内で実行することができ、逆もまた然りです。既存コードがあるのであれば、スタートするにはDatabricksにインポートするだけです。詳細に関しては、[ノートブックとDatabricks Reposによるコード管理](#ノートブックとdatabricks-reposによるコード管理)をご覧ください。

Databricksは、シングルマシンと分散Pythonワークロードの両方で実行することができます。シングルマシンの処理においては、通常通りPython APIとライブラリを使用することができます。例えば、pandasやscikit-learnは「普通に動作します」。分散Pythonワークロードに関しては、Databricksはすぐに利用できる2つの人気のあるAPIを提供します。Pandas API on SparkとPySparkです。

### SparkにおけるPandas API

:::note
**注意**
[Koalasオープンソースプロジェクト](https://koalas.readthedocs.io/)では、Pandas API on Sparkに切り替えることを推奨しています。Pandas API on Sparkは[Databricks Runtime 10\.0 \(Unsupported\)](https://docs.databricks.com/release-notes/runtime/10.0.html)以降で使用することができます。[Databricks Runtime 9\.1 LTS](https://docs.databricks.com/release-notes/runtime/9.1.html)以前が実行されているクラスターにおいては、代わりに[Koalas](https://docs.databricks.com/languages/koalas.html)を使ってください。
:::

[pandas](https://pandas.pydata.org/)は、データ分析やデータ操作を行うデータサイエンティストで広く使われているPythonパッケージです。しかし、pandasはビッグデータに対してスケールしません。[Pandas API on Spark](https://docs.databricks.com/languages/pandas-spark.html)は、Apache Spark上で動作するpandasと同等のAPIを提供することでこのギャップを埋めます。この[オープンソースのAPI](https://spark.apache.org/docs/latest/api/python/user_guide/pandas_on_spark/index.html)は、pandasには慣れているがApache Sparkには慣れていないデータサイエンティストにとっては理想的な選択肢となります。

### PySpark API

PySparkはApache Sparkに対する公式のPython APIです。このAPIはPandas API on Sparkよりも優れた柔軟性を提供します。

- [チュートリアル：DatabricksでPySparkデータフレームを操作する](https://qiita.com/taka_yayoi/items/6cf24cd4ad921aa61356)
- [Introduction to Structured Streaming](https://docs.databricks.com/structured-streaming/examples.html)
- [PySpark API reference](https://spark.apache.org/docs/latest/api/python/)

## ノートブックとDatabricks Reposによるコード管理

[Databricksノートブック](https://qiita.com/taka_yayoi/items/24a897cf40bba6d9e305)はPythonをサポートしています。これらのノートブックはJupyterと同じ様な機能を提供しますが、ビッグデータを用いたビルトインのビジュアライゼーション、デバッグやパフォーマンス監視のためのApache Sparkインテグレーション、機械学習エクスペリメントのトラッキングのためのMLflowインテグレーションのような機能が追加されています。[ノートブックをインポート](https://qiita.com/taka_yayoi/items/c306161906d6d34e8bd5#%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88)することから始めましょう。クラスターへのアクセス権を得たら、クラスターに[ノートブックをアタッチ](https://docs.databricks.com/notebooks/notebooks-use.html#attach)し、[ノートブックを実行](https://qiita.com/taka_yayoi/items/dfb53f63aed2fbd344fc#%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B)します。

:::note
**ティップス**
ノートブックの状態を完全にリセットするには、iPythonカーネルを再起動することが有用です。Jupyterのユーザーにとっての、Jupyterの「カーネルの再起動」オプションは、Databrikcsにおけるノートブックのデタッチ、再アタッチに該当します。Pythonノートブックでカーネルを再起動するには、左上のクラスタードロップダウンをクリックし、**Detach & Re-attach**をクリックします。これによって、ノートブックがクラスターからデタッチ・再アタッチされ、Pythonプロセスが再起動します。
:::

[Databricks Repos](https://qiita.com/taka_yayoi/items/b89f199ff0d3a4c16140)を用いることで、ユーザーはノートブックや他のファイルをGitリポジトリと同期できる様になります。Databricks Reposはコードのバージョン管理やコラボレーションの役に立ち、コードのすべてのリポジトリのDatabricksへのインポート、過去のノートブックのバージョンの参照、IDE開発とのインテグレーションをシンプルにします。[リモートGitリポジトリのクローン](https://docs.databricks.com/repos/git-operations-with-repos.html)からスタートしましょう。リポジトリクローンでノートブックをオープンするか作成し、クラスターに[ノートブックをアタッチ](https://docs.databricks.com/notebooks/notebooks-use.html#attach)し、[ノートブックを実行](https://qiita.com/taka_yayoi/items/dfb53f63aed2fbd344fc#%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B)します。

## クラスターとライブラリ

Databricksクラスターは、シングルノードクラスターから大規模クラスターに至る任意のサイズでのクラスターの計算資源の管理を行います。必要に応じてクラスターのハードウェアやライブラリをカスタマイズすることができます。通常データサイエンティストは、[クラスターを作成](https://qiita.com/taka_yayoi/items/d36a469a1e0c0cebaf1b)するか既存の[共有クラスター](https://qiita.com/taka_yayoi/items/991aae376c089df58504#%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E6%A8%A9%E8%A8%AD%E5%AE%9A)を使用するところから作業を開始します。クラスターにアクセスできる様になったら、クラスターに[ノートブックをアタッチ](https://docs.databricks.com/notebooks/notebooks-use.html#attach)し、クラスターで[ジョブを実行](https://qiita.com/taka_yayoi/items/b3275a1983c51a8bbe1a#%E3%82%B8%E3%83%A7%E3%83%96%E3%81%AE%E4%BD%9C%E6%88%90)します。

- シングルノードのみを必要とする小規模なワークロードにおいては、データサイエンティストはコストを節約するために[シングルノードクラスター](https://qiita.com/taka_yayoi/items/6e7c6cc14a5017ef6d15)を活用することができます。
- 詳細なティップスについては、[Databricksクラスター設定のベストプラクティス](https://qiita.com/taka_yayoi/items/ef3dc37143e7b77b50ad)をご覧ください。
- 管理者は、クラスター作成をシンプルにしガイドするために[クラスターポリシー](https://qiita.com/taka_yayoi/items/93d7597d7fc739b48bb7)をセットアップすることができます。

Databricksクラスターは、Apache Spark、Delta Lake、pandasを含む人気のある数多くのライブラリをすぐに利用できる様にこれらを提供するDatabricksランタイムを使用します。また、ノートブックやジョブで使用できる様に追加のサードパーティライブラリやカスタムPythonライブラリをインストールすることができます。

- [Databricksランタイム](https://docs.databricks.com/runtime/dbr.html)のデフォルトライブラリからスタートします。機械学習ワークロードには[Databricks機械学習ランタイム](https://qiita.com/taka_yayoi/items/824b507019d3ade7eedc)を使用します。事前インストールされているライブラリの完全な一覧に関しては、[Databricks runtime releases](https://docs.databricks.com/release-notes/runtime/releases.html)をご覧ください。
- PyPIや他のリポジトリにあるライブラリを用いてノートブックやジョブの環境を変更することができる、[ノートブックスコープPythonライブラリ](https://qiita.com/taka_yayoi/items/d3a46efdc1ad01a581d0)を用いて環境をカスタマイズします。`%pip install my_library`マジックコマンドは、あなたが現在アタッチしているクラスターのすべてのノードに`my_library`をインストールしますが、共有クラスターの他のワークロードには干渉しません。
- 必要に応じて非Pythonのライブラリを[クラスターライブラリ](https://qiita.com/taka_yayoi/items/9407356caadea3dfb47c)としてインストールします。
- 詳細に関しては、[ライブラリ](https://qiita.com/taka_yayoi/items/0c7fc7d741aad34bf9d4)をご覧ください。

## ビジュアライゼーション

DatabricksのPythonノートブックには様々なタイプの[ビジュアライゼーション](https://qiita.com/taka_yayoi/items/b3f7bd30907967afee17)のビルトインサポートがあります。また、[レガシーなビジュアライゼーション](https://qiita.com/taka_yayoi/items/36a307e79e9433121c38)を使うこともできます。

また、サードバーティライブラリを使ってデータを可視化することができます。いくつかはDatabricksランタイムに事前インストールされていますが、カスタムライブラリをインストールすることもできます。有名な選択肢には以下の様なものがあります。

- [Bokeh](https://qiita.com/taka_yayoi/items/5dc796aa7ceb33a5d5c6)
- [matplotlib](https://qiita.com/taka_yayoi/items/0579afe1227f7ac7a473)
- [Plotly](https://docs.databricks.com/notebooks/visualizations/plotly.html)

## ジョブ

[Databricksジョブ](https://qiita.com/taka_yayoi/items/b3275a1983c51a8bbe1a)を用いることで、Pythonワークロードをスケジューリングあるいは起動することができます。ジョブでは、ノートブック、Pythonスクリプト、Python wheelsを実行することができます。

- UIからのジョブ作成方法については、[ジョブの作成](https://qiita.com/taka_yayoi/items/b3275a1983c51a8bbe1a#%E3%82%B8%E3%83%A7%E3%83%96%E3%81%AE%E4%BD%9C%E6%88%90)をご覧ください。
- [Jobs API 2\.1](https://docs.databricks.com/dev-tools/api/latest/jobs.html)を用いて、ジョブの作成、編集、削除が可能です。
- [Jobs CLI](https://docs.databricks.com/dev-tools/cli/jobs-cli.html)を用いることで、Jobs APIを呼び出すための便利なコマンドラインインタフェースを使用することができます。

:::note
**ティップス**
ノートブックではなくPythonスクリプトをスケジューリングする際、create jobのリクエストボディの`tasks`の下の`spark_python_task`フィールドを使用します。
:::

## 機械学習

Databricksでは、表形式データに対する従来の機械学習(ML)、コンピュータービジョンに対するディープラーニング、自然言語処理、レコメンデーションシステム、グラフ解析などを含むさまざまな機械学習ワークロードをサポートしています。Databricksにおける機械学習の一般的な情報については、[Databricks機械学習ガイド](https://qiita.com/taka_yayoi/items/2d8ebdc9374696b24e0f)をご覧ください。

MLアルゴリズムに関しては、scikit-learn、TensorFlow、Keras、PyTorch、Apache Spark MLlib、XGBoostのような人気のあるPythonツールを含む[Databricks機械学習ランタイム](https://qiita.com/taka_yayoi/items/824b507019d3ade7eedc)に事前インストールされているライブラリを使うことができます。[カスタムライブラリをインストール](https://qiita.com/taka_yayoi/items/0c7fc7d741aad34bf9d4)することもできます。

機械学習オペレーション(MLOps)に関しては、DatabricksではオープンソースライブラリであるMLflowのマネージドサービスを提供しています。[MLflowトラッキング](https://qiita.com/taka_yayoi/items/c6907e2b861cb1070f4d#mlflow)を用いることで、モデルの開発を記録し、再利用なフォーマットでモデルを保存することができます。[MLflowモデルレジストリ](https://qiita.com/taka_yayoi/items/e7a4bec6420eb7069995)を用いることで、モデルのプロダクションへのプロモートを管理、自動化することができます。そして、[ジョブ](https://qiita.com/taka_yayoi/items/b3275a1983c51a8bbe1a)と[サーバレスリアルタイム推論](https://docs.databricks.com/mlflow/serverless-real-time-inference.html)によるモデルサービングや、[クラシックMLflowモデルサービング](https://qiita.com/taka_yayoi/items/b5a5f83beb4c532cf921)を用いることで、バッチやストリーミングジョブ、RESTエンドポイントとしてモデルをホストすることができます。詳細とサンプルに関しては、[Databricks MLflowガイド](https://qiita.com/taka_yayoi/items/1a4e82f7e20c56ba4f72)や[MLflow Python API docs](https://mlflow.org/docs/latest/python_api/index.html)をご覧ください。

一般的な機械学習ワークロードをスタートするには、以下のページを参照ください。

- MLflowによるscikit-learnのトレーニングとトラッキング: [10分チュートリアル: scikit-learnを用いたDatabricksにおける機械学習](https://qiita.com/taka_yayoi/items/f48ccd35e0452611d81b)
- ディープラーニングモデルのトレーニング: [Deep learning](https://docs.databricks.com/machine-learning/train-model/deep-learning.html)
- ハイパーパラメーターチューニング: [Parallelize hyperparameter tuning with scikit\-learn and MLflow](https://docs.databricks.com/machine-learning/automl-hyperparam-tuning/hyperopt-spark-mlflow-integration.html)
- グラフ解析: [GraphFrames user guide \- Python](https://docs.databricks.com/integrations/graphframes/user-guide-python.html)

## IDE、開発ツール、API

DatabricksノートブックでPythonコードを開発することに加え、PyCharm、Jupyter、Visual Studio Codeのような外部の統合開発環境(IDE)を用いて開発を行うことができます。外部の開発環境とDatabrikcsの間で成果物を同期するにはいくつかの選択肢があります。

- **コード**: Gitを用いてコードを同期することができます。[Databricks ReposによるGit連携](https://qiita.com/taka_yayoi/items/b89f199ff0d3a4c16140)をご覧ください。
- **ライブラリとジョブ**: 外部で(wheelsのような)ライブラリを作成し、Databricksにアップロードすることができます。これらのライブラリは、Databricksノートブックでインポートすることができ、ジョブ作成に使用することもできます。[Databricksにおけるライブラリ管理](https://qiita.com/taka_yayoi/items/0c7fc7d741aad34bf9d4)や[Databricksにおけるジョブ管理](https://qiita.com/taka_yayoi/items/b3275a1983c51a8bbe1a)をご覧ください。
- **リモードマシンでの実行**: インタラクティブな開発やテストのためにローカルのIDEからコードを実行することができます。IDEはDatabricksクラスターで大規模な計算処理を実行するために、Databricksとコミュニケーションすることができます。この接続を生成するためにどの様に[Databricks Connect](https://qiita.com/taka_yayoi/items/a9781c0a871a5a4fcf2e)を使うのかを学ぶには、[Use IDEs with Databricks](https://docs.databricks.com/dev-tools/index-ide.html)をご覧ください。

Databricksでは、自動化と外部のツールとの連携をサポートするREST APIの完全なセットを提供しています。クラスター、ライブラリ、コードや他のワークスペースオブジェクト、ワークロードやジョブの様なリソースを管理するためにAPIを活用することができます。[REST API \(latest\)](https://docs.databricks.com/dev-tools/api/latest/index.html)をご覧ください。

IDE、開発ツール、APIの詳細については、[Developer tools and guidance](https://docs.databricks.com/dev-tools/index.html)をご覧下さい。

## その他のリソース

- [Databricks Academy](https://databricks.com/learn/training/home)では、数多くのトピックに対するセルフペース、インストラクター指導のコースを提供しています。
- PySparkとpandasの相互運用性をサポートする機能
    - [Databricksにおけるpandas function API](https://qiita.com/taka_yayoi/items/0fe6534824797b630176)
    - [DatabricksにおけるSpark pandasユーザー定義関数](https://qiita.com/taka_yayoi/items/b65197128ee698d87910)
    - [Convert between PySpark and pandas DataFrames](https://docs.databricks.com/spark/latest/spark-sql/spark-pandas.html)
- PythonとSQLデータベースの接続性
    - [Databricks SQL Connector for Python](https://docs.databricks.com/dev-tools/python-sql-connector.html)を用いることで、Databricksリソース上でSQLコマンドを実行するためにPythonコードを使用することができます。
    - [pyodbc](https://docs.databricks.com/dev-tools/pyodbc.html)を用いることで、ローカルのPythonコードからODBCを通じて、Databricksレイクハウスに格納されているデータに接続することができます。
- PythonワークロードをDatabricksに移行するためのFAQとティップス
    - [シングルノードのワークロードをDatabricksに移行する際の6つの疑問](https://qiita.com/taka_yayoi/items/4a8e1067e116caf13a53)
    - [Migrate production workloads to Databricks](https://docs.databricks.com/migration/production.html)
    - [Knowledge Base](https://kb.databricks.com/python/index.html)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)