我有一个软件组件,可以将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。
我在这里缺少什么?如何以编程方式获取正在运行的作业?
答案 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);
现在,我有conf
和fs
我可以用来提交工作和访问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();