Java 如何使用新的API以编程方式获取Hadoop集群中所有正在运行的作业?
我有一个向Hadoop提交乔布斯先生的软件组件。我现在想在提交之前检查是否有其他作业正在运行。我发现在新的API中有一个Java 如何使用新的API以编程方式获取Hadoop集群中所有正在运行的作业?,java,hadoop,Java,Hadoop,我有一个向Hadoop提交乔布斯先生的软件组件。我现在想在提交之前检查是否有其他作业正在运行。我发现在新的API中有一个Cluster对象,可以用来查询集群中运行的作业,获取它们的配置并从中提取相关信息。然而,我使用这个有问题 只需执行newcluster(conf)即可,其中conf是一个有效的配置,可用于访问此集群(例如,向其提交作业),使对象未配置,Cluster的getAllJobStatuses()方法返回null 从配置中提取mapreduce.jobtracker.address,
Cluster
对象,可以用来查询集群中运行的作业,获取它们的配置并从中提取相关信息。然而,我使用这个有问题
只需执行newcluster(conf)
即可,其中conf
是一个有效的配置
,可用于访问此集群(例如,向其提交作业),使对象未配置,Cluster
的getAllJobStatuses()
方法返回null
从配置中提取mapreduce.jobtracker.address
,从中构造InetSocketAddress
,并使用Cluster
的其他构造函数抛出无法初始化群集。请检查mapreduce.framework.name的配置以及相应的服务器地址。
使用旧的api,执行类似于newJobClient(conf).getAllJobs()
的操作会抛出一个NPE
我错过了什么?如何以编程方式获取正在运行的作业?我进行了更多的研究,并解决了这个问题。Thomas Jungblut是对的,这是因为小型集群。我使用了下面的微型集群,结果证明它适用于MR jobs,但是以一种不推荐的方式设置了微型集群,配置不完整。Hadoop Wiki还提供了一个示例,说明了如何正确设置小型集群 基本上,我通过以下方式进行小型集群设置:
// Create a YarnConfiguration for bootstrapping the minicluster
final YarnConfiguration bootConf = new YarnConfiguration();
// Base directory to store HDFS data in
final File hdfsBase = Files.createTempDirectory("temp-hdfs-").toFile();
bootConf.set(MiniDFSCluster.HDFS_MINIDFS_BASEDIR, hdfsBase.getAbsolutePath());
// Start Mini DFS cluster
final MiniDFSCluster hdfsCluster = new MiniDFSCluster.Builder(bootConf).build();
// Configure and start Mini MR YARN cluster
bootConf.setInt(YarnConfiguration.RM_SCHEDULER_MINIMUM_ALLOCATION_MB, 64);
bootConf.setClass(YarnConfiguration.RM_SCHEDULER, FifoScheduler.class, ResourceScheduler.class);
final MiniMRYarnCluster yarnCluster = new MiniMRYarnCluster("test-cluster", 1);
yarnCluster.init(bootConf);
yarnCluster.start();
// Get the "real" Configuration to use from now on
final Configuration conf = yarnCluster.getConfig();
// Get the filesystem
final FileSystem fs = new Path ("hdfs://localhost:" + hdfsCluster.getNameNodePort() + "/").getFileSystem(conf);
现在,我有了conf
和fs
我可以用来提交作业和访问HDFS,还有newcluster(conf)
和Cluster.getAllJobStatuses
可以正常工作
当一切都完成后,为了关闭和清理,我呼吁:
yarnCluster.stop();
hdfsCluster.shutdown();
FileUtils.deleteDirectory(hdfsBase); // from Apache Commons IO
注意:
JAVA\u HOME
必须设置才能工作。在Jenkins上构建时,确保为默认JDK设置了JAVA\u HOME
。或者,您可以显式地声明要使用的JDK,Jenkins随后将自动设置JAVA\u HOME
。我这样尝试过,它对我有效,但是在提交作业之后
JobClient jc = new JobClient(job.getConfiguration());
for(JobStatus js: jc.getAllJobs())
{
if(js.getState().getValue() == State.RUNNING.getValue())
{
}
}
jc.close();
或者我们可以从作业api获得集群,并且有一些方法返回所有作业、作业状态
cluster.getAllJobStatuses();
那么您是否运行Hadoop2.x?您为
mapreduce.framework.name
定义了什么?是的,我运行Hadoop 2.x。当我为mapreduce.framework.name
设置warn
并添加jobclient
依赖项时,我得到了更进一步的结果-newcluster(…)
运行时没有错误,但是getAllJobStatuses()
挂起。我想问题可能是我在集成测试中使用的小型集群,我必须对照一个“真实”的集群来检查它的运行情况。我想是这样的,我相当肯定它可以在真实集群上运行;)我调查了更多,我很确定这是因为微型集群。我向它提交了一个名为job.getCluster().getAllJobStatuses()
的虚拟作业(输入和输出目录为空,没有其他内容),并再次收到null
。