我有一个4节点集群(1个名称节点/资源管理器3个数据节点/节点管理器)
我正在尝试运行一个简单的tez示例orderedWordCount
hadoop jar C:HDPtez-0.4.0.2.1.1.0-1621tez-mapreduce-examples-0.4.0.2.1.1.0-1621.jar orderedwordcount sample/test.txt /sample/out
作业被接受,应用程序主机和容器被设置,但在节点管理器上,我看到了这些日志
2014-09-10 17:53:31982信息[ServiceThread:org.apache.tez.dag.app.rm.TaskSchedulerEventHandler]org.apache.hadoop.yarn.client.RMProxy:连接到ResourceManager在=0.0.0.0:8030
2014-09-10 17:53:34060信息[ServiceThread:org.apache.tez.dag.app.rm.TaskSchedulerEventHandler]org.apache.hadoop.ipc.Client:正在重新连接到服务器:0.0.0.0/0.0.0.0:8030。已尝试0次;重试策略为RetryUpToMaximumCountWithFixedSleep(最大重试次数=10,睡眠时间=1000毫秒)
可配置超时后,作业失败
我搜索了这个问题,它总是指向yarn.resourcemanager.scheduler.address配置。在我所有的资源管理器节点和节点管理器中,我都正确定义了这个配置,但由于某种原因,它没有被选中
<property>
<name>yarn.resourcemanager.hostname</name>
<value>10.234.225.69</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>${yarn.resourcemanager.hostname}:8032</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>${yarn.resourcemanager.hostname}:8088</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>${yarn.resourcemanager.hostname}:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>${yarn.resourcemanager.hostname}:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>${yarn.resourcemanager.hostname}:8033</value>
</property>
您的ResourceManager可能正在侦听IPv6端口,而您的工作节点(即NodeManager)可能正在使用IPv4连接到ResourceManager
要快速检查是否是这种情况,请进行
netstat -aln | grep 8030
如果你得到了类似:::8030
的东西,那么你的ResourceManager确实在侦听IPv6端口。如果它是IPv4端口,你应该看到类似0.0.0.0:8030
的东西
若要解决此问题,您可能需要考虑在所有计算机上禁用IPv6,然后重试。
Hadoop2代码中配置yarn.resourcemanager.scheduler.address时出现问题,例如:
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>qadoop-nn001.apsalar.com:8030</value>
</property>
它当前未正确放置在的"conf"配置中hadoop-2.7.0/src/hadoop-arn-project/hadoop-arn/hadoop-aarn-commonsrc/main/java.org/apache/hadoop/yarn/client/RMProxy.java
为了证明这个问题,我们修补了该文件,直接注入了我们的调度程序地址。下面的补丁是破解版。根本原因是"conf"对象需要加载属性"yarn.resourcemanager.scheduler.address".
@Private
protected static <T> T createRMProxy(final Configuration configuration, final Class<T> protocol, RMProxy instance) throws IOException {
YarnConfiguration conf = (configuration instanceof YarnConfiguration)
? (YarnConfiguration) configuration
: new YarnConfiguration(configuration);
LOG.info("LEE: changing the conf to include yarn.resourcemanager.scheduler.address at 10.1.26.1");
conf.set("yarn.resourcemanager.scheduler.address", "10.1.26.1");
RetryPolicy retryPolicy = createRetryPolicy(conf);
if (HAUtil.isHAEnabled(conf)) {
RMFailoverProxyProvider<T> provider =
instance.createRMFailoverProxyProvider(conf, protocol);
return (T) RetryProxy.create(protocol, provider, retryPolicy);
} else {
InetSocketAddress rmAddress = instance.getRMAddress(conf, protocol);
LOG.info("LEE: Connecting to ResourceManager at " + rmAddress);
T proxy = RMProxy.<T>getProxy(conf, protocol, rmAddress);
return (T) RetryProxy.create(protocol, proxy, retryPolicy);
}
}
EDIT:我们通过将yarn-site.xml添加到CLASSPATH中解决了这个问题。无需修改RMProxy.java
这是因为无法访问您的资源管理器。尝试从其他节点ping资源管理器,看看它是否有效。在集群中保持这些配置的一致性。