2025/10/28の JAWS-UG初心者支部、BigData支部、千葉支部合同の「Apache Iceberg 勉強会」で、「Open Table Format (OTF) が必要になった背景とその機能」というタイトルで話すことになったのですが、その中でAthenaを使ってS3上のIceberg表を操作しつつ、メタデータや実データがどのように格納されているかをコマンドラインから確認するというデモを準備しました。(発表資料はこちら)
この記事では、そのデモで使った s3fs-fuse, AthenaCLI, Parquet CLI (Java), Avro-tools (Java)の導入方法を簡単に記載します。環境はWSL2上のUbuntu Linux 24.04ですが、どれもJavaやPythonベースのツールなので別の環境でも参考になると思います。
s3fs-fuse
s3fs-fuseは、s3バケットをOS上にマウントするためのツールです。このツールでIcebergのメタデータや実データが入ったS3バケットをマウントしておくことで、その中に作られたJSON、AVRO、Parquetフォーマットのデータが各種コマンドラインツールで簡単に確認できるようになります。私の場合は以下のs3fsのマウント、アンマウントコマンドはmiseに設定して利用しています。
# Ubuntu/Debianではaptで導入可能
sudo apt install s3fs
# UserがFuseを使えるようにする
sudo groupadd fuse
sudo usermod -a -G fuse $USER
newgrp fuse
sudo nano /etc/fuse.conf # user_allow_otherのコメントを外す
# AWSアクセスキーを~/.passwd-s3fsに登録(※この他にも認証方法はあります)
echo "your-access-key:your-secret-key" > ~/.passwd-s3fs
chmod 600 ~/.passwd-s3fs
# fuseでS3バケットをマウント
s3fs your-bucket-name /path/to/mountpoint -o passwd_file=~/.passwd-s3fs
# アンマウントはumountコマンド
umount /path/to/mountpoint
AthenaCLI
AthenaCLIは、CLIでAthenaにアクセスしてクエリを実行するツールです。pip install athenacli で導入が可能ですが、私の環境はユーザー領域にuvを入れているため、以下はuv toolで導入した例です。
$ uv tool install athenacli
あとは、~/.athenacli/athenaclircファイルを以下ドキュメントにそって編集すると、athenacliコマンドが利用可能になります。
Parquet CLI (Java)
Parquetツールは複数実装があるのですが、私が試した範囲だとParquet Javaに含まれるParquet CLIツールが最も機能が豊富でかつ色々なサイズのParquetファイルを引数に与えても問題なく動作しました。
Java版をコンパイルするため、事前にJDKとmavenの導入が必要です。私の場合はopenjdk-21-jdk-headlessを導入しています。
sudo apt install openjdk-21-jdk-headless
sudo apt install maven
git clone https://github.com/apache/parquet-java.git
cd parquet-java
mvn clean install -Dspotless.check.skip=true -DskipTests
mvnでビルドする際”-Dspotless.check.skip=true”を付けていますが、これはJava 21での変更にSpotless Maven Pluginがまだ対応できていないことでビルド中のテストがエラーになるため、これをスキップする指定です。ビルドが完了するとparquet-java/target/以下にparquet-cli-*-SNAPSHOT-runtime.jarが出来ているはずです。これを任意のディレクトリに保存します。以下では/usr/local/lib/parquet-cli/にコピーしています。
sudo cp (作業ディレクトリ)/parquet-java/parquet-cli/target/parquet-cli-1.17.0-SNAPSHOT*.jar /usr/local/lib/parquet-cli/
また、実行にはHadoopランタイムが必要なのでダウンロードして/usr/local/hadoop等に配置します。これは次のAvro toolsでも必要になります。
wget "https://dlcdn.apache.org/hadoop/common/hadoop-3.4.2/hadoop-3.4.2.tar.gz"
cd /usr/local/
sudo tar zxvf (保存ディレクトリ)/hadoop-3.4.2.tar.gz
sudo ln -s hadoop-3.4.2 hadoop
必要な環境変数を.bashrcに設定し、source ~/.bashrc で反映します。
# 以下の環境変数を.bashrcに設定
export HADOOP_HOME=/usr/local/hadoop/
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64/
私の場合は、実行用シェルスクリプト(下記)を ~/.local/bin/parquet-cli として作成して利用しています。
#!/bin/bash
java -cp "/usr/local/lib/parquet-cli/parquet-cli-1.17.0-SNAPSHOT-runtime.jar:$(hadoop classpath 2>/dev/null || echo '')" org.apache.parquet.cli.Main "$@"
# 利用例:メタデータ表示
parquet-cli meta sample.parquet
# データの先頭部分表示
parquet-cli head sample.parquet
Avro tools (Java)
Avroを操作するツールも複数あるのですが、私が試した範囲だとJava版が安定して動作しました。こちらはビルド済バイナリがあるので、それをダウンロードしてきて任意のディレクトリに保存し、Javaで実行するだけです。コマンドラインが長くなるので私の場合は以下のようにalias登録しています。実行する際に前述Hadoopランタイムが見つからないと警告が出ますので、引数 -Djava.libary.pathにHadoopランタイム(Parquet CLI導入時にダウンロードしたもの)を指定しています。
wget https://repo1.maven.org/maven2/org/apache/avro/avro-tools/1.12.1/avro-tools-1.12.1.jar
sudo cp avro-tools-1.12.1.jar /usr/local/lib/
alias avro-tools='java -Djava.library.path=/usr/local/hadoop/lib/native -jar /usr/local/lib/avro-tools-1.12.1.jar'
#利用例 (tojsonでAvroをJSON形式にする)
avro-tools tojson sample.avro | jq
コメントを残す