Databricks 上で Hadoop Catalog により Apache Iceberg を実行する際の Java のバージョンによるエラーへの対応方法

## 概要

Databricks 上で Hadoop Catalog により Apache Iceberg を実行する際に発生した下記エラーの対応方法を紹介します。Databricks Runtime 12.2 の Java のバージョンが原因のようです。 Iceberg 関連のライブラリのバージョンを 1.6.1 にすることで解決できました。

> Failure starting repl. Try detaching and re-attaching the notebook.

> java.lang.Exception: java.lang.UnsupportedClassVersionError: org/apache/iceberg/spark/SparkCatalog has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bd832eed-d04d-45c8-b151-1c6324d1c170.png)

Databricks Runtime 12.2 のバージョンは、ドキュメントに記載されてます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ebf8323b-5524-4be6-a84b-e058b94b558b.png)

引用元：[Databricks Runtime 12.2 LTS - Azure Databricks | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/databricks/release-notes/runtime/12.2lts#system-environment)

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)

## エラーの再現方法

### インストール済みの Iceberg 関連ライブラリをアンインストール

### Iceberg 関連ライブラリを（`org.apache.iceberg:iceberg-spark-runtime-3.4_2.12:1.8.0`）に変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/95d020d9-96b0-4809-a461-319382bd8d5c.png)

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

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

> Failure starting repl. Try detaching and re-attaching the notebook.

> java.lang.Exception: java.lang.UnsupportedClassVersionError: org/apache/iceberg/spark/SparkCatalog has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bd832eed-d04d-45c8-b151-1c6324d1c170.png)


## エラーへの対応方法

### 既存の Iceberg 関連ライブラリをアンインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/76fa0594-9716-4292-a088-54970a78829f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3d6b6d81-9a51-4723-957f-fd468a43d049.png)

### Iceberg 関連ライブラリである`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/da1bbe4a-3f94-4ecb-8f4c-9447ef80423d.png)

### クラスターを再起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6d7fe51d-acf4-4e6c-9ab7-3709bc9416a4.png)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1ca61680-84c2-46b3-9e6a-6dd770027e72.png)