无法从namenode(主节点)启动群集:datanode(从节点)和namenode(主节点)上的$HADOOP_HOME不同

无法从namenode(主节点)启动群集:datanode(从节点)和namenode(主节点)上的$HADOOP_HOME不同,hadoop,hadoop2,Hadoop,Hadoop2,我在master和slave上使用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

我在master和slave上使用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_HOME在从机上查找Hadoop-daemon.sh和libexec


如何配置各个数据节点/从节点,以便在从主节点启动群集时,检查各个从节点的Hadoop主目录中是否有Hadoop daemon.sh?

一旦设置群集,从主节点启动所有守护进程

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

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

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

如果已安装,请运行 找到hadoop-env.sh
或者查找/-name hadoop env.sh

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

在主路径上:

/opt/hadoop简短回答 在主机端 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\u CONF\u DIR$@

将该行更改为以下行,使其与从属端环境变量相关:

exec$bin/slaves.sh source.bash_别名\;hadoop-daemon.sh$@

sarn-daemons.sh 同样,在$HADOOP_HOME/sbin/warn-daemons.sh中,更改行:

exec$bin/slaves.sh-config$spirn_CONF_DIR cd$HADOOP_spirn_HOME\$bin/thread-daemon.sh-config$thread\u CONF\u DIR$@

exec$bin/slaves.sh source.bash_别名\;thread-daemon.sh$@

在奴隶方面 将所有与Hadoop相关的环境变量放入$HOME/.bash\u别名中

启动/停止 要启动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\u ssh\u选择$slave$$${@//\}\ 2> &1| sed s/^/$slave:/& 我在它前面添加了3行以转储变量:

printf'XXX HADOOP\u SSH\u选项:%s\n'$HADOOP\u SSH\u选项 printf'XXX slave:%s\n'$slave printf'XXX命令:%s\n'$${@//\\} 在sbin/hadoop-daemons.sh中,调用sbin/slaves.sh的行读作I,将其拆分为两行以防止滚动:

exec$bin/slaves.sh-config$HADOOP_CONF_DIR cd$HADOOP_PREFIX\\ $bin/hadoop-daemon.sh-config$hadoop\u CONF\u 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
从上面的结果可以看出,脚本不考虑slave-side.bashrc和etc/hadoop/hadoop-env.sh

解决方案 从上面的结果中,我们知道变量$HADOOP_CONF_DIR是在主端解析的。如果在从机端解决,问题将得到解决。但是,由于ssh创建的附带命令的shell是非交互式shell,因此.bashrc脚本不会加载到从机端。因此,以下命令不打印任何内容:

ssh slave1'echo$HADOOP\u HOME' 我们可以强制加载它。bashrc:

ssh slave1'source.bashrc;echo$HADOO P_HOME' 但是,Ubuntu 18.04中.bashrc default中的以下块保护非交互式shell:

如果不是以交互方式运行,则不要执行任何操作 案例$-in *我*;; *返回;; 以撒 此时,您可以从.bashrc中删除上面的块以尝试实现该目标,但我认为这不是一个好主意。我没有试过,但我认为守卫在那里是有原因的

在我的平台Ubuntu18.04上,当我通过控制台或ssh交互登录时,.profile加载.bashrc和.bashrc加载.bash_别名。因此,我有一个保持所有.profile、.bashrc、.bash_注销不变的习惯,并将任何自定义设置放入.bash_别名中

如果在您的平台上未加载.bash_别名,请将以下代码附加到.bashrc:

如果[-f~/.bash_别名];然后 . ~/.bash_别名 fi 回到问题上来。因此,我们可以加载.bash_别名,而不是.bashrc。因此,以下代码完成了这项工作,并打印了从机端的$HADOOP_HOME:

ssh slave1’source.bash_别名;echo$HADOOP_HOME'
通过将此技术应用于sbin/hadoop-daemons.sh脚本,结果就是上面提到的简短答案。

版本应该很重要。Hadoop 3属性在Hadoop 2或1上不起作用。如果主设备上有Hadoop 3,从设备上有Hadoop 2,那么它可以正常工作,但目录名应该是Hadoop,因为两者都只有Hadoop,它将从主设备上获取数据,并在从设备上搜索同一配置文件。目录名和位置并不重要。客户端与主机对话所使用的协议以及它们从文件中读取的属性都很重要。例如,如果您有一个启用了Thread Docker容器和擦除编码HDFS设置的属性文件,则该文件仅适用于hadoop 3,hadoop 3、2、1中的hadoop不支持任何lessAPIs