2012-10-15 110 views
0

我有一個作業池,從中檢索作業並啓動它們。該模式是這樣的: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的看到其狀態爲已完成,並沒有事件嘗試運行呢?如果是的話,你知道如何重置一個作業對象,以便我可以重用它嗎?

+1

爲什麼你需要重用它?爲什麼不創建新的對象? – octo

+0

@ octo:一旦算法啓動,可避免創建作業的開銷。 而且也避免創造太多的工作(甚至認爲這也可以通過其他方式確保)。所以第一個原因是主要原因。我的印象是創建一個Job對象並初始化它是一個耗時的過程。 – Razvan

+0

我認爲你完全錯了。由於jobtracker和你的客戶之間的溝通,作業初始化是非常耗時的過程。你不能重用作業,因爲每個作業都會收到唯一的ID – octo

回答

1

Javadoc包括這暗示該作業應該只運行一次

的設置方法只有工作,直到提交作業,之後他們將拋出IllegalStateException。

我認爲這項工作和工作的看法存在一些混淆。後者是你擁有的東西,它的目的是映射到最多一個在hadoop中運行的作業。這份工作的觀點從根本上說是輕量級的,如果創建這個對象相對於實際運行工作而言是昂貴的......呃,我必須相信你的工作很簡單,你不需要hadoop。

使用視圖提交作業可能很昂貴(將jar複製到集羣中,初始化JobTracker中的作業等等);從概念上講,告訴jobtracker「重新運行」或「複製;運行」的想法是合理的。據我所知,在實踐中不支持這兩種觀點。我懷疑hadoop實際上並不保證可以支持任何用例的保留策略。