【发布时间】:2015-04-15 08:14:48
【问题描述】:
我有一个向 Hadoop 提交 MR 作业的软件组件。我现在想在提交之前检查是否有其他作业正在运行。我发现新 API 中有一个 Cluster 对象,可用于查询集群中正在运行的作业、获取它们的配置并从中提取相关信息。但是我在使用它时遇到了问题。
只做new Cluster(conf) 其中conf 是一个有效的Configuration 可用于访问此集群(例如,向其提交作业)使对象未配置,并且Cluster 的getAllJobStatuses() 方法返回null。
从配置中提取mapreduce.jobtracker.address,从中构造一个InetSocketAddress并使用Cluster的另一个构造函数抛出Cannot initialize Cluster. Please check your configuration for mapreduce.framework.name and the correspond server addresses.。
使用旧的 api,执行new JobClient(conf).getAllJobs() 之类的操作会引发 NPE。
我在这里缺少什么?如何以编程方式获取正在运行的作业?
【问题讨论】:
-
那么您运行 Hadoop 2.x 吗?你为
mapreduce.framework.name定义了什么? -
是的,我运行 Hadoop 2.x。当我为
mapreduce.framework.name设置yarn并添加jobclient依赖项时,我会更进一步——new Cluster(...)运行没有错误,但getAllJobStatuses()挂起。我认为问题可能出在我用于集成测试的迷你集群上,我必须检查是否在“真实”集群上运行它。 -
我会这样认为,我相当确定它可以在真实集群上运行;)
-
我调查了一些,我很确定这是因为迷你集群。我向它提交了一个虚拟作业(空输入和输出目录,仅此而已),调用
job.getCluster().getAllJobStatuses()并再次收到null。