我在主服务器和从服务器上使用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
?
答案 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_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" "$@"
类似地,在$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
从以上结果可以看出,该脚本不尊重从属端.bashrc
和etc/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
脚本,结果是上面提到的简短答案。