Hadoop警告:WARNING: HADOOP_PREFIX has been replaced by HADOOP_HOME. Using value of HADOOP_PREFIX

文章目录

    • 问题描述
    • 问题分析
    • 具体的解决步骤:
      • 第一步:把```hadoop_prefix```变量全部改成```hadoop_home```,
      • 第二步:取消```hadoop_prefix```变量
      • 第三步:source一下使修改后的变量生效
      • 第四步:检查改得是否正确:
    • 最后

问题描述

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
Hadoop警告:WARNING: HADOOP_PREFIX has been replaced by HADOOP_HOME. Using value of HADOOP_PREFIX_第1张图片

我们发现上面的都是帮助文档,最下面一行是定义在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_PREFIXHADOOP_HOME这两个变量传给了hadoop_deprecate_envvar函数,但是hadoop-config.sh脚本中没有定义这个函数,那肯定是引用的其他的,那我们去其他地方搜一下吧

grep -ri hadoop_deprecate_envvar /opt/shortcut/hadoop  

Hadoop警告:WARNING: HADOOP_PREFIX has been replaced by HADOOP_HOME. Using value of HADOOP_PREFIX_第2张图片

我们发现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

第三步:source一下使修改后的变量生效

我的是定义在/etc/profile.d/hadoop.sh的,当然你的可能定义的/etc/profile, ~/.bashrc,
如果定义在Hadoop的执行脚本里就不用执行这一步了

source /etc/profile.d/hadoop.sh

Hadoop警告:WARNING: HADOOP_PREFIX has been replaced by HADOOP_HOME. Using value of HADOOP_PREFIX_第3张图片

第四步:检查改得是否正确:

env | grep -i hadoop

Hadoop警告:WARNING: HADOOP_PREFIX has been replaced by HADOOP_HOME. Using value of HADOOP_PREFIX_第4张图片
OK,再执行一下Hadoop的命令就没有警告了

hdfs --daemon stop namenode

Hadoop旧环境变量不建议使用的警告_05.png

附上我部署Hadoop3.1.0伪分布式环境的教程吧:
Hadoop3.1.0 伪分布式环境安装部署

最后

同样的,Hadoop还有一些其他的旧的环境变量弃用了,我们也可以使用同样的思路去解决。
我们看下哪些旧的环境变量不用了:

grep -ri hadoop_deprecate_envvar /opt/shortcut/hadoop  

Hadoop警告:WARNING: HADOOP_PREFIX has been replaced by HADOOP_HOME. Using value of HADOOP_PREFIX_第5张图片

列一下这些不建议使用的旧的环境变量吧:

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

你可能感兴趣的:(大数据,Hadoop)