| #!/usr/bin/env 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. |
| |
| # The name of the script being executed. |
| HADOOP_SHELL_EXECNAME="ozone" |
| MYNAME="${BASH_SOURCE-$0}" |
| JVM_PID="$$" |
| ## @description build up the hdfs command's usage text. |
| ## @audience public |
| ## @stability stable |
| ## @replaceable no |
| function hadoop_usage |
| { |
| hadoop_add_option "--buildpaths" "attempt to add class files from build tree" |
| hadoop_add_option "--daemon (start|status|stop)" "operate on a daemon" |
| hadoop_add_option "--hostnames list[,of,host,names]" "hosts to use in worker mode" |
| hadoop_add_option "--hosts filename" "list of hosts to use in worker mode" |
| hadoop_add_option "--loglevel level" "set the log4j level for this command" |
| hadoop_add_option "--workers" "turn on worker mode" |
| |
| hadoop_add_subcommand "auditparser" client "runs audit parser tool" |
| hadoop_add_subcommand "classpath" client "prints the class path needed to get the hadoop jar and the required libraries" |
| hadoop_add_subcommand "datanode" daemon "run a HDDS datanode" |
| hadoop_add_subcommand "envvars" client "display computed Hadoop environment variables" |
| hadoop_add_subcommand "freon" client "runs an ozone data generator" |
| hadoop_add_subcommand "fs" client "run a filesystem command on Ozone file system. Equivalent to 'hadoop fs'" |
| hadoop_add_subcommand "genconf" client "generate minimally required ozone configs and output to ozone-site.xml in specified path" |
| hadoop_add_subcommand "genesis" client "runs a collection of ozone benchmarks to help with tuning." |
| hadoop_add_subcommand "getconf" client "get ozone config values from configuration" |
| hadoop_add_subcommand "jmxget" admin "get JMX exported values from NameNode or DataNode." |
| hadoop_add_subcommand "noz" client "ozone debug tool, convert ozone metadata into relational data" |
| hadoop_add_subcommand "om" daemon "Ozone Manager" |
| hadoop_add_subcommand "scm" daemon "run the Storage Container Manager service" |
| hadoop_add_subcommand "s3g" daemon "run the S3 compatible REST gateway" |
| hadoop_add_subcommand "csi" daemon "run the standalone CSI daemon" |
| hadoop_add_subcommand "recon" daemon "run the Recon service" |
| hadoop_add_subcommand "scmcli" client "run the CLI of the Storage Container Manager" |
| hadoop_add_subcommand "sh" client "command line interface for object store operations" |
| hadoop_add_subcommand "s3" client "command line interface for s3 related operations" |
| hadoop_add_subcommand "insight" client "tool to get runtime opeartion information" |
| hadoop_add_subcommand "version" client "print the version" |
| hadoop_add_subcommand "dtutil" client "operations related to delegation tokens" |
| hadoop_add_subcommand "upgrade" client "HDFS to Ozone in-place upgrade tool" |
| |
| hadoop_generate_usage "${HADOOP_SHELL_EXECNAME}" false |
| } |
| |
| ## @description Default command handler for hadoop command |
| ## @audience public |
| ## @stability stable |
| ## @replaceable no |
| ## @param CLI arguments |
| function ozonecmd_case |
| { |
| subcmd=$1 |
| shift |
| |
| ozone_default_log4j="${HADOOP_CONF_DIR}/log4j.properties" |
| ozone_shell_log4j="${HADOOP_CONF_DIR}/ozone-shell-log4j.properties" |
| if [ ! -f "${ozone_shell_log4j}" ]; then |
| ozone_shell_log4j=${ozone_default_log4j} |
| fi |
| |
| case ${subcmd} in |
| auditparser) |
| HADOOP_CLASSNAME=org.apache.hadoop.ozone.audit.parser.AuditParser |
| OZONE_RUN_ARTIFACT_NAME="hadoop-ozone-tools" |
| ;; |
| classpath) |
| if [[ "$#" -gt 0 ]]; then |
| OZONE_RUN_ARTIFACT_NAME="$1" |
| HADOOP_CLASSNAME="org.apache.hadoop.util.Classpath" |
| #remove the artifact name and replace it with glob |
| # (We need at least one argument to execute the Classpath helper class) |
| HADOOP_SUBCMD_ARGS[0]="--glob" |
| else |
| hadoop_finalize |
| echo "Usage: ozone classpath <ARTIFACTNAME>" |
| echo "Where the artifact name is one of:" |
| echo "" |
| ls -1 ${HADOOP_HDFS_HOME}/share/ozone/classpath/ | sed 's/.classpath//' |
| exit -1 |
| fi |
| ;; |
| datanode) |
| HADOOP_SUBCMD_SUPPORTDAEMONIZATION="true" |
| # Add JVM parameter (org.apache.ratis.thirdparty.io.netty.allocator.useCacheForAllThreads=false) |
| # for disabling netty PooledByteBufAllocator thread caches for non-netty threads. |
| # This parameter significantly reduces GC pressure for Datanode. |
| # Corresponding Ratis issue https://issues.apache.org/jira/browse/RATIS-534. |
| HDDS_DN_OPTS="${HDDS_DN_OPTS} -Dlog4j.configurationFile=${HADOOP_CONF_DIR}/dn-audit-log4j2.properties -Dorg.apache.ratis.thirdparty.io.netty.allocator.useCacheForAllThreads=false" |
| HADOOP_OPTS="${HADOOP_OPTS} ${HDDS_DN_OPTS}" |
| HADOOP_CLASSNAME=org.apache.hadoop.ozone.HddsDatanodeService |
| OZONE_RUN_ARTIFACT_NAME="hadoop-ozone-datanode" |
| ;; |
| envvars) |
| echo "JAVA_HOME='${JAVA_HOME}'" |
| echo "HADOOP_HDFS_HOME='${HADOOP_HDFS_HOME}'" |
| echo "HDFS_DIR='${HDFS_DIR}'" |
| echo "HDFS_LIB_JARS_DIR='${HDFS_LIB_JARS_DIR}'" |
| echo "HADOOP_CONF_DIR='${HADOOP_CONF_DIR}'" |
| echo "HADOOP_TOOLS_HOME='${HADOOP_TOOLS_HOME}'" |
| echo "HADOOP_TOOLS_DIR='${HADOOP_TOOLS_DIR}'" |
| echo "HADOOP_TOOLS_LIB_JARS_DIR='${HADOOP_TOOLS_LIB_JARS_DIR}'" |
| if [[ -n "${QATESTMODE}" ]]; then |
| echo "MYNAME=${MYNAME}" |
| echo "HADOOP_SHELL_EXECNAME=${HADOOP_SHELL_EXECNAME}" |
| fi |
| exit 0 |
| ;; |
| freon) |
| HADOOP_CLASSNAME=org.apache.hadoop.ozone.freon.Freon |
| OZONE_FREON_OPTS="${OZONE_FREON_OPTS} -Dhadoop.log.file=ozone-freon.log -Dlog4j.configuration=file:${ozone_shell_log4j}" |
| HADOOP_OPTS="${HADOOP_OPTS} ${OZONE_FREON_OPTS}" |
| OZONE_RUN_ARTIFACT_NAME="hadoop-ozone-tools" |
| ;; |
| genesis) |
| HADOOP_CLASSNAME=org.apache.hadoop.ozone.genesis.Genesis |
| OZONE_RUN_ARTIFACT_NAME="hadoop-ozone-tools" |
| ;; |
| getconf) |
| HADOOP_CLASSNAME=org.apache.hadoop.ozone.freon.OzoneGetConf; |
| OZONE_RUN_ARTIFACT_NAME="hadoop-ozone-tools" |
| ;; |
| om) |
| HADOOP_SUBCMD_SUPPORTDAEMONIZATION="true" |
| HADOOP_CLASSNAME=org.apache.hadoop.ozone.om.OzoneManagerStarter |
| HDFS_OM_OPTS="${HDFS_OM_OPTS} -Dlog4j.configurationFile=${HADOOP_CONF_DIR}/om-audit-log4j2.properties" |
| HADOOP_OPTS="${HADOOP_OPTS} ${HDFS_OM_OPTS}" |
| OZONE_RUN_ARTIFACT_NAME="hadoop-ozone-ozone-manager" |
| ;; |
| sh | shell) |
| HADOOP_CLASSNAME=org.apache.hadoop.ozone.web.ozShell.OzoneShell |
| HDFS_OM_SH_OPTS="${HDFS_OM_SH_OPTS} -Dhadoop.log.file=ozone-shell.log |
| -Dlog4j.configuration=file:${ozone_shell_log4j}" |
| HADOOP_OPTS="${HADOOP_OPTS} ${HDFS_OM_SH_OPTS}" |
| OZONE_RUN_ARTIFACT_NAME="hadoop-ozone-ozone-manager" |
| ;; |
| s3) |
| HADOOP_CLASSNAME=org.apache.hadoop.ozone.web.ozShell.s3.S3Shell |
| OZONE_RUN_ARTIFACT_NAME="hadoop-ozone-ozone-manager" |
| ;; |
| scm) |
| HADOOP_SUBCMD_SUPPORTDAEMONIZATION="true" |
| HADOOP_CLASSNAME='org.apache.hadoop.hdds.scm.server.StorageContainerManagerStarter' |
| hadoop_debug "Appending HDFS_STORAGECONTAINERMANAGER_OPTS onto HADOOP_OPTS" |
| HDFS_STORAGECONTAINERMANAGER_OPTS="${HDFS_STORAGECONTAINERMANAGER_OPTS} -Dlog4j.configurationFile=${HADOOP_CONF_DIR}/scm-audit-log4j2.properties" |
| HADOOP_OPTS="${HADOOP_OPTS} ${HDFS_STORAGECONTAINERMANAGER_OPTS}" |
| OZONE_RUN_ARTIFACT_NAME="hadoop-hdds-server-scm" |
| ;; |
| s3g) |
| HADOOP_SUBCMD_SUPPORTDAEMONIZATION="true" |
| HADOOP_CLASSNAME='org.apache.hadoop.ozone.s3.Gateway' |
| OZONE_RUN_ARTIFACT_NAME="hadoop-ozone-s3gateway" |
| ;; |
| csi) |
| HADOOP_SUBCMD_SUPPORTDAEMONIZATION="true" |
| HADOOP_CLASSNAME='org.apache.hadoop.ozone.csi.CsiServer' |
| OZONE_RUN_ARTIFACT_NAME="hadoop-ozone-csi" |
| ;; |
| recon) |
| HADOOP_SUBCMD_SUPPORTDAEMONIZATION="true" |
| HADOOP_CLASSNAME='org.apache.hadoop.ozone.recon.ReconServer' |
| OZONE_RUN_ARTIFACT_NAME="hadoop-ozone-recon" |
| ;; |
| fs) |
| HADOOP_CLASSNAME=org.apache.hadoop.fs.ozone.OzoneFsShell |
| OZONE_RUN_ARTIFACT_NAME="hadoop-ozone-tools" |
| ;; |
| scmcli) |
| HADOOP_CLASSNAME=org.apache.hadoop.hdds.scm.cli.SCMCLI |
| HADOOP_OPTS="${HADOOP_OPTS} ${HDFS_SCM_CLI_OPTS}" |
| OZONE_RUN_ARTIFACT_NAME="hadoop-hdds-tools" |
| ;; |
| insight) |
| HADOOP_CLASSNAME=org.apache.hadoop.ozone.insight.Insight |
| HADOOP_OPTS="${HADOOP_OPTS} ${HDFS_SCM_CLI_OPTS}" |
| OZONE_RUN_ARTIFACT_NAME="hadoop-ozone-insight" |
| ;; |
| version) |
| HADOOP_CLASSNAME=org.apache.hadoop.ozone.util.OzoneVersionInfo |
| OZONE_RUN_ARTIFACT_NAME="hadoop-ozone-common" |
| ;; |
| genconf) |
| HADOOP_CLASSNAME=org.apache.hadoop.ozone.genconf.GenerateOzoneRequiredConfigurations |
| OZONE_RUN_ARTIFACT_NAME="hadoop-ozone-tools" |
| ;; |
| dtutil) |
| HADOOP_CLASSNAME=org.apache.hadoop.security.token.DtUtilShell |
| OZONE_RUN_ARTIFACT_NAME="hadoop-ozone-tools" |
| ;; |
| upgrade) |
| HADOOP_CLASSNAME=org.apache.hadoop.ozone.upgrade.InPlaceUpgrade |
| OZONE_RUN_ARTIFACT_NAME="hadoop-ozone-upgrade" |
| ;; |
| *) |
| HADOOP_CLASSNAME="${subcmd}" |
| if ! hadoop_validate_classname "${HADOOP_CLASSNAME}"; then |
| hadoop_exit_with_usage 1 |
| fi |
| ;; |
| esac |
| } |
| |
| # let's locate libexec... |
| if [[ -n "${HADOOP_HOME}" ]]; then |
| HADOOP_DEFAULT_LIBEXEC_DIR="${HADOOP_HOME}/libexec" |
| else |
| bin=$(cd -P -- "$(dirname -- "${MYNAME}")" >/dev/null && pwd -P) |
| HADOOP_DEFAULT_LIBEXEC_DIR="${bin}/../libexec" |
| fi |
| |
| HADOOP_LIBEXEC_DIR="${HADOOP_LIBEXEC_DIR:-$HADOOP_DEFAULT_LIBEXEC_DIR}" |
| # shellcheck disable=SC2034 |
| HADOOP_NEW_CONFIG=true |
| if [[ -f "${HADOOP_LIBEXEC_DIR}/ozone-config.sh" ]]; then |
| # shellcheck source=./hadoop-ozone/common/src/main/bin/ozone-config.sh |
| . "${HADOOP_LIBEXEC_DIR}/ozone-config.sh" |
| else |
| echo "ERROR: Cannot execute ${HADOOP_LIBEXEC_DIR}/ozone-config.sh." 2>&1 |
| exit 1 |
| fi |
| |
| # now that we have support code, let's abs MYNAME so we can use it later |
| MYNAME=$(hadoop_abs "${MYNAME}") |
| |
| if [[ $# = 0 ]]; then |
| hadoop_exit_with_usage 1 |
| fi |
| |
| HADOOP_SUBCMD=$1 |
| shift |
| |
| |
| if hadoop_need_reexec ozone "${HADOOP_SUBCMD}"; then |
| hadoop_uservar_su ozone "${HADOOP_SUBCMD}" \ |
| "${MYNAME}" \ |
| "--reexec" \ |
| "${HADOOP_USER_PARAMS[@]}" |
| exit $? |
| fi |
| |
| hadoop_verify_user_perm "${HADOOP_SHELL_EXECNAME}" "${HADOOP_SUBCMD}" |
| |
| HADOOP_SUBCMD_ARGS=("$@") |
| |
| if declare -f ozone_subcommand_"${HADOOP_SUBCMD}" >/dev/null 2>&1; then |
| hadoop_debug "Calling dynamically: ozone_subcommand_${HADOOP_SUBCMD} ${HADOOP_SUBCMD_ARGS[*]}" |
| "ozone_subcommand_${HADOOP_SUBCMD}" "${HADOOP_SUBCMD_ARGS[@]}" |
| else |
| ozonecmd_case "${HADOOP_SUBCMD}" "${HADOOP_SUBCMD_ARGS[@]}" |
| fi |
| |
| |
| # |
| # Setting up classpath based on the generate classpath descriptors |
| # |
| if [ ! "$OZONE_RUN_ARTIFACT_NAME" ]; then |
| echo "ERROR: Ozone components require to set OZONE_RUN_ARTIFACT_NAME to set the classpath" |
| exit -1 |
| fi |
| export HDDS_LIB_JARS_DIR="${HADOOP_HDFS_HOME}/share/ozone/lib" |
| CLASSPATH_FILE="${HADOOP_HDFS_HOME}/share/ozone/classpath/${OZONE_RUN_ARTIFACT_NAME}.classpath" |
| if [ ! "$CLASSPATH_FILE" ]; then |
| echo "ERROR: Classpath file descriptor $CLASSPATH_FILE is missing" |
| exit -1 |
| fi |
| # shellcheck disable=SC1090,SC2086 |
| source $CLASSPATH_FILE |
| OIFS=$IFS |
| IFS=':' |
| # shellcheck disable=SC2154 |
| for jar in $classpath; do |
| hadoop_add_classpath "$jar" |
| done |
| hadoop_add_classpath "${HADOOP_HDFS_HOME}/share/ozone/web" |
| |
| #We need to add the artifact manually as it's not part the generated classpath desciptor |
| ARTIFACT_LIB_DIR="${HADOOP_HDFS_HOME}/share/ozone/lib" |
| MAIN_ARTIFACT=$(find "$ARTIFACT_LIB_DIR" -name "${OZONE_RUN_ARTIFACT_NAME}-*.jar") |
| if [ ! "$MAIN_ARTIFACT" ]; then |
| echo "ERROR: Component jar file $MAIN_ARTIFACT is missing from ${HADOOP_HDFS_HOME}/share/ozone/lib" |
| fi |
| hadoop_add_classpath "${MAIN_ARTIFACT}" |
| IFS=$OIFS |
| |
| |
| hadoop_add_client_opts |
| |
| if [[ ${HADOOP_WORKER_MODE} = true ]]; then |
| hadoop_common_worker_mode_execute "${HADOOP_HDFS_HOME}/bin/ozone" "${HADOOP_USER_PARAMS[@]}" |
| exit $? |
| fi |
| |
| hadoop_subcommand_opts "${HADOOP_SHELL_EXECNAME}" "${HADOOP_SUBCMD}" |
| |
| # everything is in globals at this point, so call the generic handler |
| hadoop_generic_java_subcmd_handler |