Databricksにおけるデータとストレージの取り扱い

[Where’s my data? \| Databricks on AWS](https://docs.databricks.com/storage/index.html) [2023/125時点]の翻訳です。

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

Databricksでは、お使いのクラウドアカウントにおけるブロックストレージとオブジェクトストレージロケーションの作成、設定、アクセスに共有責任モデルを採用しています。Databricksにおけるデータのロードやデータの保存は、ブロックストレージかオブジェクトストレージに対して行われます。以下のマトリクスではクイックリファレンスを示しています。

| オペレーション | ロケーション |
|:--|:--|
|UIによるデータアップロード   | オブジェクトストレージ  |
|DBFSへのファイルアップロード   |オブジェクトストレージ   |
|Auto Loaderによるデータのアップロード   | オブジェクトストレージ  |
|`COPY INTO`によるデータのアップロード   | オブジェクトストレージ  |
|テーブルの作成   | オブジェクトストレージ  |
|Apache Sparkによるデータの保存   | オブジェクトストレージ  |
|pandasによるデータの保存   |  ブロックストレージ |
|ノートブックを用いてwebからデータをダンロード   | ブロックストレージ  |

# オブジェクトストレージとは？

クラウドコンピューティングにおいて、オブジェクトストレージやblobストレージはデータをオブジェクトとして保持するストレージコンテナのことを指し、それぞれのオブジェクトはデータ、メタデータ、グローバルにユニークな識別子(URI)から構成されます。オブジェクトストレージにおけるデータ操作のオペレーションは多くの場合、REST APIインタフェースを通じた作成、読み込み、更新、削除(CRUD)に限定されます。いくつかのオブジェクトストレージは、バージョン管理やライフサイクル管理のような機能を提供しています。オブジェクトストレージには以下のメリットがあります:

- 高い可用性、堅牢性、信頼性。
- 他の多くのストレージオプションと比較して低いストレージコスト。
- 無限にスケール(クラウドの特定のリージョンで利用できるストレージの総量に制限されます)。

多くのクラウドベースのデータレイクは、クラウドオブジェクトストレージにおけるオー文ソースデータフォーマットを基盤として構築されます。

# Databricksではオブジェクトストレージをどのように使うのか？

オブジェクトストレージは、Databricksのほとんどのオペレーションで使用される主要なストレージとなります。Databricksファイルシステム([DBFS](https://qiita.com/taka_yayoi/items/897264c486e179d72247))によって、Databricksユーザーは他のファイルシステムと同じように、オブジェクトストレージのオブジェクトのファイルを操作することができます。[外部のデータシステム](https://qiita.com/taka_yayoi/items/09348912a92a24441c40)に対するテーブルを設定しない限り、Databricksで作成されるすべてのテーブルのデータはクラウドオブジェクトストレージに格納されます。

クラウドオブジェクトストレージに格納されるDelta Lakeのファイルは、Databricksレイクハウスのデータ基盤となります。

# Databricksではどのようにクラウドオブジェクトストレージを設定するのか？

Databricksでは、データファイルとテーブルを格納するためにクラウドオブジェクトストレージを活用します。ワークスペースをデプロイする際、Databricksは[DBFSルート](https://qiita.com/taka_yayoi/items/406b639a9dcd43dbcc54)と呼ばれるクラウドオブジェクトストレージロケーションを設定します。お使いのアカウントの他のクラウドオブジェクトストレージロケーションへの接続を設定することができます。

ほぼすべてのケースにおいて、DatabricksでApache Sparkを用いて操作するデータファイルはクラウドオブジェクトストレージに格納されます。接続を設定する際のガイダンスについては以下の記事をご覧ください:

- [Working with data in Amazon S3](https://docs.databricks.com/storage/amazon-s3.html)
- [Access Azure Data Lake Storage Gen2 and Blob Storage](https://docs.databricks.com/storage/azure-storage.html)
- [Google Cloud Storage](https://docs.databricks.com/storage/gcs.html)
- [Accessing Azure Data Lake Storage Gen1 from Databricks](https://docs.databricks.com/storage/azure-datalake.html)

# ブロックストレージとは？

クラウドコンピューティングにおいて、ブロックストレージやディスクストレージは、単に「ハードドライブ」とも呼ばれる従来型のハードディスクドライブ(HDD)やソリッドステートドライブ(SSD)を指します。クラウドコンピューティング環境にブロックストレージをデプロイする際、通常は1つ以上の物理ドライブの論理的なパーティションがデプロイさmれます。製品やクラウドベンダーによって実装が若干異なりますが、多くの場合、以下のような特性が共通しています。

- すべての仮想マシン(VM)はアタッチされたブロックストレージボリュームを必要とします。
- ブロックストレージボリュームが永続化されている限り、ブロックストレージボリュームにインストールされたファイルやプログラムは永続化されます。
- ブロックストレージボリュームは多くの場合、一時的なデータストレージとして使用されます。
- VMにアタッチされたブロックストレージボリュームは通常VMとともに削除されます。

# Databricksではブロックストレージをどのように使うのか？

計算リソースを起動する際、DatabricksはVMをデプロイし、ブロックストレージボリュームをアタッチします。このブロックストレージは、計算資源の寿命における一時的データファイルの格納に用いられます。これらのファイルには、オペレーティングシステム、インストールされたライブラリ、[ディスクキャッシュ](https://qiita.com/taka_yayoi/items/395fb7fabad655ceb37c)で用いられるデータが含まれます。Apache Sparkは効率的な並列処理やデータロードのためにバックグラウンドでブロックストレージを使用しますが、Databricksで実行されるコードのほとんどはブロックストレージに対して直接データの読み書きをしません。

お使いのドライバーノードにアタッチされたブロックストレージを使用するPythonやBashコマンドのような任意のコードを実行することができます。[ドライバーのファイルシステムのファイルにアクセスする](https://qiita.com/taka_yayoi/items/45bfc7ac322571acadf5#%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B)をご覧ください。

ワークスペースファイルが有効化されたワークスペースでは、Pythonユーザーはドライバーのブロックストレージを操作することなしに、ノートブックと一緒に格納されているファイルやデータを読み書きすることができます[プログラムでDatabricksワークスペースのファイルを操作する](https://qiita.com/taka_yayoi/items/14c74e07f41d4e93ee45)をご覧ください。

### Databricks 無料トライアル

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