blob: e8d77a2c457907779cdf2dea2ef6354c5f656cfc [file] [log] [blame]
#!/bin/bash
# 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.
# Wrapper script that runs the command-line provided as its arguments after
# setting up the environment required for the daemon processes to run.
#
# Supported environment variables:
# JAVA_TOOL_OPTIONS: additional options passed to any embedded JVMs. Can be used, e.g.
# to set a max heap size with JAVA_TOOL_OPTIONS="-Xmx4g".
export IMPALA_HOME=/opt/impala
# Add directories containing dynamic libraries required by the daemons that
# are not on the system library paths.
export LD_LIBRARY_PATH=/opt/impala/lib
# This can get more detailed if there are specific steps
# for specific versions, but at the moment the distribution
# is all we need.
DISTRIBUTION=Unknown
if [[ -f /etc/redhat-release ]]; then
echo "Identified Redhat image."
DISTRIBUTION=Redhat
else
source /etc/lsb-release
if [[ $DISTRIB_ID == Ubuntu ]]; then
echo "Identified Ubuntu image."
DISTRIBUTION=Ubuntu
fi
fi
if [[ $DISTRIBUTION == Unknown ]]; then
echo "ERROR: Did not detect supported distribution."
echo "Only Ubuntu and Redhat-based distributions are supported."
exit 1
fi
# Need libjvm.so and libjsig.so on LD_LIBRARY_PATH
# Ubuntu and Redhat use different locations for JAVA_HOME.
# This detection logic handles Java 8, 11, and 17. Prefers the newest version.
JAVA_HOME=Unknown
if [[ $DISTRIBUTION == Ubuntu ]]; then
# Since the Java location includes the CPU architecture, use a glob
# to find Java home
if compgen -G "/usr/lib/jvm/java-17-openjdk*" ; then
echo "Detected Java 17"
JAVA_HOME=$(compgen -G "/usr/lib/jvm/java-17-openjdk*")
elif compgen -G "/usr/lib/jvm/java-11-openjdk*" ; then
echo "Detected Java 11"
JAVA_HOME=$(compgen -G "/usr/lib/jvm/java-11-openjdk*")
elif compgen -G "/usr/lib/jvm/java-8-openjdk*" ; then
echo "Detected Java 8"
JAVA_HOME=$(compgen -G "/usr/lib/jvm/java-8-openjdk*")
fi
elif [[ $DISTRIBUTION == Redhat ]]; then
if [[ -d /usr/lib/jvm/jre-17 ]]; then
echo "Detected Java 17"
JAVA_HOME=/usr/lib/jvm/jre-17
elif [[ -d /usr/lib/jvm/jre-11 ]]; then
echo "Detected Java 11"
JAVA_HOME=/usr/lib/jvm/jre-11
elif [[ -d /usr/lib/jvm/jre-1.8.0 ]]; then
echo "Detected Java 8"
JAVA_HOME=/usr/lib/jvm/jre-1.8.0
fi
fi
if [[ $JAVA_HOME == Unknown ]]; then
echo "ERROR: Did not find Java in any expected location."
echo "Only Java 8, 11, and 17 are supported."
exit 1
fi
echo "JAVA_HOME: ${JAVA_HOME}"
export JAVA_HOME
# Given JAVA_HOME, find libjsig.so and libjvm.so and add them to LD_LIBRARY_PATH.
# JAVA_HOME could be a symlink, so follow symlinks when looking for the libraries
LIB_JSIG_DIR=$(find -L "${JAVA_HOME}" -name libjsig.so | head -1 | xargs dirname)
if [[ -z $LIB_JSIG_DIR ]]; then
echo "ERROR: Could not find libjsig.so in ${JAVA_HOME}"
exit 1
fi
LIB_JVM_DIR=$(find -L "${JAVA_HOME}" -name libjvm.so |head -1 | xargs dirname)
if [[ -z $LIB_JVM_DIR ]]; then
echo "ERROR: Could not find libjvm.so in ${JAVA_HOME}"
exit 1
fi
LD_LIBRARY_PATH+=:${LIB_JSIG_DIR}:${LIB_JVM_DIR}
# Add directory with optional plugins that can be mounted for the container.
LD_LIBRARY_PATH+=:/opt/impala/lib/plugins
# Configs should be first on classpath
export CLASSPATH=/opt/impala/conf
# Append all of the jars in /opt/impala/lib to the classpath.
for jar in /opt/impala/lib/*.jar
do
CLASSPATH+=:$jar
done
echo "CLASSPATH: $CLASSPATH"
echo "LD_LIBRARY_PATH: $LD_LIBRARY_PATH"
# Default to 2GB heap. Allow overriding by externally-set JAVA_TOOL_OPTIONS.
export JAVA_TOOL_OPTIONS="-Xmx2g $JAVA_TOOL_OPTIONS"
echo "JAVA_TOOL_OPTIONS: $JAVA_TOOL_OPTIONS"
# Various Hadoop libraries depend on having a username. If we're running under
# an unknown username, create an entry in the password file for this user.
if ! whoami ; then
export USER=${HADOOP_USER_NAME:-dummyuser}
echo "${USER}:x:$(id -u):$(id -g):,,,:/opt/impala:/bin/bash" >> /etc/passwd
whoami
cat /etc/passwd
fi
# IMPALA-10006: avoid cryptic failures if log dir isn't writable.
LOG_DIR=$IMPALA_HOME/logs
if [[ ! -w "$LOG_DIR" ]]; then
echo "$LOG_DIR is not writable"
exit 1
fi
# Set ulimit core file size 0.
ulimit -c 0
# graceful_shutdown_backends.sh requires pgrep, so verify it is present
# at startup.
if ! command -v pgrep ; then
echo "ERROR: 'pgrep' is not present."
exit 1
fi
# The UTF-8 masking functions rely on the presence of en_US.utf8. Make sure
# it is present.
if locale -a | grep en_US.utf8 ; then
echo "en_US.utf8 is present"
else
echo "ERROR: en_US.utf8 locale is not present."
exit 1
fi
# Set a UTF-8 locale to enable upper/lower/initcap functions with UTF-8 mode.
# Use C.UTF-8 (aka C.utf8) if it is available, and fall back to en_US.utf8 if not
#
# Distributions can show either C.UTF-8 or C.utf8 in "locale -a", match either one
if locale -a | grep -e "^C.UTF-8" -e "^C.utf8" ; then
# C.UTF-8 and C.utf8 are interchangeable as a setting for LC_ALL.
export LC_ALL=C.UTF-8
else
# Presence of en_US.utf8 was verified above
export LC_ALL=en_US.utf8
fi
echo "LC_ALL: ${LC_ALL}"
exec "$@"