13

我知道我们可以设置属性“mapred.job.reuse.jvm.num.tasks”来重用JVM。我的问题是:

(1)如何决定这里要设置的任务数,-1还是其他一些正整数?

(2) 在 mapreduce 作业中重用 JVM 并将该属性设置为 -1 是个好主意吗?

非常感谢你!

4

2 回答 2

23

如果您有非常小的任务肯定会在彼此之后运行,则将此属性设置为 -1 很有用(这意味着生成的 JVM 将被无限次重用)。因此,您只需生成(集群中可用于您的作业的任务数)-JVM,而不是(任务数)-JVM。

这是一个巨大的性能改进。在长时间运行的作业中,与设置新 JVM 相比,运行时的百分比非常低,因此它不会给您带来巨大的性能提升。

同样在长时间运行的任务中,最好重新创建任务进程,因为堆碎片等问题会降低您的性能。

此外,如果您有一些中期运行的作业,您可以只重用 2-3 个任务,这是一个很好的权衡。

于 2012-05-07T17:22:30.663 回答
1

JVM 重用(仅在 MR1 中可能)应该有助于提高性能,因为它消除了 JVM 的启动滞后,但它只是微不足道的并且有许多缺点(读取副作用。大多数任务将运行很长时间(数十秒)甚至几分钟)和启动时间都不是问题,当您查看这些任务运行时间时。您想在干净的情况下启动新任务。当您重用 JVM 时,堆可能不完全干净(它是从之前的运行中产生的碎片)。碎片会导致更多的 GC 并抵消所有启动时间增益。如果存在内存泄漏,它也会影响内存使用等。所以最好启动一个新的 JVM对于任务(如果任务不是相当小)。在 MR2(YARN)中 - 总是为任务启动新的 JVM。对于 Uber 任务 - 它只会在本地 JVM 中运行任务。

于 2015-10-13T20:07:12.457 回答