在安装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启动成功
欢迎访问我的 个人网站(主要), Github, CSDN(主要), 博客园, 简书, 掘金, 知乎, 微信公众号:HelloVant(主要)