无法从namenode(master)启动集群:datanode(slave)和namenode(master)上的$hadoop\u home不同

omhiaaxx  于 2021-05-30  发布在  Hadoop
关注(0)|答案(4)|浏览(351)

我在master和slave上使用hadoop1.2.1,但是我在不同的目录上安装了它们。所以当我调用 bin/start-dfs.sh 在master上,我得到以下错误。

partho@partho-Satellite-L650: starting datanode, logging to /home/partho/hadoop/apache/hadoop-1.2.1/libexec/../logs/hadoop-partho-datanode-partho-Satellite-L650.out
hduser@node2-VirtualBox: bash: line 0:**cd: /home/partho/hadoop/apache/hadoop-1.2.1/libexec/..: No such file or directory**
hduser@node2-VirtualBox: bash:**/home/partho/hadoop/apache/hadoop-1.2.1/bin/hadoop-daemon.sh: No such file or directory**
partho@partho-Satellite-L650: starting secondarynamenode, logging to /home/partho/hadoop/apache/hadoop-1.2.1/libexec/../logs/hadoop-partho-secondarynamenode-partho-Satellite-L650.out

守护进程在主服务器上创建得很好,如下所示

partho@partho-Satellite-L650:~/hadoop/apache/hadoop-1.2.1$ jps
4850 Jps

4596 DataNode

4441 NameNode

4764 SecondaryNameNode

很明显,hadoop正试图找到 hadoop-daemon.sh 以及 libexec 使用 $HADOOP_HOME 在主人身上。
如何配置各个datanodes/slave,以便在从master启动集群时,检查各个slave的hadoop主目录 hadoop-daemon.sh ?

j8yoct9x

j8yoct9x1#

设置集群后,从主服务器启动所有守护程序

bin/hadoop namenode -format(if required)
bin/stop-dfs.sh
bin/start-dfs.sh
bin/start-mapred.sh

为了从主节点启动所有节点,

- you need to install ssh on each node
- once you install ssh and generate ssh key in each server, try connecting each nodes from master
- make sure slaves file in master node has all Ips of all nodes

所以命令是

- install ssh(in each node) : apt-get install openssh-server
- once ssh is installed,generate key : ssh-keygen -t rsa -P ""
- Create password less login from namenode to each node:
  ssh-copy-id -i $HOME/.ssh/id_rsa.pub user@datanodeIP
  user - hadoop user on each machine`enter code here`
- put all nodes ip in slaves(in conf dir) file in namenode
9udxz4iz

9udxz4iz2#

hadoop通常在名为hadoop-env.sh的文件中的每个节点上设置hadoop\u home环境变量。
您可以使用每个节点的路径更新每个节点上的hadoop-env.sh。它应该在/home/partho/hadoop/apache/hadoop-1.2.1/中。可能要先停止集群,这样它才能接收更改。
如果已安装locate,请运行locate hadoop-env.sh或find/-name“hadoop env.sh”

jgovgodb

jgovgodb3#

为了获得最佳解决方案,您应该将hadoop目录保留在任意目录中,但对于这两个目录都应该相同,例如:
在主路径上:

/opt/hadoop

在从属路径上

/opt/hadoop

使用哪个版本无关紧要,但目录名应该相同

jhdbpxl9

jhdbpxl94#

简短的回答

在主机侧

hadoop-daemons.sh

$HADOOP_HOME/sbin/hadoop-daemons.sh (不是 $HADOOP_HOME/sbin/hadoop-daemon.sh ,有一个 s 在文件名中),有一个行调用 $HADOOP_HOME/sbin/slaves.sh . 在我的版本(hadoop v2.7.7)中,它是这样写的: exec "$bin/slaves.sh" --config $HADOOP_CONF_DIR cd "$HADOOP_PREFIX" \; "$bin/hadoop-daemon.sh" --config $HADOOP_CONF_DIR "$@" 将行it更改为以下行,使其与从属端环境变量相关: exec "$bin/slaves.sh" "source" ".bash_aliases" \; "hadoop-daemon.sh" "$@" ####Yarn-守护进程.sh
同样,在 $HADOOP_HOME/sbin/yarn-daemons.sh ,更改行: exec "$bin/slaves.sh" --config $YARN_CONF_DIR cd "$HADOOP_YARN_HOME" \; "$bin/yarn-daemon.sh" --config $YARN_CONF_DIR "$@"exec "$bin/slaves.sh" "source" ".bash_aliases" \; "yarn-daemon.sh" "$@" ###从机侧
将所有与hadoop相关的环境变量放入 $HOME/.bash_aliases .

启动/停止

要启动hdfs,只需运行 start-dfs.sh 在主人那边。从机端数据节点将启动,如同 hadoop-daemon.sh start datanode 从从机端的交互式shell执行。
要停止hdfs,只需运行 stop-dfs.sh .

注意

以上更改已完成。但对于完美主义者来说,你可能还想解决 sbin/hadoop-daemons.sh 以便在转储命令时命令是正确的。在本例中,查找 hadoop-daemons.sh 在hadoop脚本中 --script "$bin"/hdfs--script hdfs (以及所有 --script "$bin"/something 为了公正 --script something ). 就我而言,所有的事件都是 hdfs ,并且由于从机端将重写命令路径 hdfs 与此相关,不管是否有此修复,命令都可以正常工作。
下面是一个示例fix-in sbin/start-secure-dns.sh .
更改: "$HADOOP_PREFIX"/sbin/hadoop-daemons.sh --config $HADOOP_CONF_DIR --script "$bin"/hdfs start datanode $dataStartOpt"$HADOOP_PREFIX"/sbin/hadoop-daemons.sh --config $HADOOP_CONF_DIR --script hdfs start datanode $dataStartOpt 在我的版本(hadoop v2.7.7)中,需要修复以下文件: sbin/start-secure-dns.sh (1次) sbin/stop-secure-dns.sh (1次) sbin/start-dfs.sh (5次) sbin/stop-dfs.sh (5次)

解释

sbin/slaves.sh ,通过 ssh 内容如下:

ssh $HADOOP_SSH_OPTS $slave $"${@// /\\ }" \
   2>&1 | sed "s/^/$slave: /" &

我在它前面添加了3行来转储变量:

printf 'XXX HADOOP_SSH_OPTS: %s\n' "$HADOOP_SSH_OPTS"
 printf 'XXX slave: %s\n' "$slave"
 printf 'XXX command: %s\n' $"${@// /\\ }"

sbin/hadoop-daemons.sh ,电话 sbin/slaves.sh 读取(我将其分成两行以防止滚动):

exec "$bin/slaves.sh" --config $HADOOP_CONF_DIR cd "$HADOOP_PREFIX" \; \
 "$bin/hadoop-daemon.sh" --config $HADOOP_CONF_DIR "$@"

这个 sbin/start-dfs.sh 脚本调用 sbin/hadoop-daemons.sh . 结果如下: sbin/start-dfs.sh 执行时间:

Starting namenodes on [master]
XXX HADOOP_SSH_OPTS: 
XXX slave: master
XXX command: cd
XXX command: /home/hduser/hadoop-2.7.7
XXX command: ;
XXX command: /home/hduser/hadoop-2.7.7/sbin/hadoop-daemon.sh
XXX command: --config
XXX command: /home/hduser/hadoop-2.7.7/etc/hadoop
XXX command: --script
XXX command: /home/hduser/hadoop-2.7.7/sbin/hdfs
XXX command: start
XXX command: namenode
master: starting namenode, logging to /home/hduser/hadoop-2.7.7/logs/hadoop-hduser-namenode-akmacbook.out
XXX HADOOP_SSH_OPTS: 
XXX slave: slave1
XXX command: cd
XXX command: /home/hduser/hadoop-2.7.7
XXX command: ;
XXX command: /home/hduser/hadoop-2.7.7/sbin/hadoop-daemon.sh
XXX command: --config
XXX command: /home/hduser/hadoop-2.7.7/etc/hadoop
XXX command: --script
XXX command: /home/hduser/hadoop-2.7.7/sbin/hdfs
XXX command: start
XXX command: datanode
slave1: bash: line 0: cd: /home/hduser/hadoop-2.7.7: Permission denied
slave1: bash: /home/hduser/hadoop-2.7.7/sbin/hadoop-daemon.sh: Permission denied
Starting secondary namenodes [master]
XXX HADOOP_SSH_OPTS: 
XXX slave: master
XXX command: cd
XXX command: /home/hduser/hadoop-2.7.7
XXX command: ;
XXX command: /home/hduser/hadoop-2.7.7/sbin/hadoop-daemon.sh
XXX command: --config
XXX command: /home/hduser/hadoop-2.7.7/etc/hadoop
XXX command: --script
XXX command: /home/hduser/hadoop-2.7.7/sbin/hdfs
XXX command: start
XXX command: secondarynamenode
master: starting secondarynamenode, logging to /home/hduser/hadoop-2.7.7/logs/hadoop-hduser-secondarynamenode-akmacbook.out

从上面的结果可以看出,脚本不尊重从属端 .bashrc 以及 etc/hadoop/hadoop-env.sh .

解决方案

从上面的结果,我们知道 $HADOOP_CONF_DIR 在主机端解决。如果在从端解决,问题就解决了。但是,由于 ssh (附加了命令)是一个非交互式shell .bashrc 从端未加载脚本。因此,以下命令不打印任何内容:

ssh slave1 'echo $HADOOP_HOME'

我们可以强迫它加载 .bashrc :

ssh slave1 'source .bashrc; echo $HADOOP_HOME'

但是,下面的块 .bashrc (在ubuntu 18.04中默认)保护非交互式shell:


# If not running interactively, don't do anything

case $- in
    *i*) ;;
      *) return;;
esac

此时,您可以从 .bashrc 努力实现目标,但我认为这不是个好主意。我没有试过,但我认为警卫在那里是有原因的。
在我的平台(ubuntu18.04)上,当我以交互方式(通过控制台或ssh)登录时, .profile 荷载 .bashrc ,和 .bashrc 荷载 .bash_aliases . 因此,我有一个习惯,保持一切 .profile , .bashrc , .bash_logout 未更改,并将任何自定义设置放入 .bash_aliases .
如果在你的平台上 .bash_aliases 不加载,将以下代码附加到 .bashrc :

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

回到问题上来。因此我们可以 .bash_aliases 而不是 .bashrc . 所以,下面的代码完成了这项工作 $HADOOP_HOME 从从机侧打印:

ssh slave1 'source .bash_aliases; echo $HADOOP_HOME'

将此技术应用于 sbin/hadoop-daemons.sh 脚本,结果就是上面提到的简短答案。

相关问题