我知道我们可以设置属性" mapred.job.reuse.jvm.num.tasks"重用JVM。我的问题是:
(1)如何决定在这里设置的任务数,-1或其他一些正整数?
(2)在mapreduce作业中已经重用JVM并将此属性设置为-1是一个好主意吗?
非常感谢!
答案 0 :(得分:20)
如果你有非常小的任务肯定是在彼此之后运行,那么将此属性设置为-1很有用(这意味着生成的JVM将无限次重复使用)。 所以你只是产生(你的集群中的任务可用于你的工作)-JVMs而不是(任务数量)-JVMs。
这是一项巨大的性能提升。在长时间运行的作业中,比较设置新JVM的运行时百分比非常低,因此它不会给您带来巨大的性能提升。
同样在长时间运行的任务中,最好重新创建任务流程,因为堆碎片等问题会降低性能。
此外,如果你有一些中期运行的工作,你可以重复使用2-3个任务,并进行良好的权衡。
答案 1 :(得分:1)
JVM重用(仅在MR1中可能)应该有助于提高性能,因为它消除了JVM的启动延迟,但它只是边缘化并且带来许多缺点(读取副作用。大多数任务将运行很长时间(当你查看那些任务运行时间时,几十秒甚至几分钟)和启动时间不是问题。你想在一个干净的平板上开始一个新任务。当你重新使用一个JVM时,有可能堆不是完全干净的(它是从以前的运行中分散的。)碎片可以导致更多的GC并使所有的启动时间增加无效。如果有内存泄漏,它也可能影响内存使用等。所以最好开始任务的新JVM(如果任务不是很小)。在MR2(YARN)中 - 总是为任务启动新的JVM。对于Uber任务 - 它将仅在本地JVM中运行任务。