Databricks にて Azure Storage 上の Apache Iceberg を CLONE する際の Invalid configuration value detected  エラーへの暫定対応方法


## 概要

Databricks 上でストレージキーにて Azure Storage 上の Apache Iceberg のデータを CLONE しようとした際の暫定対応方法を共有します。Blob Storage エンドポイントを指定しているにもかかわらず、内部で dfs エンドポイントにより接続していることがエラーの原因のようです。dfs に対する認証情報も追加する暫定対応を共有します。

> Py4JJavaError: An error occurred while calling o400.sql.
> : Invalid configuration value detected for fs.azure.account.key
> 	at shaded.databricks.azurebfs.org.apache.hadoop.fs.azurebfs.dia

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/cc80ed88-c426-4b5d-b006-0756019c62a8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a1a671f7-d906-4b82-ae5d-0321e2bb6999.png)


> Py4JJavaError: An error occurred while calling o400.sql.
: shaded.databricks.org.apache.hadoop.fs.azure.AzureException: shaded.databricks.org.apache.hadoop.fs.azure.AzureException: Unable to access container snowflake in account snowflakeicebergqiita.blob.core.windows.net using anonymous credentials, and no credentials found for them  in the configuration.

Unity Catalog に外部ロケーションとして登録しているディレクトリの場合においても、上記の 2 つのエンドポイントに対する認証設定が必要でした。

> Py4JJavaError: An error occurred while calling o400.sql.
: shaded.databricks.org.apache.hadoop.fs.azure.AzureException: shaded.databricks.org.apache.hadoop.fs.azure.AzureException: Unable to access container external in account {account_name}.blob.core.windows.net using anonymous credentials, and no credentials found for them  in the configuration.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/cb55b652-6d57-4222-8433-88d46721cbe4.png)


## エラーについて

### Unity Catalog が有効なクラスターのアタッチ

```python
cluster_info = spark.conf.get("spark.databricks.clusterUsageTags.sparkVersion")
display(cluster_info)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/fcbbc394-9acb-4ffb-861e-7914d3e118f0.png)

### Blob Storage エンドポイントの認証を設定

```python
# Azure Storage に関る情報をセット
azure_storage_account_name = "snowflakeicebergqiita"
azure_storage_account_key = "kKRn6nruDHEhUF0AQzM1PFlXtXs9V0BJQSrn6Z8GvJOsb0JHflV9Fn=="
```

```python
spark.conf.set(f"fs.azure.account.key.{azure_storage_account_name}.blob.core.windows.net", azure_storage_account_key)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f4a8bab3-0bc6-4068-9bbb-78cf8ba741ca.png)

### CLONE がエラーとなることを確認

```python
retund_df = spark.sql(f"""
CREATE OR REPLACE TABLE iceberg_clone_test.default.test_table_01
  CLONE iceberg.`wasbs://snowflake@{azure_storage_account_name}.blob.core.windows.net/iceberg_clone/default/first_table`;
""")
retund_df.display()
```

> Py4JJavaError: An error occurred while calling o400.sql.
> : Invalid configuration value detected for fs.azure.account.key
> 	at shaded.databricks.azurebfs.org.apache.hadoop.fs.azurebfs.dia

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/cc80ed88-c426-4b5d-b006-0756019c62a8.png)

## エラーへの対応方法

### dfs エンドポイントに対する認証を設定

```python
spark.conf.set(
    f"fs.azure.account.key.{azure_storage_account_name}.dfs.core.windows.net",
    azure_storage_account_key,
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/325060c6-09ef-4ad3-9942-1a066f5fba27.png)

### CLONE できることを確認

```python
retund_df = spark.sql(f"""
CREATE OR REPLACE TABLE iceberg_clone_test.default.test_table_01
  CLONE iceberg.`wasbs://snowflake@{azure_storage_account_name}.blob.core.windows.net/iceberg_clone/default/first_table`;
""")
retund_df.display()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d28360d1-0289-4262-9002-e5b995ed06c5.png)