我在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
?
4条答案
按热度按时间j8yoct9x1#
设置集群后,从主服务器启动所有守护程序
为了从主节点启动所有节点,
所以命令是
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”
jgovgodb3#
为了获得最佳解决方案,您应该将hadoop目录保留在任意目录中,但对于这两个目录都应该相同,例如:
在主路径上:
在从属路径上
使用哪个版本无关紧要,但目录名应该相同
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
内容如下:我在它前面添加了3行来转储变量:
在
sbin/hadoop-daemons.sh
,电话sbin/slaves.sh
读取(我将其分成两行以防止滚动):这个
sbin/start-dfs.sh
脚本调用sbin/hadoop-daemons.sh
. 结果如下:sbin/start-dfs.sh
执行时间:从上面的结果可以看出,脚本不尊重从属端
.bashrc
以及etc/hadoop/hadoop-env.sh
.解决方案
从上面的结果,我们知道
$HADOOP_CONF_DIR
在主机端解决。如果在从端解决,问题就解决了。但是,由于ssh
(附加了命令)是一个非交互式shell.bashrc
从端未加载脚本。因此,以下命令不打印任何内容:我们可以强迫它加载
.bashrc
:但是,下面的块
.bashrc
(在ubuntu 18.04中默认)保护非交互式shell:此时,您可以从
.bashrc
努力实现目标,但我认为这不是个好主意。我没有试过,但我认为警卫在那里是有原因的。在我的平台(ubuntu18.04)上,当我以交互方式(通过控制台或ssh)登录时,
.profile
荷载.bashrc
,和.bashrc
荷载.bash_aliases
. 因此,我有一个习惯,保持一切.profile
,.bashrc
,.bash_logout
未更改,并将任何自定义设置放入.bash_aliases
.如果在你的平台上
.bash_aliases
不加载,将以下代码附加到.bashrc
:回到问题上来。因此我们可以
.bash_aliases
而不是.bashrc
. 所以,下面的代码完成了这项工作$HADOOP_HOME
从从机侧打印:将此技术应用于
sbin/hadoop-daemons.sh
脚本,结果就是上面提到的简短答案。