如何在多核8节点集群中安排Hadoop Map任务?

时间:2012-04-29 15:47:21

标签: hadoop mapreduce cloudera

我有一个“仅限地图”(没有减少阶段)计划。输入文件的大小足以创建7个map任务,我已经通过查看生成的输出(part-000到part006)验证了这一点。现在,我的集群有8个节点,每个节点有8个内核和8 GB内存,并在头节点托管共享文件系统。

我的问题是,我可以选择仅在1个节点中运行所有7个映射任务,还是在7个不同的从属节点中运行7个映射任务(每个节点1个任务)。如果我可以这样做,那么我的代码和配置文件需要进行哪些更改。

我尝试在我的代码中将参数“mapred.tasktracker.map.tasks.maximum”设置为1和7,但我没有发现任何明显的时差。在我的配置文件中,它设置为1。

3 个答案:

答案 0 :(得分:4)

"mapred.tasktracker.map.tasks.maximum"处理应在每个节点上启动的地图任务的数量,而不是每个地图任务要使用的节点数。在Hadoop架构中,每个节点(从站)有1个tasktracker,主节点(master)上有1个作业跟踪器。因此,如果设置属性mapred.tasktracker.map.tasks.maximum,它将仅更改每个节点要执行的映射任务的数量。 "mapred.tasktracker.map.tasks.maximum"的范围是1/2*cores/node2*cores/node

您应该使用setNumMapTasks(int)

设置整体所需的地图任务数

答案 1 :(得分:1)

  

现在,我的群集有8个节点,每个节点有8个内核和8 GB内存,并在头节点托管共享文件系统。

当您说共享文件系统托管头节点时,您是说数据是托管在HDFS上,还是托管在每个节点上安装的某些NFS文件系统上?我猜你的意思是HDFS,但如果你使用的是NFS或类似的东西,那么你应该期望看到更高的HDFS吞吐量(你希望将处理代码移动到数据,而不是将数据移动到处理机器上) )

您的输入文件有多大,它的分割大小,文件格式(文本,序列等),复制因子和压缩方法是什么?

根据上述问题的答案,使用8x8设置,如果减少地图分割大小并提高复制系数,则可能会获得更好的吞吐量。

答案 2 :(得分:1)

如果可能的话,你肯定应该在7个不同的节点上运行7个map任务。 MapReduce的全部优势是能够并行化您的计算,以便每项任务尽可能高效地运行。如果在一个节点上运行了7个映射任务,则每个任务将在该单个节点上竞争相同的资源(RAM,CPU,IO)。

mapred.tasktracker.map.tasks.maximum的标准设置是每个核心一个,因此您可以将设置更改为8。

此外,如果您有一个仅限地图的作业,您需要一个很好的理由将地图集的数量设置为特定数量。设置地图任务的数量只是对作业跟踪器“运行”有多少地图的“提示”,但这最终由作业跟踪器根据DFS如何存储输入数据来决定。 This wiki has more details.

但是,您确实希望在某些情况下控制reduce任务的数量。例如,如果我想要一个已排序的数字列表,我希望确保所有数据都通过单个reducer传递。

相关问题