我知道这一定很简单,但我无法弄清楚如何获取Hadoop JobTracker的实例。在意识到我无法调用任何构造函数之后,我试图在提交作业后将其实例化为:
JobClient client = new JobClient(conf);
RunningJob runningJob = client.submitJob(conf);
JobTracker jobTracker = JobTracker.startTracker(_conf);
如果我把jobTracker换行,程序运行就好了。当我离开时,我得到一个例外,说JobTracker已存在于该JobConf。
有谁知道我应该如何获得JobTracker的实例?我目前正在使用hadoop 1.2.1。
编辑: 我认为我得到的例外是因为JobTracker试图在已经有JobTracker监听的端口上启动。我可以在我的测试运行的不同端口上启动JobTracker,但是我的Hadoop集群有2个JobTrackers,而不是它应该如何运行。我很想在启动之前尝试停止现有的JobTracker(这完全在测试环境中,如果系统与其他作业共享,这将不可行),但这似乎走错了路。
答案 0 :(得分:1)
您不在客户端代码中创建JobTracker的实例,您已创建的JobClient具有可用于与正在运行的JobTracker进行交互的所有方法(通过调用将作业提交到的位置)提交工作。
修改强>
不幸的是,通过客户端API无法获取成功的任务主机名 - 令人沮丧的是,您可以通过命令行执行此操作,但它使用私有API调用,因此如果您要调用,仍需要执行一些字符串抓取这个命令然后解析stdout(你还将获得任务设置和清理事件):
user@host1:~$ /opt/hadoop/default/bin/hadoop job -events job_201311110747_0001 0 100
Task completion events for job_201311110747_0001
Number of events (from 0) are: 4
SUCCEEDED attempt_201311110747_0001_m_000002_0 http://host1:50060/tasklog?plaintext=true&attemptid=attempt_201311110747_0001_m_000002_0
SUCCEEDED attempt_201311110747_0001_m_000000_0 http://host2:50060/tasklog?plaintext=true&attemptid=attempt_201311110747_0001_m_000000_0
SUCCEEDED attempt_201311110747_0001_r_000000_0 http://host3:50060/tasklog?plaintext=true&attemptid=attempt_201311110747_0001_r_000000_0
SUCCEEDED attempt_201311110747_0001_m_000001_0 http://host4:50060/tasklog?plaintext=true&attemptid=attempt_201311110747_0001_m_000001_0
一个选项可能是使用一些基于反射的hackery来使私有API公开可见,然后根据需要使用 - 这里的参考是你需要在代码中复制上面的API调用(这可能不是向前或向后兼容使用不同版本的Hadoop - 这里是1.2.1):
public class JobClientDriver extends Configured implements Tool {
public static void main(String args[]) throws Exception {
ToolRunner.run(new JobClientDriver(), args);
}
@Override
public int run(String[] args) throws Exception {
Configuration conf = getConf();
JobClient client = new JobClient(new JobConf(conf));
Method method = JobClient.class.getDeclaredMethod("createRPCProxy", InetSocketAddress.class,
Configuration.class);
method.setAccessible(true);
Object rpcClientSubProtocol = method.invoke(client, JobTracker.getAddress(conf), conf);
Method completeEventsMethod = rpcClientSubProtocol.getClass().getDeclaredMethod("getTaskCompletionEvents",
JobID.class, int.class, int.class);
for (Object tceObj : ((Object[]) completeEventsMethod.invoke(rpcClientSubProtocol,
JobID.forName("job_201311110747_0001"), 0, 100))) {
TaskCompletionEvent tce = (TaskCompletionEvent) tceObj;
if (tce.isMapTask()) {
URI uri = new URI(tce.getTaskTrackerHttp());
System.err.println(tce.getTaskAttemptId() + " @ " + uri.getHost());
}
}
return 0;
}
}