簡體   English   中英

您如何在Hadoop中獲得JobTracker的實例?

[英]How do you get an instance of the JobTracker in Hadoop?

我知道這一定很簡單,但是我無法弄清楚如何獲取Hadoop JobTracker的實例。 在意識到我無法調用任何構造函數之后,我試圖像這樣在實例化作業之后實例化它:

  JobClient client = new JobClient(conf);
  RunningJob runningJob = client.submitJob(conf);    
  JobTracker jobTracker = JobTracker.startTracker(_conf);

如果我把jobTracker行刪掉,程序運行正常。 當我把它留在里面時,我得到一個例外,說該JobConf已經存在JobTracker。

有誰知道我應該如何獲得JobTracker的實例? 我目前正在使用hadoop 1.2.1。

編輯:我認為我得到的異常是因為JobTracker試圖在已經有JobTracker監聽的端口上啟動。 我可以在其他端口上啟動JobTracker進行測試運行,但隨后我的Hadoop集群將有2個JobTracker,這不是應該的運行方式。 我很想嘗試在啟動自己的JobTracker之前先停止現有的JobTracker(這完全是在測試環境中,如果與其他Jobs共享系統,這將是不可行的),但這似乎是走錯了路。

您不會在客戶端代碼中創建JobTracker的實例,已經創建的JobClient具有可用於與正在運行的JobTracker交互的所有方法(在該位置,通過調用SubmitJob提交作業)。

編輯

不幸的是,無法通過客戶端API獲得成功的任務主機名-令人沮喪的是您可以通過命令行執行此操作,但是它使用私有API調用,因此,如果要調用此命令,還需要執行一些字符串抓取操作,然后解析標准輸出(並且您還將獲得任務設置和清除事件):

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 

一種選擇是使用一些基於反射的黑客手段,使私有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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM