diff --git a/CHANGELOG.md b/CHANGELOG.md index 98c7c5621..37fbe5a70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ All notable changes to this project will be documented in this file. the Azure Data Lake Storage ([#853]). - kafka: Add cyrus-sasl-gssapi package for kerberos ([#874]). - spark: Add HBase connector ([#878], [#882]). +- hbase: hbase-entrypoint.sh script to start and gracefully stop services ([#898]). ### Changed @@ -86,6 +87,7 @@ All notable changes to this project will be documented in this file. [#890]: https://github.com/stackabletech/docker-images/pull/890 [#894]: https://github.com/stackabletech/docker-images/pull/894 [#896]: https://github.com/stackabletech/docker-images/pull/896 +[#898]: https://github.com/stackabletech/docker-images/pull/898 [#901]: https://github.com/stackabletech/docker-images/pull/901 ## [24.7.0] - 2024-07-24 diff --git a/hbase/Dockerfile b/hbase/Dockerfile index a8228dec7..d72343144 100644 --- a/hbase/Dockerfile +++ b/hbase/Dockerfile @@ -140,6 +140,7 @@ ARG DELETE_CACHES="true" # does not work, so please ignore the according warning (SC2016). COPY --chown=${STACKABLE_USER_UID}:0 hbase/stackable/bin/hbck2.env /stackable/bin/ COPY --chown=${STACKABLE_USER_UID}:0 hbase/stackable/patches /stackable/patches +COPY --chown=${STACKABLE_USER_UID}:0 hbase/stackable/bin/hbase-entrypoint.sh /stackable/bin/ USER ${STACKABLE_USER_UID} WORKDIR /stackable @@ -318,6 +319,7 @@ COPY --chown=${STACKABLE_USER_UID}:0 --from=hbase-builder /stackable/jmx /stacka COPY --chown=${STACKABLE_USER_UID}:0 --from=hbase-operator-tools-builder /stackable/hbase-operator-tools-${HBASE_OPERATOR_TOOLS} /stackable/hbase-operator-tools-${HBASE_OPERATOR_TOOLS}/ COPY --chown=${STACKABLE_USER_UID}:0 --from=hbase-operator-tools-builder /stackable/bin/hbck2 /stackable/bin/hbck2 +COPY --chown=${STACKABLE_USER_UID}:0 --from=hbase-operator-tools-builder /stackable/bin/hbase-entrypoint.sh /stackable/hbase-${PRODUCT}/bin/hbase-entrypoint.sh COPY --chown=${STACKABLE_USER_UID}:0 --from=phoenix-builder /stackable/phoenix /stackable/phoenix/ @@ -367,4 +369,4 @@ ENV PATH="${PATH}:/stackable/bin:/stackable/hbase/bin" ENV ASYNC_PROFILER_HOME=/stackable/async-profiler WORKDIR /stackable/hbase -CMD ["./bin/hbase", "master", "start" ] +CMD ["./bin/hbase-entrypoint", "master", "localhost", "16010" ] diff --git a/hbase/stackable/bin/hbase-entrypoint.sh b/hbase/stackable/bin/hbase-entrypoint.sh new file mode 100644 index 000000000..89b488a21 --- /dev/null +++ b/hbase/stackable/bin/hbase-entrypoint.sh @@ -0,0 +1,76 @@ +#!/usr/bin/env bash +# +# Entrypoint for HBase that ensures services are shutdown gracefuly +# +# Expects the following env vars: +# - RUN_REGION_MOVER: if set to true, the region mover will be run before region server shutdown +# - REGION_MOVER_OPTS: additional options for the region mover +# +set -x +set -euo pipefail + +# master, regionserver, rest +HBASE_ROLE_NAME="$1" +# k8s service name for this role+group combo +# ..svc.cluster.local +HBASE_ROLE_SERVICE_NAME="$2" +# 16010 for master, 16020 for regionservers etc. +HBASE_ROLE_SERVICE_PORT="$3" + +HBASE_ROLE_SERVICE_HOST="${HOSTNAME}.${HBASE_ROLE_SERVICE_NAME}" + +REGION_MOVER_OPTS="--regionserverhost ${HBASE_ROLE_SERVICE_HOST}:${HBASE_ROLE_SERVICE_PORT} --operation unload ${REGION_MOVER_OPTS}" + +if [ -f /stackable/kerberos/krb5.conf ]; then + KERBEROS_REALM=$(grep -oP 'default_realm = \K.*' /stackable/kerberos/krb5.conf) + export KERBEROS_REALM +fi + +prepare_signal_handlers() { + unset term_child_pid + unset term_kill_needed + trap handle_term_signal TERM +} + +handle_term_signal() { + if [ "${term_child_pid}" ]; then + if [ "regionserver" == "${HBASE_ROLE_NAME}" ] && [ "true" == "${RUN_REGION_MOVER}" ]; then + echo "Start pre-shutdown" + # REGION_MOVER_OPTS is a string that contains multiple arguments and needs to be spliced here + # therefore disable shellcheck for this line + # shellcheck disable=SC2086 + /stackable/hbase/bin/hbase org.apache.hadoop.hbase.util.RegionMover ${REGION_MOVER_OPTS} + echo "Done pre-shutdown" + fi + kill -TERM "${term_child_pid}" 2>/dev/null + else + term_kill_needed='yes' + fi +} + +wait_for_termination() { + set +e + term_child_pid=$1 + if [[ -v term_kill_needed ]]; then + kill -TERM "${term_child_pid}" 2>/dev/null + fi + wait "${term_child_pid}" 2>/dev/null + trap - TERM + wait "${term_child_pid}" 2>/dev/null + set -e +} + +# ################################################################################################## +# main +# ################################################################################################## +mkdir -p /stackable/conf +cp /stackable/tmp/hdfs/hdfs-site.xml /stackable/conf +cp /stackable/tmp/hdfs/core-site.xml /stackable/conf +cp /stackable/tmp/hbase/* /stackable/conf +cp /stackable/tmp/log_config/log4j* /stackable/conf + +rm -f /stackable/log/_vector/shutdown +prepare_signal_handlers +/stackable/hbase/bin/hbase "${HBASE_ROLE_NAME}" start & +wait_for_termination $! +mkdir -p /stackable/log/_vector && touch /stackable/log/_vector/shutdown