DBFSとUnity Catalogのベストプラクティス

[Best practices for DBFS and Unity Catalog \| Databricks on AWS](https://docs.databricks.com/dbfs/unity-catalog.html) [2022/8/25時点]の翻訳です。

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

Unity Catalogは、DBFSとは完全に異なるデータガバナンスアプローチをとっている新たな設定とコンセプトを数多く導入します。本書では、Unity Catalogの外部ロケーションとDBFSの取り扱いにおける幾つかのベストプラクティスを説明します。

Unity Catalogが有効化されたDatabricksワークスペースにおけるほとんどのユースケースにおいて、DBFSとマウントされたクラウドオブジェクトストレージの使用はお勧めしません。Unity Catalogにファイルや格納データを移行しない場合、Unity CatalogとDBFSを組み合わせて使用することはお勧めしません。

# Unity Catalogが有効化されたワークスペースではDBFSはどのように使われますか？

[DBFSルート](https://qiita.com/taka_yayoi/items/406b639a9dcd43dbcc54)は、ワークスペーススコープの`hive_metastore`でのマネージドテーブルの作成を含む、Databricksワークスペースにおける数多くのアクションに関係するファイルを格納する[デフォルトのロケーション](https://qiita.com/taka_yayoi/items/21a8b99665e1b8ffe1ca)です。`hive_metastore`のテーブルに対して実行されるアクションは、DBFSによって管理されるデータとストレージ資格情報を含むレガシーなデータアクセスパターンを使用します。

# シングルユーザーアクセスモードでDBFSはどのように動作しますか？

シングルユーザーアクセスモードが設定されたクラスターは、DBFSルートと[マウントされたデータ](https://docs.databricks.com/dbfs/mounts.html)の全てのファイルを含むDBFSに対してフルアクセスを持ちます。FUSEはこのアクセスモードでのみ使用でき、Unity Catalogデータセットに対するアクセスを必要とするMLワークロードで選択することができます。

DBFSとUnity Catalogによって管理されるデータへのアクセスを必要とするプロダクションワークロードにおいては、スケジュールされたジョブのサービスプリンシパルとシングルユーザーアクセスモードを使用することをお勧めします。

# 共有アクセスモードでDBFSはどのように動作しますか？

共有アクセスモードは、Unity CatalogのデータガバナンスとDatabricksのレガシーなテーブルACLを組み合わせたものです。`hive_metastore`のデータアクセスは、明示的に許可された権限を持つユーザーにのみ限定されます。

DBFSを用いて直接ファイルを操作するには、`ANY FILE`権限が許可されている必要があります。`ANY FILE`は`hive_metastore`のレガシーテーブルACLのバイパスを可能にし、DBFSによって管理される全てのデータにアクセスできるので、この権限を付与する際には注意することをお勧めします。

共有アクセスモードではFUSEはサポートされません。

# シングルユーザーアクセスモードでUnity Catalogクラスターを起動してDBFSを使用してください

外部ストレージに保存されているinitスクリプト、設定、ライブラリに対してはDBFSマウントを使用することをお勧めします。この挙動は共有アクセスモードではサポートされていません。

# Unity Catalogの外部ロケーションでDBFSを使用しないでください

Unity Catalog(UC)は、管理されたオブジェクトストレージのディレクトリの権限を特定するために、完全なクラウドURIパスを用いることで外部ロケーションのデータへのアクセスを保護します。DBFSマウントは、Unity Catalogを完全にバイパスする全く異なるデータアクセスモデルを使用しています。DBFSマウントとUCの外部ボリュームでクラウドオブジェクトストレージのボリュームを再利用しないことをお勧めします。

# Unity Catalogマネージドストレージの保護

それぞれのUnity Catalogのメタストアには、Databricksアカウント管理者によって設定されたオブジェクトストレージのアカウントが割り当てられます。Unity Catalogは、Unity Catalogが管理するテーブルの全てのデータとメタデータをこの場所に格納します。

Unity Catalogメタストアのストレージアカウントは、

- Unity Catalog用に新規に作成される必要があります。
- Unity Catalogによって定義されたカスタムアイデンティティポリシーを持つ必要があります。
- Unity Catalogのみによってアクセスされるべきです。
- Unity Catalog向けに作成されたアイデンティティアクセスポリシーを用いてアクセスされるべきです。

# 既存データを外部ロケーションに追加する

外部ロケーションを用いてUnity Catalogに既存のストレージアカウントをロードすることができます。セキュリティを最大化するために、全てのストレージ資格情報とアクセスパターンを削除したのちに、ストレージアカウントを外部ロケーションにロードすることをお勧めします。

DBFSルートとして使用されているストレージアカウントを、Unity Catalogの外部ロケーションとしてロードすることは絶対にやめてください。

# Unity Catalogのファイルシステムアクセスによってクラスター設定は無視されます

Unity Catalogはクラスターのファイルシステム設定を考慮しません。これは、クラウドオブジェクトストレージに対するカスタム挙動のためのHadoopファイルシステム設定は、Unity Catalogを用いてアクセスする際には動作しないことを意味します。

# 複数のパスアクセスに関する制限

Unity CatalogとDBFSを一緒に使用することはできますが、異なるアクセス手段を用いた同じコマンドあるいはノートブックセルで、同じパスや親子関係を共有するパスを参照することはできません。

例えば、ロケーション`a/b/c`にある、`hive_metastore`に定義されているサンプルのテーブル`foo`と、Unity Catalogで`a/b/`に定義されている外部ロケーションがある場合、以下のコードはエラーとなります。

```py:Python
spark.read.table("foo").filter("id IS NOT NULL").write.mode("overwrite").save("a/b/c")
```

上のロジックを2つのセルに分割した際にはエラーは起きません。

```py:Python
df = spark.read.table("foo").filter("id IS NOT NULL")
```

```py:Python
df.write.mode("overwrite").save("a/b/c")
```

### Databricks 無料トライアル

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