embulk-input-icebergを作りました
初めに
データエンジニアをやっていると少なくないケースでバックエンドがJavaであることがあり、Javaを勉強したいと思っていました。最近Apache Icebergに興味を持ち勉強している中で業務で使用しているEmbulkのプラグインにIcebergがないと思い、Javaの勉強がてら作ってみようと決心し作ってみました。
本当はoutputの方が需要はありそうだったのですが、実装の考慮点が少なそうなinputを選択してIcebergのプラグインを作成しました。
ソースコードとプラグインの使い方はGithubに公開するとともに、Mavenリポジトリに登録しています。
完成までの道のり
Embulkのプロジェクト作成
プラグイン形式の決定
EmbulkはJRubyにプラグインをリリースしていたようですが、dmikurubeさんの2021年の記事の記事を見るとMavenリポジトリにプラグインをリリースする形式を推奨しているようでしたので、こちらのやり方でリリースすることにしました。
環境構築
Maven形式のプラグイン作成の環境構築はこの記事にインストール方法が記載されていていました。
開発したいプラグインはIceberg関係のライブラリをインストールする必要があったので、The Gradle org.embulk.runset plugin を使用して環境構築を試みたのですが、リンクのissueを実力不足で解消することができませんでした。
結局、Emubulk Homeに関する記事を参照してm2_homeをMavenのローカルリポジトリに設定し、開発中のEmbulkプラグインを動かすのに必要なライブラリをMavenのローカルリポジトリに落して開発を行いました。
Javaのバージョン
Embulkの公式サイトによると公式サポートはJava8で11,17,21でもなんとなく動くとありました。そして、IcebergはJava11以上でビルドされているので、Java11を利用することにしました。
コーディング
コーディングの際に苦労した点は以下の通りです。
インターフェースの理解
Development Guildが出ていて大枠は理解できたのですが、具体的な実装になるとイメージができず既存のライブラリを参考にして作成しました。特に参照したのが以下2つでした。
Iceberg Java APIの理解
インターネット上には公式サイトの他ほとんど情報がなく、以下の3つのサイトくらいしか具体的な実装に触れられているものはありませんでしたが、それら情報でほぼ形にできました。一部足りないものについてはソースコードのコメントから理解するような形で何とか形にしました。
- An Introduction to the Iceberg Java API Part 1(パート2、3もあります)
- TrinoとIcebergでログ基盤の構築
- 氷山を穿つ - Apache Icebergに大量データを投入するTopic -
Classloaderの理解
サンプルのJavaプロジェクトでは動いていたのに、Embulkのプラグインにしたらうまく動かないことがありました。突き詰めていくとClassloaderがうまく設定されていないようでした。いろいろなEmbulkのプラグインのソースコードを見るとembulk-output-parquetで私の抱える問題の対処になるのかと思い試したら見事解決しました。
デプロイ
せっかくなのでMaven Centralにデプロイを試みました。
Maven Central or OSSRH
最近まではOSSRHでリリースするのが一般的だったようなのですが、このニュースによると2025/06/30にサポートが終了するようなので、Maven Centralへのリリースをすることにしました。
しかし、Gradleについては公式のパブリッシュプラグインがないため、同サイトにあるOSSを活用することが必要でした。
様々なパブリッシュプラグインを試しましたが、Javaのバージョンでダメになったり、署名がうまくいかないなど結局デプロイまでうまくいくものはなく、(このプラグイン)[https://github.com/yananhub/flying-gradle-plugin]は、ハッシュの作成と署名までうまくいったので、これを手作業でZIPに固めてMaven Centralにアップロードする方法で行いました。
gradle-embulk-runsetの挙動
リリース後The Gradle org.embulk.runset pluginで作成したembulk-input-icebergを読み込ませたのですが、リンクのissueは解消しなかったので、リンクに記載されていた該当の事象が発生するcaffeineというモジュールのバージョンをあげて再度リリース(v0.0.2)を行いました。
実際に動かしてみてcaffeineでエラーが出る場合はIcebergのモジュールが参照しているバージョンを参照しているv0.0.1を使ったほうがいいかもしれません。
終わりに
今回embulkのプラグインを作ることで、JavaだったりGradleだったりと少しだけ理解が深まった気がします。
今回対応したカタログはRESTのみかつストレージはMiniOのみ(というか試していない)なので、カタログタイプを増やしたり、outputについても作ってみたいと思いました。
Discussion