我有一個作業池,從中檢索作業並啓動它們。該模式是這樣的:Hadoop重用作業對象
Job job = JobPool.getJob();
job.waitForCompletion();
JobPool.release(job);
我得到一個問題,當我嘗試重用一個作業對象在某種意義上說,它甚至不運行(最有可能是因爲它的狀態:已完成)。因此,在下面的片段中,第二個waitForCompletion
調用打印作業的統計/計數器,並且不執行任何其他操作。
Job jobX = JobPool.getJob();
jobX.waitForCompletion();
JobPool.release(jobX);
//.......
Job jobX = JobPool.getJob();
jobX.waitForCompletion(); // <--- here the job should run, but it doesn't
我說得對不對,當我說,工作實際上並沒有運行,因爲Hadoop的看到其狀態爲已完成,並沒有事件嘗試運行呢?如果是的話,你知道如何重置一個作業對象,以便我可以重用它嗎?
爲什麼你需要重用它?爲什麼不創建新的對象? – octo
@ octo:一旦算法啓動,可避免創建作業的開銷。 而且也避免創造太多的工作(甚至認爲這也可以通過其他方式確保)。所以第一個原因是主要原因。我的印象是創建一個Job對象並初始化它是一個耗時的過程。 – Razvan
我認爲你完全錯了。由於jobtracker和你的客戶之間的溝通,作業初始化是非常耗時的過程。你不能重用作業,因爲每個作業都會收到唯一的ID – octo