Ozone S3 Gateway(S3 互換)× Hive 連携ランブック
本記事は、Ozone を S3 互換エンドポイントとして公開 し、Hive から s3a:// パスでデータにアクセスするための実践手順をまとめた技術ブログです。
クラスタ側の Ozone 準備(S3 秘密情報の取得・バケット作成・ACL/Ranger 設定)から、core-site.xml / hive-site.xml の設定、動作確認(hadoop fs / aws s3 / ozone fs)、Hive 外部テーブル作成、そしてトラブルシューティングまでを紹介します。
0. 前提条件(Prerequisites)
- Cloudera Base on premises(つまり Ozone を含む Hadoop 環境)が稼働済み
- Ozone S3 Gateway(s3g)が有効
- Hive(HMS / HS2)が稼働
- Kerberos 環境(例:
hive@REALM) - テスト用の FQDN/エンドポイント(例)
- Ozone S3 エンドポイント:
http(s)://<s3g-host-or-alb>:<port> - 以降の例では
http://worker01.metalake.site:9878を使用
- Ozone S3 エンドポイント:
⚠️ TLS 環境の場合は、OS/Java のトラストストアに 中間 CA を含む発行 CA を事前に取り込みます。自己署名証明書を使用していると S3A クライアントや
aws s3で SSL エラーになります。
1. Ozone 側の準備
1.1 Kerberos 認証(Hive ユーザー例)
kinit -kt /cdep/keytabs/hive.keytab hive
# 必要に応じて:kinit -kt /path/to/keytab hive/host@REALM
1.2 S3 用クレデンシャルの取得
Ozone を S3 互換エンドポイントとして利用するため、アクセスキー / シークレットを発行します。
ozone s3 getsecret
# 出力例(実際の値はマスク推奨)
# awsAccessKey=zzeng@OZONE.COM
# awsSecret=<LONG_SECRET_VALUE>
1.3 Ozone バケット作成(OBJECT_STORE レイアウト)
Hive のウェアハウス用に S3 互換バケットを作成します。
# HMS ウェアハウス用
ozone sh bucket create --layout OBJECT_STORE /s3v/hms-warehouse
# 個人検証用(任意)
ozone sh bucket create --layout OBJECT_STORE /s3v/zzeng
1.4 バケット ACL の確認/設定
# ACL 確認
ozone sh bucket getacl /s3v/hms-warehouse
# 読み取り専用ユーザーの付与例
ozone sh bucket setacl /s3v/hms-warehouse --acls user:systest:rl
1.5 Ranger ポリシーの整備
• cm_ozone / hadoop_sql など、対象サービスのポリシーで
• hms-warehouse バケット(および必要なパス)に対する read / write / list 権限を付与
• 読み取り専用テストユーザーを使う場合は、明示的にユーザー追加+最小権限付与
下記はcm_ozone のPolicy:
2. Hadoop(core-site.xml)の設定
Cloudera Manager → HDFS サービス → Safety Valve(core-site.xml) 等で以下を設定します。
( は hms-warehouse に読み替え)
<property>
<name>fs.s3a.bucket.hms-warehouse.access.key</name>
<value>zzeng@OZONE.COM</value>
</property>
<property>
<name>fs.s3a.bucket.hms-warehouse.secret.key</name>
<value>--my-SECRET-key---</value>
</property>
<property>
<name>fs.s3a.endpoint</name>
<value>http://worker01.metalake.site:9878</value>
</property>
<property>
<name>fs.s3a.bucket.probe</name>
<value>0</value>
</property>
<property>
<name>fs.s3a.change.detection.version.required</name>
<value>false</value>
</property>
<property>
<name>fs.s3a.path.style.access</name>
<value>true</value>
</property>
<property>
<name>fs.s3a.change.detection.mode</name>
<value>none</value>
</property>
3. Hive(hive-site.xml)の設定
Hive サービス → Safety Valve(hive-site.xml) で、ウェアハウスディレクトリを S3A に変更します。
<!-- Iceberg/Hive のウェアハウスを Ozone(S3A) に配置 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>s3a://hms-warehouse/warehouse</value>
</property>
<property>
<name>hive.metastore.warehouse.external.dir</name>
<value>s3a://hms-warehouse/warehouse/external</value>
</property>
<!-- Embedded REST Catalog(静的クレデンシャル連携用の例) -->
<property>
<name>hive.metastore.catalog.datasharing.static-creds.enabled</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.catalog.s3.readonly.access_key</name>
<value>zzeng@OZONE.COM</value>
</property>
<property>
<name>hive.metastore.catalog.s3.readonly.secret_key</name>
<value>--my-SECRET-key---</value>
</property>
4. 動作確認(List / Get / Put)
4.1 hadoop fs で S3A を一覧
hadoop fs \
-Dfs.s3a.bucket.probe=0 \
-Dfs.s3a.change.detection.version.required=false \
-Dfs.s3a.change.detection.mode=none \
-Dfs.s3a.access.key=zzeng@OZONE.COM \
-Dfs.s3a.secret.key=<SECRET> \
-Dfs.s3a.endpoint=http://worker01.metalake.site:9878 \
-Dfs.s3a.path.style.access=true \
-Dfs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem \
-ls -R s3a://hms-warehouse/warehouse
5. Hive 連携(Beeline で外部テーブル)
5.1 Beeline 接続
beeline
# 例:ZK 経由 / Kerberos 環境
# !connect jdbc:hive2://<zk-host>:2181/default;principal=hive/_HOST@REALM;retries=5;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2
5.2 外部 Iceberg テーブル作成(S3A ロケーション)
CREATE EXTERNAL TABLE test_tbl (
id INT,
name STRING
)
STORED BY ICEBERG
TBLPROPERTIES ('format-version'='2');
-- Location/metadata が s3a://hms-warehouse/... に出力されることを確認
DESCRIBE FORMATTED test_tbl;

