Databricks 上で Hadoop Catalog により Apache Iceberg を実行する際の Failed to find data source: ICEBERG への対応方法

## 概要

Databricks 上で Hadoop Catalog により Apache Iceberg を実行する際に発生した下記エラーの対応方法を紹介します。 Unity Cataglog を利用できるクラスターで発生するエラーのようです。対応方法は、 Unity Catalog を利用できない`分離なし共有`アクセスモードに変更することです。

> org.apache.spark.SparkClassNotFoundException: [DATA_SOURCE_NOT_FOUND] Failed to find data source: ICEBERG. Please find packages at `https://spark.apache.org/third-party-projects.html`.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a1efcb4d-3815-4973-85e5-2c40a7d7a012.png)

Databricks 上で Hadoop Catalog により Apache Iceberg を利用するには、下記の設定が必要です。

- Databricks Runtime のバージョンを 12.2LTS 以前にすること
- アクセスモードを分離なし共有（Uniyt Catalog 利用不可のモード」）にすること
- Java 8 に対応したライブラリ（Iceberg 1.6.1 以前のライブラリ）を利用すること
- Spark 構成に Iceberg 関連の設定を実施

## 事前準備

### ベースとなるクラスターを作成

#### Databricks Runtime にて 12.2 を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4324f0d6-d98e-4397-9650-1f02ded050fd.png)

#### アクセスモードを 分離なし共有に設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3791dd9b-c781-48f0-b17c-4441f70589dc.png)

#### Spark 構成に Iceberg 関連の設定を実施

`spark.sql.catalog.spark_catalog.warehouse`にて指定してディレクトリにテーブルのデータが書きこまれる。

```text
spark.sql.catalog.spark_catalog = org.apache.iceberg.spark.SparkCatalog
spark.sql.catalog.spark_catalog.type = hadoop
spark.sql.catalog.spark_catalog.warehouse = dbfs:/Iceberg
spark.sql.extensions = org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/905acb2d-8cd8-4d12-bcb1-78165e4139ed.png)

### Iceberg 関連ライブラリである`org.apache.iceberg:iceberg-spark-runtime-3.3_2.13:1.6.1`をインストール

クラスターのライブラリタブにて、`新規インストール`を選択し、`ライブラリをインストール`ウィドウにて`Mave`をチェック後に、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5f496302-c98d-4289-a5fe-281c20951883.png)

`org.apache.iceberg iceberg-spark-runtime`と入力すると下記のようにバージョンごとのライブラリを表示し、`org.apache.iceberg:iceberg-spark-runtime-3.3_2.13`の`1.6.1`リリースを選択後に`選択`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/224f7b07-876d-4396-b416-255a2d0679cd.png)

`org.apache.iceberg:iceberg-spark-runtime-3.3_2.13:1.6.1`と入力されたことを確認後に、`インストール`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d73020ea-2005-4692-9d6e-70f0bdf478e5.png)

## エラーの再現方法

#### アクセスモードを 分離なし共有ではなく`専用`に設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d86f00da-da3b-4b7a-ac12-9e862cdb5e49.png)

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

```sql
%sql
CREATE TABLE ICEBERG_TBL(ID INT,NAME STRING) USING ICEBERG;
INSERT INTO ICEBERG_TBL VALUES(1,"Shraddha");
SELECT * FROM ICEBERG_TBL;
```

> org.apache.spark.SparkClassNotFoundException: [DATA_SOURCE_NOT_FOUND] Failed to find data source: ICEBERG. Please find packages at `https://spark.apache.org/third-party-projects.html`.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bb7d0ef0-b2f2-4271-aa3a-04040e4fb78a.png)

## エラーへの対応方法

### クラスターのアクセスモードを`分離なし共有`に変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/30d5657e-e5c5-46a1-8e84-27914903c375.png)

### エラーとなったコードが正常終了することを確認

```sql
%sql
CREATE TABLE ICEBERG_TBL(ID INT,NAME STRING) USING ICEBERG;
INSERT INTO ICEBERG_TBL VALUES(1,"Shraddha");
SELECT * FROM ICEBERG_TBL;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/68f1f727-ae4a-4251-986b-462a5e4cee21.png)