シングルノードのワークロードをDatabricksに移行する際の6つの疑問

[Migrate single node workloads to Databricks \| Databricks on AWS](https://docs.databricks.com/migration/single-node.html) [2022/1/24時点]の翻訳です。

> [Databricksクイックスタートガイド](https://qiita.com/taka_yayoi/items/125231c126a602693610)のコンテンツです。

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

本書では、シングルノードのワークロードをDatabricksに移行する際に生じる典型的な疑問に答えます。

# 20ノードのSparkクラスターを作成したのですが、私のpandasのコードが速くなりません。何が悪いのでしょうか？

シングルノードでの動作を前提としたライブラリを使用しており、Databricksに移行しても、これらは分散処理されません。Apache SparkのPython APIである[PySpark](https://spark.apache.org/docs/latest/api/python/index.html)を使ってご自身のコードを書き直す必要があります。

あるいは、Apache Sparkデータフレームのデータにアクセスするために、pandasデータフレームAPIを使用できる[Pandas API on Spark](https://qiita.com/taka_yayoi/items/db8e1ea52afe5c282c94)を活用することができます。

# 私が愛するアルゴリズムがsklearnにありますが、Spark MLではサポートしていません(例えば、DBSCAN)。どうすればこのアルゴリズムを使いつつSparkのメリットを活かせるのでしょうか？

- Sparkクラスターでタスクを分散するためのjoblibのApache Sparkバックエンドである[joblib\-spark](https://github.com/joblib/joblib-spark)を使用します。
- [pandasユーザー定義関数](https://qiita.com/taka_yayoi/items/b65197128ee698d87910)を使います。
- ハイパーパラメーターチューニングには[Hyperopt](https://docs.databricks.com/applications/machine-learning/automl-hyperparam-tuning/index.html)を使います。

# Spark MLにおけるデプロイメントオプションには何がありますか？

ベストなデプロイメントの選択肢はアプリケーションのレーテンシーの要件に依存します。

- バッチ予測に関しては、[推論、予測のためにモデルをデプロイする](https://docs.databricks.com/applications/machine-learning/model-inference/index.html)を参照ください。
- ストリーミングアプリケーションに関しては、[構造化ストリーミング](https://docs.databricks.com/spark/latest/structured-streaming/index.html)を参照ください。
- 低レーテンシーのモデル推論に関しては、[MLflowモデルサービング](https://qiita.com/taka_yayoi/items/b5a5f83beb4c532cf921)、あるいは[Amazon SageMaker](https://aws.amazon.com/sagemaker/)のようなクラウドプロバイダーのソリューションの活用を検討ください。

# pandasや他のライブラリをどのようにインストール、アップデートすることができますか？

ライブラリをインストール、アップデートする方法はいくつか存在します。

- クラスターを利用する全てのユーザーが使用するライブラリをインストール、アップデートするには[クラスターライブラリ](https://qiita.com/taka_yayoi/items/869158c7bd3ab7c45ff4)を使います。
- 特定のノートブックでのみPythonライブラリやライブラリのバージョンを使えるようにするには、[ノートブックスコープライブラリ](https://docs.databricks.com/libraries/notebooks-python-libraries.html)を使います。

# ドライバーノードからどのようにDBFSのデータを参照できますか？

ファイルパスの先頭に`/dbfs/`を追加してください。[ローカルファイルAPI](https://qiita.com/taka_yayoi/items/897264c486e179d72247#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%ABapi)をご覧ください。

# どのようにデータをDatabricksに取り込みますか？

- マウントします。[DBFSへのオブジェクトストレージのマウント](https://qiita.com/taka_yayoi/items/897264c486e179d72247#dbfs%E3%81%B8%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%81%B8%E3%81%AE%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88)をご覧ください。
- データタブを使います。[データのインポート、読み込み、変更](https://qiita.com/taka_yayoi/items/4fa98b343a91b8eaa480)をご覧下さい。
- `%sh wget`を使います。

    データファイルのURLを参照できるのであれば、Sparkドライバーノードにデータをインポートするために`%sh wget <url>/<filename>`を使用することができます。

:::note info
**注意**
セルの出力には、`Saving to: '<filename>'`と表示されますが、実際には、`file:/databricks/driver/<filename>`に保存されます。
:::

例えば、`https://data.cityofnewyork.us/api/views/25th-nujf/rows.csv?accessType=DOWNLOAD`のファイルを以下のコマンドでダウンロードしたとします。

```bash:Bash
%sh wget https://data.cityofnewyork.us/api/views/25th-nujf/rows.csv?accessType=DOWNLOAD
```

このデータをロードするには以下を実行します。

```py:Python
pandas_df = pd.read_csv("file:/databricks/driver/rows.csv?accessType=DOWNLOAD", header='infer')
```


### Databricks 無料トライアル

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