Hadoop3.1.0部署好启动服务的时候发现有下面一警告:
WARNING: HADOOP_PREFIX has been replaced by HADOOP_HOME.
Using value of HADOOP_PREFIX.
每次执行一个命令的时候都会有这么一个警告,看着实在不爽,怎么把它去掉呢?
看警告的意思:hadoop_prefix
这个变量被hadoop_home
这个变量取代了,Hadoop将使用hadoop_prefix
这个变量。
虽然能翻译过来,但是意思不太明白,那就看一下源码吧
Hadoop那么多Shell脚本到底是哪个呢?
我也不知道,在Hadoop根目录下搜一下吧:
grep -ri hadoop_prefix
hadoop_home变量定义的地方太多,搜hadoop_prefix
我们发现上面的都是帮助文档,最下面一行是定义在shell脚本里的:
libexec/hadoop-config.sh:hadoop_deprecate_envvar HADOOP_PREFIX HADOOP_HOME
OK,我们可以去这个源文件看下:
vim libexec/hadoop-config.sh
...
...
# get our functions defined for usage later
if [[ -n "${HADOOP_COMMON_HOME}" ]] &&
[[ -e "${HADOOP_COMMON_HOME}/libexec/hadoop-functions.sh" ]]; then
# shellcheck source=./hadoop-common-project/hadoop-common/src/main/bin/hadoop-functions.sh
. "${HADOOP_COMMON_HOME}/libexec/hadoop-functions.sh"
elif [[ -e "${HADOOP_LIBEXEC_DIR}/hadoop-functions.sh" ]]; then
# shellcheck source=./hadoop-common-project/hadoop-common/src/main/bin/hadoop-functions.sh
. "${HADOOP_LIBEXEC_DIR}/hadoop-functions.sh"
else
echo "ERROR: Unable to exec ${HADOOP_LIBEXEC_DIR}/hadoop-functions.sh." 1>&2
exit 1
fi
hadoop_deprecate_envvar HADOOP_PREFIX HADOOP_HOME
# allow overrides of the above and pre-defines of the below
if [[ -n "${HADOOP_COMMON_HOME}" ]] &&
[[ -e "${HADOOP_COMMON_HOME}/libexec/hadoop-layout.sh" ]]; then
# shellcheck source=./hadoop-common-project/hadoop-common/src/main/bin/hadoop-layout.sh.example
. "${HADOOP_COMMON_HOME}/libexec/hadoop-layout.sh"
elif [[ -e "${HADOOP_LIBEXEC_DIR}/hadoop-layout.sh" ]]; then
# shellcheck source=./hadoop-common-project/hadoop-common/src/main/bin/hadoop-layout.sh.example
. "${HADOOP_LIBEXEC_DIR}/hadoop-layout.sh"
fi
...
...
...
我们发现上面Shell脚本正中间hadoop_deprecate_envvar HADOOP_PREFIX HADOOP_HOME
的命令把HADOOP_PREFIX
,HADOOP_HOME
这两个变量传给了hadoop_deprecate_envvar
函数,但是hadoop-config.sh
脚本中没有定义这个函数,那肯定是引用的其他的,那我们去其他地方搜一下吧
grep -ri hadoop_deprecate_envvar /opt/shortcut/hadoop
我们发现hadoop_deprecate_envvar
函数是定义在libexec/hadoop-functions.sh
脚本文件中的,OK,去这个文件看一下吧
看下这个函数的定义:
## @description Replace `oldvar` with `newvar` if `oldvar` exists.
## @audience public
## @stability stable
## @replaceable yes
## @param oldvar
## @param newvar
function hadoop_deprecate_envvar
{
local oldvar=$1
local newvar=$2
local oldval=${!oldvar}
local newval=${!newvar}
if [[ -n "${oldval}" ]]; then
hadoop_error "WARNING: ${oldvar} has been replaced by ${newvar}. Using value of ${oldvar}."
# shellcheck disable=SC2086
eval ${newvar}=\"${oldval}\"
# shellcheck disable=SC2086
newval=${oldval}
# shellcheck disable=SC2086
eval ${newvar}=\"${newval}\"
fi
}
这个函数的意思是:
判断旧的变量是否过时
if -n判断旧变量是否非空,如果非空的话
就给出了上面的警告了
并把旧变量的值传给新变量
这个时候这个警告的意思就很明显,我们在定义Hadoop环境变量的时候定义了一个过时的变量:hadoop_prefix
,这个过时的变量把hadoop_home
变量取代了(虽然我也定义了hadoop_home
变量)
OK,我们只需要把hadoop_prefix
变量全部去掉,或者换成hadoop_home
就可以了,当然记得大写油。
hadoop_prefix
变量全部改成hadoop_home
,具体定义在哪儿要看你自己定义在哪儿了,
一般的有/etc/profile
,~/.bashrc
,
或者/etc/profile.d
目录下
再就是你Hadoop的脚本中了
hadoop_prefix
变量unset HADOOP_PREFIX
我的是定义在/etc/profile.d/hadoop.sh
的,当然你的可能定义的/etc/profile, ~/.bashrc
,
如果定义在Hadoop的执行脚本里就不用执行这一步了
source /etc/profile.d/hadoop.sh
env | grep -i hadoop
hdfs --daemon stop namenode
附上我部署Hadoop3.1.0伪分布式环境的教程吧:
Hadoop3.1.0 伪分布式环境安装部署
同样的,Hadoop还有一些其他的旧的环境变量弃用了,我们也可以使用同样的思路去解决。
我们看下哪些旧的环境变量不用了:
grep -ri hadoop_deprecate_envvar /opt/shortcut/hadoop
列一下这些不建议使用的旧的环境变量吧:
HADOOP_DN_SECURE_EXTRA_OPTS
HADOOP_HDFS_IDENT_STRING
HADOOP_HDFS_LOGFILE
HADOOP_HDFS_LOG_DIR
HADOOP_HDFS_NICENESS
HADOOP_HDFS_PID_DIR
HADOOP_HDFS_ROOT_LOGGER
HADOOP_HDFS_STOP_TIMEOUT
HADOOP_JOB_HISTORYSERVER_OPTS
HADOOP_MAPRED_IDENT_STRING
HADOOP_MAPRED_LOGFILE
HADOOP_MAPRED_LOG_DIR
HADOOP_MAPRED_NICENESS
HADOOP_MAPRED_PID_DIR
HADOOP_MAPRED_ROOT_LOGGER
HADOOP_MAPRED_STOP_TIMEOUT
HADOOP_NFS3_SECURE_EXTRA_OPTS
HADOOP_PREFIX
HADOOP_PRIVILEGED_NFS_USER
HADOOP_SECURE_DN_LOG_DIR
HADOOP_SECURE_DN_PID_DIR
HADOOP_SECURE_DN_USER
HADOOP_SECURE_NFS3_LOG_DIR
HADOOP_SECURE_NFS3_PID_DIR
HADOOP_SLAVES
HADOOP_SLAVE_NAMES
HADOOP_SLAVE_SLEEP
YARN_CONF_DIR
YARN_IDENT_STRING
YARN_LOGFILE
YARN_LOG_DIR
YARN_NICENESS
YARN_OPTS
YARN_PID_DIR
YARN_ROOT_LOGGER
YARN_SLAVES
YARN_STOP_TIMEOUT
YARN_USER_CLASSPATH
YARN_USER_CLASSPATH_FIRST