餡子付゛録゛

ソフトウェア開発ツールの便利な使い方を紹介。

Apache OzoneをSingle Node ClusterのAWS S3互換の分散ストレージとして扱う方法

Hadoop用の新しい分散ファイル・システムだったApache Ozoneは、Hadoopと独立して運用ができ、かつAWS S3互換オブジェクトストレージとしても使えます。また、ペタバイト単位のクラスターを構成している人もいて頑強のようです。Dockerを使うと、docker imageのサイズがかなり大きいですが、すぐ試せます。オブジェクトストレージを使ったクラウド用のアプリケーションの開発環境にも良さそうです。

Ozone On Premise InstallationSingle Node Deployment - OZONE - Apache Software Foundationを参考に、バイナリー版を落としてきてSingle Cluster構成で動かしてみましょう。

JVMのインストール

Javaのアプリケーションなので実行にJVMが必要です。罠があって、(少なくともUbuntu Linux 24.04では)Ozone 1.4.1(と1.4.0)はJava 21ではAWS S3互換オブジェクトストレージ用のDaemonが例外を出して動きません。Java 17を使います。

sudo apt install openjdk-17-jdk

環境変数JAVA_HOMEを設定し、環境変数PATHを他のJVMがあってもJVM 17が優先されるように修正します。

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export OZONE_OPTS=-XX:ParallelGCThreads=2 # Ozone稼動時の警告避け
# ヒープサイズを512MBに制限する場合
# export OZONE_HEAPSIZE_MAX=512M
# ログの起動ユーザー名を変更する場合
# export OZONE_IDENT_STRING="learning" 

Ozoneのダウンロード

/var/tmp/ozone-1.4.1 にOzoneのファイルを展開します。

cd /var/tmp
wget https://www.apache.org/dyn/closer.cgi/ozone/1.4.1/ozone-1.4.1.tar.gz
tar zxf ozone-1.4.1.tar.gz

Ozoneの設定

まず、Ozoneで使うデータの格納場所として、/var/tmp/objstrg/をつくります。

mkdir /var/tmp/objstrg

チュートリアルではozone genconfでozone-site.xmlの雛形をつくれとありますが、直接編集したほうが手っ取り早いです。
viなどで/var/tmp/ozone-1.4.1/etc/hadoop/ozone-site.xmlを以下のように書き換えます。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
 <properties>
  <property><name>ozone.scm.datanode.id.dir</name><value>/var/tmp/objstrg/data</value></property>
  <property><name>ozone.replication</name><value>1</value></property>
  <property><name>ozone.metadata.dirs</name><value>/var/tmp/objstrg/data/metadata</value></property>
  <property><name>ozone.scm.names</name><value>localhost</value></property>
  <property><name>ozone.scm.block.client.address</name><value>localhost</value></property>
  <property><name>ozone.scm.client.address</name><value>localhost</value></property>
  <property><name>ozone.scm.db.dirs</name><value>/var/tmp/objstrg/scm/db</value></property>
  <property><name>ozone.scm.ha.ratis.storage.dir</name><value>/var/tmp/objstrg/scm/ratis</value></property>
  <property><name>ozone.om.address</name><value>localhost</value></property>
  <property><name>ozone.om.db.dirs</name><value>/var/tmp/objstrg/om/db</value></property>
  <property><name>ozone.om.ratis.storage.dir</name><value>/var/tmp/objstrg/om/ratis</value></property>
  <property><name>dfs.container.ratis.datanode.storage.dir</name><value>/var/tmp/objstrg/datanode/ratis</value></property>
  <property><name>hdds.datanode.dir</name><value>/var/tmp/objstrg/datanode/data</value></property>
  <property><name>dfs.container.ratis.datanode.storage.dir</name><value>/var/tmp/objstrg/datanode/ratis</value></property>
  <property><name>ozone.http.basedir</name><value>/var/tmp/objstrg/jetty</value></property>
  <property><name>ozone.s3g.http-address</name><value>localhost</value></property>
  <property><name>ozone.s3g.http-bind-host</name><value>localhost</value></property>
 </properties>
</configuration>

ozone-site.xmlに抜けがあると、エラーメッセージ無く起動しないことがあります。なお、例外は/var/tmp/ozone-1.4.1/logs以下のログに記録されます。

初期化と起動

scm(Storage Container Manager),om(Ozone Manager),datanode,s3g(S3 Gateway)の4プロセスを順番に起動します。

初回だけscmとomの初期化が必要で、かつ順番が大事なので、最初はひとつひとつ実行しましょう。

ozone scm --init # 初回のみ
ozone --daemon start scm
ozone om --init # 初回のみ
ozone --daemon start om
ozone --daemon start datanode
ozone --daemon start s3g

上手く行くと、ps wでjavaのプロセスが4つ動いているのが分かります。

書き込んで見る

早速、使ってみましょう。

echo "Hello Apache Ozone World!" > hello.txt

とファイルを作成します。

AWS CLIをインストールした後、bucket1を作成して、

aws s3api --endpoint http://localhost:9878/ create-bucket --bucket=bucket1

Ozoneに保存を試みましょう。なお、認証まわりの設定をしておらず、credentialsは何でも通るので、Key IDには12345、Access Keyには54321でも入れておきましょう。

aws s3 --endpoint http://localhost:9878 cp --storage-class REDUCED_REDUNDANCY hello.txt  s3://bucket1/hello.txt

Single Node Clusterなので--storage-class REDUCED_REDUNDANCYが要るそうです。

保存されたことも確認しましょう。

aws s3 --endpoint http://localhost:9878 ls s3://bucket1/hello.txt

なお、デフォルトではAWS S3互換gatewayから保存したオブジェクトは、/s3vと言うvolumeに保存されます。

終了

起動の逆の順番でプロセスを終了します。

ozone --daemon stop s3g
ozone --daemon stop datanode
ozone --daemon stop om
ozone --daemon stop scm