Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用新的API以编程方式获取Hadoop集群中所有正在运行的作业?_Java_Hadoop - Fatal编程技术网

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

Java 如何使用新的API以编程方式获取Hadoop集群中所有正在运行的作业?,java,hadoop,Java,Hadoop,我有一个向Hadoop提交乔布斯先生的软件组件。我现在想在提交之前检查是否有其他作业正在运行。我发现在新的API中有一个Cluster对象,可以用来查询集群中运行的作业,获取它们的配置并从中提取相关信息。然而,我使用这个有问题 只需执行newcluster(conf)即可,其中conf是一个有效的配置,可用于访问此集群(例如,向其提交作业),使对象未配置,Cluster的getAllJobStatuses()方法返回null 从配置中提取mapreduce.jobtracker.address,

我有一个向Hadoop提交乔布斯先生的软件组件。我现在想在提交之前检查是否有其他作业正在运行。我发现在新的API中有一个
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