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

时间:2015-01-11 01:05:26

标签: hadoop hadoop2

我在主服务器和从服务器上使用Hadoop 1.2.1但我将它们安装在不同的目录上。因此,当我在master上调用bin/start-dfs.sh时,我收到以下错误。

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

如何配置单个数据节点/从属设备,以便在从主服务器启动集群时,检查相应从服务器的Hadoop主目录是否为hadoop-daemon.sh

4 个答案:

答案 0 :(得分:0)

设置群集后,从主

启动所有守护进程
bin/hadoop namenode -format(if required)
bin/stop-dfs.sh
bin/start-dfs.sh
bin/start-mapred.sh

为了从master启动所有节点,

- 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

答案 1 :(得分:0)

Hadoop通常在名为hadoop-env.sh的文件中的每个节点上设置HADOOP_HOME环境变量。

您可以使用相应节点的路径更新每个节点上的hadoop-env.sh。它应该在/home/partho/hadoop/apache/hadoop-1.2.1/中。可能希望首先停止群集,以便接收更改。

如果您找到已安装的运行 找到hadoop-env.sh 或者找到/ -name“hadoop-env.sh”

答案 2 :(得分:0)

为此的最佳解决方案,您应该将hadoop目录保留在任何目录中,但是对于两个示例,它都应该相同:

在主路径上:

/opt/hadoop

在从属路径上

/opt/hadoop

使用哪个版本都没有关系,但是目录名称应该相同

答案 3 :(得分:0)

简短回答

在主端

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 "$@"

将其行更改为以下行,以使其遵守从属端环境变量:

exec "$bin/slaves.sh" "source" ".bash_aliases" \; "hadoop-daemon.sh" "$@"

yarn-daemons.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脚本中查找所有出现的hadoop-daemons.sh并将--script "$bin"/hdfs替换为--script hdfs(并将所有--script "$bin"/something替换为--script something)。在我的情况下,所有出现的事件都是hdfs,由于从属端将在与hdfs相关时重写命令路径,因此无论是否有此修复程序,该命令都能正常工作。

这是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

从以上结果可以看出,该脚本不尊重从属端.bashrcetc/hadoop/hadoop-env.sh


解决方案

从上面的结果中,我们知道变量$HADOOP_CONF_DIR是在主端解析的。如果在从属端解决该问题,则将解决该问题。但是,由于ssh创建的外壳程序(带有命令)是非交互式外壳程序,因此.bashrc脚本不会加载到从属端。因此,以下命令不会显示任何内容:

ssh slave1 'echo $HADOOP_HOME'

我们可以强制其加载.bashrc

ssh slave1 'source .bashrc; echo $HADOOP_HOME'

但是,.bashrc(Ubuntu 18.04中的默认设置)中的以下块可保护非交互式外壳:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

这时,您可以从.bashrc中删除上述代码段以尝试实现该目标,但是我认为这不是一个好主意。我没有尝试过,但是我认为警卫在场是有原因的。

在我的平台(Ubuntu 18.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脚本,结果是上面提到的简短答案