6.5.2 任务JVM重用
在本章图6-1中可以看出,不论是Map任务还是Reduce任务,都是在TaskTracker节点上的Java虚拟机(JVM)中运行的。当TaskTracker被分配一个任务时,就会在本地启动一个新的Java虚拟机来运行这个任务。对于有大量零碎输入文件的Map任务而言,为每一个Map任务启动一个Java虚拟机这种做法显然还有很大的改善空间。如果在一个非常短的任务结束之后让后续的任务重用此Java虚拟机,这样就可以省下新任务启动新的Java虚拟机的时间,这就是所谓的任务JVM重用。需要注意的是,虽然一个TaskTracker上可能会有多个任务在同时运行,但这些正在执行的任务都是在相互独立的JVM上的。TaskTracker上的其他任务必须等待,因为即使启用JVM重用,JVM也只能顺序执行任务。
控制JVM重用的属性是mapred.job.reuse.jvm.num.tasks。这个属性定义了单个JVM上运行任务的最大数目,默认情况下是1,意味着每个JVM上运行一个任务。可以将这个属性设置为一个大于1的值来启用JVM重用,也可以将此属性设为-1,表明共享此JVM的任务数目不受限制。