Databricksを用いてAzure Data Lake Storage Gen2とBlog Storageにアクセスする

[Accessing Azure Data Lake Storage Gen2 and Blob Storage with Databricks \| Databricks on AWS](https://docs.databricks.com/data/data-sources/azure/azure-storage.html) [2022/7/20時点]の翻訳です。

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

DatabricksからBlob StorageやAzure Data Lake Storage Gen2に接続するにはAzure Blob Filesystem driver (ABFS)を使います。クラスターに設定されたAzureサービスプリンシパルを用いることで、Azureストレージコンテナにセキュアにアクセスすることをお勧めします。

本書では、以下を用いてAzureストレージコンテナにアクセスする方法を説明します。

- Azureサービスプリンシパル
- SASトークン
- アカウントキー

以下の計算環境に対してこれらの認証情報を設定するために、Sparkプロパティを設定します。

- Databricksクラスタースコープ
- Databricksノートブックスコープ

また、Databricks SQLからAzureストレージにアクセスするために、Azureサービスプリンシパルを使うこともできます。[Configure access to cloud storage](https://docs.databricks.com/sql/user/security/cloud-storage-access.html)をご覧下さい。

すべての認証情報の格納には、[シークレットのスコープ](https://qiita.com/taka_yayoi/items/b9c046e7a9106f46873a)を使用することをお勧めします。

# Databricksからデータを格納し、アクセスする際の非推奨のパターン

今後Databricksでは、Databricksファイルシステムに外部のデータ格納場所をマウントすることをお勧めしません。[Mounting cloud object storage on Databricks](https://docs.databricks.com/data/mounts.html)をご覧ください。

レガシーなWindows Azure Storage Blob driver (WASB)は非推奨となります。ABFSにはWASBと比較して多くのメリットがあります。[Azure documentation on ABFS](https://docs.microsoft.com/azure/storage/blobs/data-lake-storage-abfs-driver)をご覧ください。レガシーなWASBドライバーの使い方に関するドキュメントは、[Connect to Azure Blob Storage with WASB \(legacy\)](https://docs.databricks.com/data/data-sources/azure/wasb-blob.html)をご覧ください。

Azureは[Azure Data Lake Storage Gen1](https://docs.microsoft.com/azure/data-lake-store/data-lake-store-overview)の間も無くのリタイアを発表しています。Databricksでは、Azure Data Lake Storage Gen1の全てをAzure Data Lake Storage Gen2に移行することをお勧めします。まだ移行していないのであれば、[Accessing Azure Data Lake Storage Gen1 from Databricks](https://docs.databricks.com/data/data-sources/azure/azure-datalake.html)をご覧ください。

# Blob StorageやAzure Data Lake Storage Gen2のABFS URIを用いたダイレクトアクセス

お使いのAzureストレージコンテナにアクセスするための認証情報を適切に設定しているのであれば、URIを用いてストレージアカウントのリソースとやり取りを行うことができます。より優れたセキュリティのために`abfss`ドライバーを使用することをお勧めします。

```py:Python
spark.read.load("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/<path-to-data>")

dbutils.fs.ls("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/<path-to-data>")
```

```sql:SQL
CREATE TABLE <database-name>.<table-name>;

COPY INTO <database-name>.<table-name>
FROM 'abfss://container@storageAccount.dfs.core.windows.net/path/to/folder'
FILEFORMAT = CSV
COPY_OPTIONS ('mergeSchema' = 'true');
```

# AzureサービスプリンシパルとOAuth 2.0を用いたAzure Data Lake Storage Gen2やBlob Storageへのアクセス

認証にAzure Active Directory (Azure AD)のアプリケーションサービスプリンシパルとOAuth 2.0を用いて、セキュアにAzureストレージアカウントのデータにアクセスすることができます。[Configure access to Azure storage with an Azure Active Directory service principal](https://docs.databricks.com/security/aad-storage-service-principal.html)をご覧ください。

```py:Python
service_credential = dbutils.secrets.get(scope="<scope>",key="<service-credential-key>")

spark.conf.set("fs.azure.account.auth.type.<storage-account>.dfs.core.windows.net", "OAuth")
spark.conf.set("fs.azure.account.oauth.provider.type.<storage-account>.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
spark.conf.set("fs.azure.account.oauth2.client.id.<storage-account>.dfs.core.windows.net", "<application-id>")
spark.conf.set("fs.azure.account.oauth2.client.secret.<storage-account>.dfs.core.windows.net", service_credential)
spark.conf.set("fs.azure.account.oauth2.client.endpoint.<storage-account>.dfs.core.windows.net", "https://login.microsoftonline.com/<directory-id>/oauth2/token")
```

以下を置き換えてください。

- `<scope>`をDatabricksのシークレットスコープ名で置き換え。
- `<service-credential-key>`をクライアントシークレットを含むキーの名前で置き換え。
- `<storage-account>`をAzureストレージアカウント名で置き換え。
- `<application-id>`をAzure Active Directoryアプリケーションの**Application (client) ID**で置き換え。
- `<directory-id>`をAzure Active Directoryアプリケーションの**Directory (tenant) ID**で置き換え。

# SASトークンを用いたAzure Data Lake Storage Gen2やBlob Storageへのアクセス

Azure Data Lake Storage Gen2のストレージアカウントに直接アクセスするために、ストレージの[共有アクセスシグネチャ \(SAS\)](https://docs.microsoft.com/azure/storage/common/storage-sas-overview)を用いることができます。SASを用いることで、きめ細かいアクセス制御による一時的なトークンを用いてストレージアカウントへのアクセスを制限することができます。

同じSparkセッションで複数のストレージアカウントに対するSASトークンを設定することができます。

:::note info
**注意**
SASのサポートはDatabricksランタイム7.5以降で利用できます。
:::

```py:Python
spark.conf.set("fs.azure.account.auth.type.<storage-account>.dfs.core.windows.net", "SAS")
spark.conf.set("fs.azure.sas.token.provider.type.<storage-account>.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.sas.FixedSASTokenProvider")
spark.conf.set("fs.azure.sas.fixed.token.<storage-account>.dfs.core.windows.net", "<token>")
```

# アカウントキーを用いたAzure Data Lake Storage Gen2やBlob Storageへのアクセス

Azureストレージへのアクセスを管理するために、[ストレージアカウントアクセスキー](https://docs.microsoft.com/azure/storage/common/storage-account-keys-manage?tabs=azure-portal)を使用することができます。

```py:Python
spark.conf.set(
    "fs.azure.account.key.<storage-account>.dfs.core.windows.net",
    dbutils.secrets.get(scope="<scope>", key="<storage-account-access-key>"))
```

以下を置き換えてください。

- `<storage-account>`をAzureストレージアカウント名で置き換え。
- `<scope>`をDatabricksのシークレットスコープ名で置き換え。
- `<storage-account-access-key>`をAzureストレージアカウントアクセスキーを含むキーの名前で置き換え。

# サンプルノートブック

このノートブックでは、以下を行うためにどのようにサービスプリンシパルを使うのかをデモンストレーションしています。

1. ADLS Gen2のストレージアカウントへの認証。
1. ストレージアカウントのファイルシステムをマウント。
1. 新たなコンテナにInternet of things (IoT)データを含むJSONファイルの書き込み。
1. 直接あるいはマウントポイント経由のアクセスによるファイルの一覧。
1. 直接あるいはマウントポイント経由のアクセスによるIoTファイルの読み込みおよび表示。

## AzureサービスプリンシパルとADLS Gen2 OAuth 2.0のノートブック

https://docs.databricks.com/_static/notebooks/adls-gen2-service-principal.html

# Azure Data Lake Storage Gen2のFAQと既知の問題

[Azure Data Lake Storage Gen2 frequently asked questions and known issues](https://docs.databricks.com/data/data-sources/azure/azure-datalake-gen2-faqs-issues.html)をご覧ください。

### Databricks 無料トライアル

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