记Hadoop3.1.2安装排错之ERROR: Cannot set priority of datanode process

问题

在安装Hadoop过程中,对hdfs格式化(# $HADOOP_HOME/bin/hdfs namenode -format)之后,开始启动hdfs(# $HADOOP_HOME/sbin/start-dfs.sh)时,总是报错如下:

ERROR: Cannot set priority of datanode process 3340



解决方案

$HADOOP_HOME/etc/hadoop/hadoop-env.sh最后一行加上HADOOP_SHELL_EXECNAME=root,否则该环境变量默认值为hdfs。同时其他涉及USER的变量也改成root,例如:

export HDFS_DATANODE_USER=root 
export HADOOP_SECURE_DN_USER=root 
export HDFS_NAMENODE_USER=root 
export HDFS_SECONDARYNAMENODE_USER=root 
export YARN_RESOURCEMANAGER_USER=root 
export YARN_NODEMANAGER_USER=root

另外,又发现一个地方会导致此问题,vi $HADOOP_HOME/bin/hdfs会发现脚本前几行有个地方如下:

HADOOP_SHELL_EXECNAME="hdfs"

要将hdfs改成root



解决历程

我个人是在docker中配了三个容器来实现完全分布式安装,对于ssh免密码登录也没问题,一开始以为sshd_config可能没配好,按照网上搜索结果修改UsePAM=no之类的,但是还是没用。

在容器中,一开始并没有新建hdfs等用户,只有root用户,后面特意把整个hadoop目录都改成hdfs用户所有还是没用。

后面干脆把说有环境变量中的user都改成root,依旧没用。

查看apache-hadoop官网查看此英文文档,发现如果ssh免密登录如果没有配置,依然可以通过如下命令启动

$HADOOP_HOME/bin/hdfs namenode -format <cluster_name>  #namenode中执行
$HADOOP_HOME/bin/hdfs --daemon start namenode #namenode中执行

$HADOOP_HOME/bin/hdfs --daemon start datanode #datanode中执行

执行后,依旧出现ERROR: Cannot set priority of datanode process 3340,可以排除ssh免密登录的问题。

花了好长时间,还没解决,我怒了,决定调试hadoop启动的整个过程

首先vi检查$HADOOP_HOME/bin/hdfs文件,了解大致执行情况,然后使用bash -x $HADOOP_HOME/bin/hdfs --daemon start datanode启动bash调试模式运行启动命令,发现最后退出时的执行情况如下:

.........
.........
+ [[ 6 -le 5 ]]
+ echo 3281
+ sleep 1
+ renice 0 3281
+ [[ 1 -gt 0 ]]
+ hadoop_error 'ERROR: Cannot set priority of datanode process 3281'
+ echo 'ERROR: Cannot set priority of datanode process 3281'
ERROR: Cannot set priority of datanode process 3281
+ [[ -f /tmp/hadoop-root-root-datanode.pid ]]
+ disown %+
+ [[ 0 -gt 0 ]]
+ su root -c 'bash -c "ulimit -a"'
+ ps -p 3281
+ return 1
+ exit 1

于是注意到renice这个命令可能是个突破口,查看文档中说只有root用户才可以随意renice别的进程,其他用户只能增加 nice 值。注意到也许是不同用户引起的问题。

再次运行bash调试,注意到开头有如下语句:

+ HADOOP_SHELL_EXECNAME=hdfs
+ MYNAME=/usr/local/hadoop/bin/hdfs
+ [[ -n /usr/local/hadoop ]]
+ HADOOP_DEFAULT_LIBEXEC_DIR=/usr/local/hadoop/libexec
+ HADOOP_LIBEXEC_DIR=/usr/local/hadoop/libexec
+ HADOOP_NEW_CONFIG=true

于是在$HADOOP_HOME/etc/hadoop/hadoop-env.sh最后一行加上HADOOP_SHELL_EXECNAME=root,重新执行$HADOOP_HOME/bin/hdfs --daemon start datanode,用jps查看发现datanode启动成功



总结

  • 出了问题在一时搜索国内解决方案没解决后,先去查看官方英文文档,国内博客好一部分是翻译自国外,或是互相抄袭,甚至抄得莫名其妙。
  • 多调试,报错就调试查看问题根源,bash也是可以调试的



参考资料

  • 如何调试BASH脚本
  • Hadoop Cluster Setup - Apache-Hadoop-Document

欢迎访问我的 个人网站(主要), Github, CSDN(主要), 博客园, 简书, 掘金, 知乎, 微信公众号:HelloVant(主要)

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