Java Hadoop';s TaskTracker为每个任务生成一个新的JVM?

Java Hadoop';s TaskTracker为每个任务生成一个新的JVM?,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,根据,TaskTracker生成了一个新的JVM来完成它正在跟踪的实际工作。但是,页面中有一个输入错误,不清楚TaskTracker是否为所有正在跟踪的任务生成一个JVM,或者TaskTracker是否为每个正在跟踪的任务生成一个JVM。我之所以问这个问题,是因为我很好奇,使用静态变量来保存作业级变量是否有利于在map函数中简单地实例化一个变量。它为每个任务生成一个JVM 您可以通过设置以下配置参数来重用jvm:mapred.job.reuse.jvm.num.tasks,但这只是为了减少jvm

根据,TaskTracker生成了一个新的JVM来完成它正在跟踪的实际工作。但是,页面中有一个输入错误,不清楚TaskTracker是否为所有正在跟踪的任务生成一个JVM,或者TaskTracker是否为每个正在跟踪的任务生成一个JVM。我之所以问这个问题,是因为我很好奇,使用静态变量来保存作业级变量是否有利于在map函数中简单地实例化一个变量。

它为每个任务生成一个JVM

您可以通过设置以下配置参数来重用jvm:
mapred.job.reuse.jvm.num.tasks
,但这只是为了减少jvm启动时间。在功能上,它仍然会重建类,因此这对您来说并不重要

如果变量相对较小,比如字符串或其他东西,您不应该太担心。如果它更大,你会开始担心!例如,从分布式缓存将一个大文件加载到
Map
中,每个任务加载一次,总的来说成本可能会很高。您可以通过让更少的映射任务为每个任务做更多的工作来缓解这一问题。我甚至做过疯狂的事情,比如在Redis或ZooKeeper中存储共享变量