2012-05-07 99 views
12

我知道我們可以設置屬性「mapred.job.reuse.jvm.num.tasks」來重用JVM。我的問題是:在Hadoop mapreduce作業中重用JVM

(1)如何確定要設置的任務數量,-1或其他一些正整數?

(2)它已經重新使用的JVM,並且此屬性設置爲-1 MapReduce作業的價值是一個好主意?

非常感謝!

回答

19

如果有,是經過對方肯定是運行非常小的任務,它是有用的這一屬性設置爲-1(意思是催生了JVM將被重用無限次)。 所以你只是產卵了(羣集中任務可用於你的工作的數量)-JVM而不是(任務數量)-JVM。

這是一個巨大的性能改進。在長時間運行的作業中,運行時比較設置新JVM的百分比非常低,所以它不會給你帶來巨大的性能提升。

同樣在長時間運行的任務中,重新創建任務進程是很好的,因爲諸如堆碎片之類的問題會降低性能。

此外,如果你有一些中期時間運行的作業,你可以只重用的任務2-3,具有很好的權衡。

+0

如果您啓用超級任務,可以映射器並減少共享相同的JVM嗎?還是像映射器可以共享相同的JVM和reducer可以共享相同的JVM? – MikA

1

JVM重用(僅在MR1可能)應該表現幫助,因爲它消除了JVM的啓動滯後,但它僅僅是邊緣的,自帶的一些缺點(讀副作用。大多數任務會很長時間運行(幾十秒甚至幾分鐘)和啓動時間並不是問題,當你看到這些任務運行時間時,你想在乾淨的平板上開始一個新的任務,當你重新使用JVM時,有可能堆不是完全乾淨的(這是從前面的運行中分割出來的),碎片會導致更多的GC,並且使所有啓動時間增加無效,如果存在內存泄漏,它也可能影響內存的使用等等。爲這些任務啓動一個新的JVM(如果這些任務不是很小)在MR2(YARN)中 - 新的JVM總是爲這些任務啓動,對於Uber任務 - 它只會在本地JVM中運行任務

相關問題