This is an automated email from the ASF dual-hosted git repository.

ayushsaxena pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git


The following commit(s) were added to refs/heads/master by this push:
     new 350c4d4de84 HIVE-29552: Add docker scripts for Ozone (#6414)
350c4d4de84 is described below

commit 350c4d4de846b8b6db7227390ad4582ad05204c2
Author: Ayush Saxena <[email protected]>
AuthorDate: Thu Apr 9 19:23:59 2026 +0530

    HIVE-29552: Add docker scripts for Ozone (#6414)
---
 packaging/src/docker/README.md                     |  31 ++++++
 packaging/src/docker/docker-compose.yml            |   5 +
 packaging/src/docker/entrypoint.sh                 |   2 +-
 packaging/src/docker/start-hive.sh                 |  15 ++-
 packaging/src/docker/stop-hive.sh                  |   3 +
 .../src/docker/storage/ozone/docker-compose.yml    | 117 +++++++++++++++++++++
 6 files changed, 171 insertions(+), 2 deletions(-)

diff --git a/packaging/src/docker/README.md b/packaging/src/docker/README.md
index c82fe7e5ffc..4038dac79ba 100644
--- a/packaging/src/docker/README.md
+++ b/packaging/src/docker/README.md
@@ -358,3 +358,34 @@ 
HIVE_WAREHOUSE_PATH="/data/warehouse/tablespace/managed/hive" \
 S3_ENDPOINT_URL="s3.us-west-2.amazonaws.com" \
 docker-compose up
 ```
+
+#### Hive with Ozone-backed warehouse storage
+
+The cluster can also be started with Apache Ozone as the underlying storage 
layer, utilizing Ozone's S3 Gateway (S3G) to act as an S3-compatible backend 
for Hive.
+
+Use the provided startup script with the `--ozone` flag. This automatically 
injects S3A configurations into Hive and merges the main compose file with the 
Ozone-specific configuration located at `storage/ozone/docker-compose.yml`.
+
+```shell
+docker compose down --rmi local # cleanup previous containers and images
+
+export POSTGRES_LOCAL_PATH=... # set the path to the postgres driver jar
+./build.sh -hive 4.2.0 -hadoop 3.4.1 -tez 0.10.5 
+./start-hive.sh --ozone
+```
+
+By default, this spins up the Ozone components (Ozone Manager, Storage 
Container Manager, DataNode, 
+Recon, S3G) alongside Hive on the same local network.
+
+To view Ozone's web UIs, you can navigate to:
+
+Ozone Manager: http://localhost:9874
+
+Recon: http://localhost:9888
+
+To stop and remove the Ozone stack:
+
+```shell
+./stop-hive.sh # to stop containers
+#OR
+./stop-hive.sh --cleanup # to remove volumes and database state
+```
\ No newline at end of file
diff --git a/packaging/src/docker/docker-compose.yml 
b/packaging/src/docker/docker-compose.yml
index 3827cbf94f0..c01dbbeb287 100644
--- a/packaging/src/docker/docker-compose.yml
+++ b/packaging/src/docker/docker-compose.yml
@@ -155,6 +155,11 @@ services:
       LLAP_WEB_PORT: '15001'
       LLAP_MANAGEMENT_RPC_PORT: '15004'
       LLAP_SHUFFLE_PORT: '15551'
+
+      DEFAULT_FS: "${DEFAULT_FS}"
+      S3_ENDPOINT_URL: "${S3_ENDPOINT_URL}"
+      AWS_ACCESS_KEY_ID: "${AWS_ACCESS_KEY_ID}"
+      AWS_SECRET_ACCESS_KEY: "${AWS_SECRET_ACCESS_KEY}"
     volumes:
       - warehouse:/opt/hive/data/warehouse
       - scratch:/opt/hive/scratch
diff --git a/packaging/src/docker/entrypoint.sh 
b/packaging/src/docker/entrypoint.sh
index b6e71c2e7ee..5a5979b9ac9 100644
--- a/packaging/src/docker/entrypoint.sh
+++ b/packaging/src/docker/entrypoint.sh
@@ -85,7 +85,7 @@ function run_llap {
   # In this image, LLAP jars are under ${HIVE_HOME}/lib.
   export LLAP_DAEMON_HOME="${LLAP_DAEMON_HOME:-$HIVE_HOME}"
   export LLAP_DAEMON_CONF_DIR="${LLAP_DAEMON_CONF_DIR:-$HIVE_CONF_DIR}"
-  export 
LLAP_DAEMON_USER_CLASSPATH="${LLAP_DAEMON_USER_CLASSPATH:-$TEZ_HOME/*:$TEZ_HOME/lib/*:$HADOOP_HOME/share/hadoop/common/*:$HADOOP_HOME/share/hadoop/common/lib/*:$HADOOP_HOME/share/hadoop/yarn/*:$HADOOP_HOME/share/hadoop/yarn/lib/*:$HADOOP_HOME/share/hadoop/hdfs/*:$HADOOP_HOME/share/hadoop/hdfs/lib/*:$HADOOP_HOME/share/hadoop/mapreduce/*:$HADOOP_HOME/share/hadoop/mapreduce/lib/*}"
+  export 
LLAP_DAEMON_USER_CLASSPATH="${LLAP_DAEMON_USER_CLASSPATH:-$TEZ_HOME/*:$TEZ_HOME/lib/*:$HADOOP_HOME/share/hadoop/common/*:$HADOOP_HOME/share/hadoop/common/lib/*:$HADOOP_HOME/share/hadoop/yarn/*:$HADOOP_HOME/share/hadoop/yarn/lib/*:$HADOOP_HOME/share/hadoop/hdfs/*:$HADOOP_HOME/share/hadoop/hdfs/lib/*:$HADOOP_HOME/share/hadoop/mapreduce/*:$HADOOP_HOME/share/hadoop/mapreduce/lib/*:$HADOOP_HOME/share/hadoop/tools/lib/*}"
 
   JAVA_ADD_OPENS=(
     "--add-opens=java.base/java.lang=ALL-UNNAMED"
diff --git a/packaging/src/docker/start-hive.sh 
b/packaging/src/docker/start-hive.sh
index ddffcd20dd3..e8c9fcf77c3 100755
--- a/packaging/src/docker/start-hive.sh
+++ b/packaging/src/docker/start-hive.sh
@@ -22,6 +22,7 @@ cd "$SCRIPT_DIR"
 MODE="container"
 PROFILE=""
 SCALE=""
+COMPOSE_FILES="docker-compose.yml"
 
 for arg in "$@"; do
   case "$arg" in
@@ -32,6 +33,17 @@ for arg in "$@"; do
       export HIVE_ZOOKEEPER_QUORUM=zookeeper:2181
       export HIVE_LLAP_DAEMON_SERVICE_HOSTS=@llap0
       ;;
+--ozone)
+      COMPOSE_FILES="docker-compose.yml:storage/ozone/docker-compose.yml"
+      # DEFAULT_FS defines the bucket authority
+      export DEFAULT_FS="s3a://hive"
+
+      export HIVE_WAREHOUSE_PATH="/warehouse"
+
+      export S3_ENDPOINT_URL="http://s3.ozone:9878";
+      export AWS_ACCESS_KEY_ID="ozone"
+      export AWS_SECRET_ACCESS_KEY="secret"
+      ;;
     *)
       echo "Unknown option: $arg"
       exit 1
@@ -40,7 +52,8 @@ for arg in "$@"; do
 done
 
 export HIVE_EXECUTION_MODE="$MODE"
+export COMPOSE_FILE="$COMPOSE_FILES"
 
-echo "Starting Hive cluster (mode=$HIVE_EXECUTION_MODE)"
+echo "Starting Hive cluster (mode=$HIVE_EXECUTION_MODE, 
compose_files=$COMPOSE_FILE)"
 
 docker compose $PROFILE up -d $SCALE
diff --git a/packaging/src/docker/stop-hive.sh 
b/packaging/src/docker/stop-hive.sh
index 87f30ee3a27..d07f6fcb469 100755
--- a/packaging/src/docker/stop-hive.sh
+++ b/packaging/src/docker/stop-hive.sh
@@ -21,6 +21,7 @@ cd "$SCRIPT_DIR"
 
 PROFILE="--profile llap" # delete all containers regardless of profile
 CLEANUP_FLAG=""
+COMPOSE_FILES="docker-compose.yml:storage/ozone/docker-compose.yml"
 
 for arg in "$@"; do
   case "$arg" in
@@ -34,6 +35,8 @@ for arg in "$@"; do
   esac
 done
 
+export COMPOSE_FILE="$COMPOSE_FILES"
+
 if [[ -n "$CLEANUP_FLAG" ]]; then
   echo "Stopping Hive cluster and removing compose volumes"
 else
diff --git a/packaging/src/docker/storage/ozone/docker-compose.yml 
b/packaging/src/docker/storage/ozone/docker-compose.yml
new file mode 100644
index 00000000000..f5cf554b42c
--- /dev/null
+++ b/packaging/src/docker/storage/ozone/docker-compose.yml
@@ -0,0 +1,117 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+x-image:
+  &image
+  image: 
${OZONE_IMAGE:-apache/ozone}:${OZONE_IMAGE_VERSION:-2.1.0}${OZONE_IMAGE_FLAVOR:-}
+
+x-common-config:
+  &common-config
+  OZONE-SITE.XML_hdds.datanode.dir: "/data/hdds"
+  OZONE-SITE.XML_ozone.metadata.dirs: "/data/metadata"
+  OZONE-SITE.XML_ozone.om.address: "om"
+  OZONE-SITE.XML_ozone.om.http-address: "om:9874"
+  OZONE-SITE.XML_ozone.recon.address: "recon:9891"
+  OZONE-SITE.XML_ozone.recon.db.dir: "/data/metadata/recon"
+  OZONE-SITE.XML_ozone.replication: "1"
+  OZONE-SITE.XML_ozone.scm.block.client.address: "scm"
+  OZONE-SITE.XML_ozone.scm.client.address: "scm"
+  OZONE-SITE.XML_ozone.scm.datanode.id.dir: "/data/metadata"
+  OZONE-SITE.XML_ozone.scm.names: "scm"
+  no_proxy: "om,recon,scm,s3g,localhost,127.0.0.1"
+  OZONE-SITE.XML_hdds.scm.safemode.min.datanode: "1"
+  OZONE-SITE.XML_hdds.scm.safemode.healthy.pipeline.pct: "0"
+  OZONE-SITE.XML_ozone.s3g.domain.name: "s3.ozone"
+
+services:
+  datanode:
+    <<: *image
+    ports:
+      - 9864:9864
+    command: ["ozone","datanode"]
+    environment:
+      <<: *common-config
+    networks:
+      - hive
+  om:
+    <<: *image
+    ports:
+      - 9874:9874
+    environment:
+      <<: *common-config
+      CORE-SITE.XML_hadoop.proxyuser.hadoop.hosts: "*"
+      CORE-SITE.XML_hadoop.proxyuser.hadoop.groups: "*"
+      ENSURE_OM_INITIALIZED: /data/metadata/om/current/VERSION
+      WAITFOR: scm:9876
+    command: ["ozone","om"]
+    networks:
+      - hive
+  scm:
+    <<: *image
+    ports:
+      - 9876:9876
+    environment:
+      <<: *common-config
+      ENSURE_SCM_INITIALIZED: /data/metadata/scm/current/VERSION
+    command: ["ozone","scm"]
+    networks:
+      - hive
+  recon:
+    <<: *image
+    ports:
+      - 9888:9888
+    environment:
+      <<: *common-config
+    command: ["ozone","recon"]
+    networks:
+      - hive
+  s3g:
+    <<: *image
+    ports:
+      - 9878:9878
+    environment:
+      <<: *common-config
+      WAITFOR: om:9874
+    command:
+      - sh
+      - -c
+      - |
+        set -e
+        ozone s3g &
+        s3g_pid=$$!
+        until ozone sh volume list >/dev/null 2>&1; do echo '...waiting...' && 
sleep 1; done;
+        
+        # Force create the s3v volume in case S3G hasn't auto-generated it yet
+        ozone sh volume create /s3v || true
+        
+        # Create the 'hive' bucket
+        ozone sh bucket delete /s3v/hive || true
+        ozone sh bucket create /s3v/hive || true
+        wait "$$s3g_pid"
+    healthcheck:
+      test: [ "CMD", "ozone", "sh", "bucket", "info", "/s3v/hive" ]
+      interval: 5s
+      timeout: 3s
+      retries: 10
+      start_period: 30s
+    networks:
+      hive:
+        aliases:
+          - s3.ozone
+          - hive.s3.ozone
+
+networks:
+  hive:
+    name: hive

Reply via email to