每个Map都有自己的线程吗?

时间:2013-12-01 20:38:07

标签: mapreduce

每个地图都有自己的线程吗?那么,当我们进行拆分时,我们应该将任务拆分为与可用处理器一样多的Map功能?或者还有其他一些方法,除了线程,我们可以并行运行地图函数?

1 个答案:

答案 0 :(得分:2)

我假设您正在谈论hadoop mapreduce实现。另外,我假设您正在谈论核心工作负载。

对于介绍,给定作业的地图任务数量是从输入数据拆分的数量中导出的。然后,这些任务被安排到启动映射器的任务节点,每个节点最多mapred.tasktracker.map.tasks.maximum。该配置参数可以针对不同节点而不同,例如在计算能力不同的情况下。我将在SO上添加一个关于其他答案的插图:

map tasks flow

默认情况下,mappers在不同的JVM中运行,并且可以在节点上的任何特定实例上运行多个JVM,最多mapred.tasktracker.map.tasks.maximum。为每个起始映射任务重新创建这些JVM,或者可以reused  连续几次运行。不会详细介绍,但由于内存碎片和JVM实例开销之间的权衡,此设置也会影响性能。

继续您的问题,运行JVM加载的核心数量由底层操作系统控制,它可以平衡负载和优化计算。如果可能的话,可以期望不同的JVM将在不同的核上执行。如果映射器的数量在一般情况下超过核的数量,则可以预期性能降低。 我倾向于使用后者不适用的用例。

一个例子:

  

假设您在100个地图任务中分配了作业,要在2个任务节点上运行,每个节点有2个cpu单元,mapred.tasktracker.map.tasks.maximum等于2.然后,大部分时间(等待映射器等待启动时​​除外) )你的100个元素任务将在给定时间执行4,从而导致(平均)每个节点完成50个任务。

最后,但并非最不重要。对于映射器任务,通常不要将CPU作为瓶颈,而是IO。在这种情况下,通过CPU上的许多小型机器与CPU上的一些服务器相比,获得更好的结果并不罕见。