在Hadoop mapreduce作业中重用JVM



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

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

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

谢谢!

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新