Map减少Mapper和Reducer Intra Parallelism

时间:2016-11-14 01:17:52

标签: multithreading mapreduce

为了清楚起见,提出了这些问题,因为硬件有许多资源可供我们想要提高吞吐量,并且还基于我在各种论坛中对这些主题的讨论:

  1. 如果我有,比如10个正在运行的Mapper,这是指仅一个线程,还是N个线程能够处理给定的Split?我不确定文本,但我认为这是可能的和案例。
  2. 对于Reducer,我读到它可以并行处理Keys。我认为这意味着内部减速器,因此N个线程可以并行处理N个密钥。
  3. Reducer中的N个线程是否可以进一步细分?例如。在少数键的长列表中找到最大值是可行的,例如,找到密钥的最大值。或者这不是这样吗?
  4. 如果我对Reducers的假设是正确的,那么这意味着很少使用Reducers和偏斜不是一个问题,或者错误设计的Custom Partitioners并不是那么糟糕。但是提出这种讨论的事实意味着我需要检查这些假设。

1 个答案:

答案 0 :(得分:1)

以下几点可能会有所帮助。

首先,任何程序中的映射器数量等于数据的分割数量,每个映射器在分配给它的一个分割上工作。尝试在分割可用的同一节点中调用映射器。这称为数据的局部性。

任何作业的reducer数等于该作业的分区数。每个映射器的输出都被分隔到分区中,每个分区桶的每个键和值列表都被发送到分配给该分区的reducer。

在每个节点上,Mapreduce框架可能在其级别实现线程,可以使用加速的gpu或cpu进行线程化。这可能是可能的。但是,在大图上运行的并行性是并行运行在不同节点上的映射器和缩减器。

Hadoop允许用户指定要在地图输出上运行的组合器函数,组合器函数的输出形成reduce函数的输入。由于组合器功能是一种优化,因此Hadoop无法保证为特定的地图输出记录调用它的次数(如果有的话)。换句话说,调用组合器函数零,一次或多次应该从reducer产生相同的输出。组合器函数通常是reduce函数。

示例是否在映射器的输出上使用了合并器 如果第一个映射器输出就像

(1950,0)

(1950,10)

(1950,20)

和第二个映射器输出

(1950,23)

(1950,30)

然后使用

调用reduce函数

(1950,[20,30])