我正在设置一个Hadoop YARN集群,我正在使用一台机器作为主机器和从机器。当我使用以下命令启动YARN时,它在从节点上启动nodemanager,而不是在主节点上启动。
sbin/yarn-daemons.sh start nodemanager
我有一个主服务器,同时也是从服务器,然后我在集群中有另外两个从服务器,从服务器中的节点管理器正常启动。
我得到的错误:
org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.net.BindException: Problem binding to [0.0.0.0:8040] java.net.BindException: Address already in use; For more details see: http://wiki.apache.org/hadoop/BindException
部分命令的输出
cat /etc/services | grep 8040
ampify 8040/tcp # Ampify Messaging Protocol
ampify 8040/udp # Ampify Messaging Protocol
lsof -i tcp:8040
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 28021 df 195u IPv6 3580602 0t0 TCP server1.mydomain.com:ampify (LISTEN
在Hadoop附带的默认配置下,端口8040是NodeManager用于本地化器的端口。这基本上是一个服务器端点,负责将运行容器所需的文件带到本地节点上。(例如,可以是MapReduce作业的jar文件或分布式缓存文件)
假设机器上有另一个服务器(这里显示为Ampify)合法地绑定到端口8040,并且您不想停止该服务,那么可以为本地化器重新配置NodeManager使用的端口。在yarn-site.xml文件中设置属性yarn.nodemanager.localizer.address
。在这里记录:
从Hadoop树中的XML源代码中取出,下面是该属性的文档:
<property>
<description>Address where the localizer IPC is.</description>
<name>yarn.nodemanager.localizer.address</name>
<value>${yarn.nodemanager.hostname}:8040</value>
</property>
上面的错误意味着,您正在尝试启动8040上的进程,该进程已被另一个实例占用。
要消除此错误,需要终止当前侦听端口8040的进程。您的lsof输出显示pid为28021。使用以下命令终止进程并重新启动
kill -9 28021