如何使用新API以编程方式获取Hadoop集群中所有正在运行的作业?

时间:2015-04-15 08:14:49

标签: java hadoop

我有一个软件组件,可以将MR作业提交给Hadoop。我现在想在提交之前检查是否还有其他工作正在运行。我发现新API中有一个Cluster对象,可用于查询群集以查找正在运行的作业,获取其配置并从中提取相关信息。但是我在使用它时遇到了问题。

只需执行new Cluster(conf),其中conf是有效的Configuration,可用于访问此群集(例如,向其提交作业),使对象取消配置,并getAllJobStatuses() 1}} Cluster的方法返回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。

我在这里缺少什么?如何以编程方式获取正在运行的作业?

2 个答案:

答案 0 :(得分:2)

我调查了更多,我解决了它。 Thomas Jungblut是对的,这是因为迷你集群。我在this blog post之后使用了迷你群集,结果证明它适用于MR作业,但是在不完整的配置下以不推荐的方式设置了迷你群集。 Hadoop Wiki有a page on how to develop unit tests,它还解释了如何正确设置迷你群集。

基本上,我按照以下方式进行迷你群集设置:

// 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);

现在,我有conffs我可以用来提交工作和访问HDFS,new Cluster(conf)cluster.getAllJobStatuses按预期工作。

当一切都完成后,要关闭并清理,我打电话:

yarnCluster.stop();
hdfsCluster.shutdown();
FileUtils.deleteDirectory(hdfsBase); // from Apache Commons IO

注意: JAVA_HOME 必须才能设置此功能。在Jenkins上构建时,请确保为默认JDK设置JAVA_HOME。或者,您可以显式声明要使用的JDK,然后Jenkins将自动设置JAVA_HOME

答案 1 :(得分:0)

我这样试过,它对我有用,但它是在提交作业之后

JobClient jc = new JobClient(job.getConfiguration());

  for(JobStatus js: jc.getAllJobs())
  {
    if(js.getState().getValue() == State.RUNNING.getValue())
    {

    }
  }

  jc.close();

或者我们可以从job api获取集群,并且有一些方法可以返回所有作业,作业状态

cluster.getAllJobStatuses();