2011-07-24 47 views
2

任何人都知道如果org.apache.hadoop.mapreduce.Job是線程安全的?在我的應用程序中,我爲每個作業創建一個線程,然後waitForCompletion。我還有另一個監視器線程,用isComplete檢查每個作業的狀態。hadoop的工作ThreadSafe?

安全嗎?工作是否線程安全?文檔似乎沒有提到任何關於它...

感謝 烏迪

回答

3

不像別人,我也使用線程並行提交作業,並等待其完成。你只需要使用每個線程的作業類實例。如果您通過多個線程共享相同的作業實例,則必須親自處理同步。

+0

謝謝@Thomas,我認爲是這樣的... – Udi

+0

您是否在使用調度程序來運行parralel作業? –

+0

@David Grunzman是的,它是石英和依賴工作鏈的混合物,其中一些可以並行運行,所以我將它們並行提交。 –

0

爲什麼你想要寫爲每個作業一個單獨的線程?你的用例到底是什麼?

您可以在Hadoop集羣中運行多個作業。你有多個工作之間的依賴關係嗎?

假設您有10個工作正在運行。 1工作失敗,那麼你需要重新運行9個成功的任務。

最後,作業服務器將採取Hadoop集羣上調度多個作業的照顧。如果你沒有依賴關係,那麼你不應該擔心線程安全。如果你有依賴關係,那麼你可能需要重新考慮你的設計。

+0

我使用Job.waitForCompletion()。此方法是IO塊直到完成完成。如果我在單個線程中運行所有內容,線程將運行串行而不是並行... – Udi

+0

您將作業與任務混淆。 –

-1

如果要檢查作業是否完成,我認爲你是一個有點困惑地圖如何減少工作。您應該讓Hadoop爲自己做到這一點。

+1

我不同意。就我而言,我有一個組件,它可以一個接一個地在一個流中運行多個作業,並且對於某些作業,如果特定作業失敗,我想停止處理(結束 - 2 - 端)運行。 另一種情況是有REST服務,讀取HBase的表幾作業的狀態信息,並有權調用自定義Hadoop的代碼,以檢查是否有特定的job_id作業已finnished - 否則沒有狀態信息在HBase的表堅持呢。 – Zec

0

是它們實際上..中的文件塊被分割,並且每個塊被獨立的節點上執行。所有地圖任務並行運行,然後在完成之後將其送入減速器。正如你在多線程程序中所想到的那樣,不存在同步問題。在多線程程序中的所有線程都在同一個盒子運行,因爲它們共享一些數據,你必須將它們同步

0

以防萬一你需要另一種並行的在地圖上的任務級別,您應該重寫運行( )方法在你的映射器中,並在那裏使用多個線程。默認實現調用setup(),然後map()乘以要處理的記錄數,最後調用cleanup()方法一次。

希望這可以幫助別人!